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

深度学习框架的搭建(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:

简单地,可以表示为\tiny \frac{\partial loss}{\partial w_{n,i}} = \sum_{j=1}^{m}\frac{\partial loss}{\partial out_{n,j}}\cdot \frac{\partial out_{n,j}}{\partial w_{n,i}}

所以,要分几步计算,\tiny (1)\frac{\partial loss}{\partial out_{k,j}} (2)\frac{\partial loss}{\partial w_{k,i}} (3)\Delta w_{k,i},在计算之前要先分配内存空间;

 

3.模型输出

暂时不管。

 

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值