深度学习框架的搭建(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.模型输出
暂时不管。
未完待续。水平有限,敬请指正。
来源:CSDN
作者:ustb_liu
链接:https://blog.csdn.net/ustb_liu/article/details/83934413