![66a687d98b9223dfc1331499c4d57826.png](https://i-blog.csdnimg.cn/blog_migrate/77d30fe48861b1dd0bbf411c9913026a.jpeg)
CNN前向传播与反向传播基本原理
参考blog.csdn.netCNN前向传播与反向传播优化
干货|(DL~3)deep learning中一些层的介绍www.zybuluo.com![e6406c6e525858d9ad146e819d7ccc4e.png](https://i-blog.csdnimg.cn/blog_migrate/d161009d69efd3f26fde402c9bb61160.png)
个人理解:
1、对输入图像进行采样,采样尺寸根据filter的尺寸进行设定;
2、将采样后的像素块拉伸为一个列向量;(3*3*3=27)
3、根据步长及filter的size计算出,原图可以分割为多少个patch(像素块);
例如,输入图像的尺寸为7*7,步长为2, 那么在水平方向,可以采集的patch的个数为:
(7-3)/2+1=3, 也等于特征图的宽度;同理,在竖直方向采集的patch个数为3,
那么原始图像被采集了3*3个patch,一个patch的shape=27,所以最后输出矩阵X为27*9维度的向量。
4、计算权重矩阵
对于权重矩阵的个数=filter的个数,Wshape=Fshape,这一点根据卷积的原理就可以知道,
所以W的维度为3*27;
5、输出结果
W×X的维度=(3*27)*(27*9)=3*9,3代表卷积核的个数,9代表原始图像被滑动了多少个patch,最后可以将1*9的列向量重塑为3*3*的patch。
完整代码同步在:
shellyfung/hello-worldgithub.com![5619fad7ca9caa6738ea0258c1f195e5.png](https://i-blog.csdnimg.cn/blog_migrate/af5179b5b7de1c9305564924871ce484.jpeg)
前向传播优化
def conv_forward_naive(x, w, b, conv_param):
stride, pad = conv_param('stride'), int(conv_param('pad'))
N, C, H, W = x.shape
F, C, HH, WW = w.shape
# x_padded = np.pad(x, ((0, 0), (0, 0), (pad, pad), (pad, pad)), mode='constant')
H_new = 1 + (H + 2 * pad - HH) / stride
W_new = 1 + (W + 2 * pad - WW) / stride
H_new = int(H_new)
W_new = int(W_new)
s = stride
out = np.zeros((N, F, H_new, W_new))
# --------------