想了解的问题
1 Blob的基本结构
2 实际应用的时候,各种类型的层 对应的实例Blob 长什么样
Blob内部其实包含两个存储对象data_
和diff_
,前者存储前向传递的数据,后者存储反向传递的梯度
Blob的定义如下
protected:
shared_ptr<SyncedMemory> data_;
shared_ptr<SyncedMemory> diff_;
vector<int> shape_;
int count_;
int capacity_;
1 data 里边存储的是 w,b的当前值
2 diff里存储的是 w,b的导数 * 学习率(将来更新的时候,直接矩阵相减就行了)
3 shape 记录了 Blob的形状 N*C*W*H
4 count 是shape的累乘
5 表示 当前Blob的元素个数(?)
那么在具体的层 都是如何存储的呢
每个layer 会 有个Blob 类型的向量 成员变量来存储 分别存储W,b
输入层 :1000幅640*480 RGBD图像数据,其Blob形状为(1000, 4, 480, 640)
data:存储的就是原始的像素点
diff: null
卷积层: 96个大小11*11的滤波核,处理16通道的输入数据,w对应的Blob的形状为(96,16,11,11),对应的blob的形状(96,16,1,1)
data: 存储的就是 对应 的w(因为卷积核 是待训参数)
diff: 存储的是 w'*lr
[疑问? 不是说 共享权重吗]
权值共享: 96表示每张图想要训练96个核, 16 表示前层输入是16张图,每个核大小为 11*11,这种共享是一张图内的 各个局部感受野 共享
全连接层: 1000个输出,1024个输入的全连接层,其参数Blob的形状为(1000,1024)。
data: 存储的是w
diff: w'*lr
权值更新 :
bottom top
Forward: (目标是为了 得到cost 或者 是 分类)
bottom - > Forward(当前层的w,b 规则) -> top
Backward:(目标是更新权值)
bottom -> Backward(当前层的w,b 规则) -> top (BP1,BP2)
同时更新 w,b (BP3,BP4)
http://imbinwang.github.io/blog/inside-caffe-code-blob
http://blog.163.com/yuyang_tech/blog/static/2160500832015713105052452/