深度学习在图像应用的非常信赖于卷积层 (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.
redit which specify: tensor flow, torch, and theona implementations.
怎么理解两层之间的联系:
deconvolutional network feature generation, using alternative update.
Group parameter https://github.com/BVLC/caffe/issues/778