深度学习在图像应用的非常信赖于卷积层 (Convolutional layer) 的应用. 本文介绍其在 Caffe 中是如何实现的.

Convolution

卷积的运算过程如下图所示:

一种实现方式是按直观的理解, 写4层循环, 效率比较低; 另外是将卷积转换为矩阵乘法, 利用 cublas, openblas 等开源库来实现矩阵运算; 最后一种是利用傅里叶变换, 将实域的卷积转换为傅里叶域的乘积. 但如果 stride 是否就不可行了?

Caffe 中使用了第二种算法.

Figure: 见草稿

W(chkernel) x I (kernelconv-out) -> F(ch*conv-out)

im2col

im2col turn image to (kernel*conv-cout)

如何将卷积转换为矩阵乘法? 在转换时如何处理 padding, stride, dialation?

Backward

如何理解参数更新? Backward 对应的误差敏感项的计算以及参数梯度的计算.

关键点还是后向传播: 误差敏感项的计算公式

$$ \sigma^{l}=h'\cdot{}W^T\sigma^{l+1} $$

正向过程中, input 和 output 是如何连接的? 如图所示, 将这种连接反向, 连接还是一一对应的, 只不过计算形式变化, 反向也可以抽象为卷积, 不过卷积核是转置的.

但是在实现中, 因为已经将卷积转换为矩阵乘法, 则计算误差敏感项直接使用矩阵乘法即可.

GEMM

对比 matlab conv full, valid

如何与 matlab 中的 conv full, valid 对应?

Deconvolution

???

卷积中 forward 和 backward 映射关系是一致的, 现在需要做 upsampling, 则把卷积中的 backward 当作 forward 来使用即可.

程序验证: 原图像插入0值再 convolution 等价于使用 transposed convolution.

caffe refactor

redit which specify: tensor flow, torch, and theona implementations.

exchange

怎么理解两层之间的联系:

conv-arithmatic

deconvolutional network feature generation, using alternative update.

Group parameter https://github.com/BVLC/caffe/issues/778