深度学习框架的搭建(二)

半城伤御伤魂 提交于 2019-12-06 13:39:46

深度学习框架的搭建(1):https://blog.csdn.net/ustb_liu/article/details/83865866

继续深入考虑之前所述的几个过程,由粗到细:

0、预定义模型及加载:有了loadmodel 和 layer的概念

loadmodel的输入是一个模型文件,结果是建立一个网络,就叫Net吧。那么Net具体都应该包含什么呢?它应该包含各个层layer,以及各layer之间的关系即数据通路,当然要综合考虑前向和后向的数据通路;那么各个层的最终加载结果应该是什么?应该包含超参数的设置,数据的来源,更确切的说是输入数据的首地址以及确定的格式、大小,如果层内部有参数,要确定其数据存储的首地址以及格式、大小,最后是输出数据的首地址、格式、大小。

怎样通过一个模型文件得到这些结果呢?

(1)要将模型文件加载到内存;

(2)要对模型文件parse,parse的结果是先建立层间关系图即一个出度图即邻接表,然后建立一个入度图即逆邻接表;而其中的各个层本身的信息,需要根据层的不同类型,建立相应的数据结构存储其相应的参数;叫layerparameter类比较合适。

(3)以上的信息都还是比较虚,只能算是设置类/概念类,因为还没有真正的分配内存,所以要根据这些设置类建立真正的实体类。所以要对每一个layer,根据其设置,设置参数,分配内存。比如说一个conv类,要有bottom vector和top vector设置input和output数据,属性要包含超参数,要维护一个卷积核的数组。所有的属性都要在这个阶段初始化。这些都是layer类的内容。

 

1.数据加载

dataio的结果是加载一个tensor4到内存,它的格式应该是 N C H W的。

而一个conv层内部的参数,其实也是4维N C H W形式的,只不过N代表的是卷积核的个数,每一个卷积核对应不同的channel,都是一个二维的。

计算的结果很明显也是 N C H W格式的。

不妨把所有这些数据统一称为blob,这里blob的定义就是满足 N C H W格式的数据。

至于怎么从数据库中读取到一个batch的input blob,暂时不管。

 

2.模型训练:分为两个过程

(1)forward:

可以表达为 Out(n) = f( out(n-1) ... out(1) input  )

比如conv:Out(n) = conv( out(n-1) ,blob_layer_n),即blob_out_n = conv( blob_out_n-1, blob_layer_n  )

(2)backward:

简单地,可以表示为

所以,要分几步计算,

,在计算之前要先分配内存空间;

 

3.模型输出

暂时不管。

 

未完待续。水平有限,敬请指正。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!