![ba66b45034aedff7a5a6e684558be65a.png](https://img-blog.csdnimg.cn/img_convert/ba66b45034aedff7a5a6e684558be65a.png)
CNN中的卷积操作
卷积层是CNNs网络中可以说是最重要的层了,卷积层的主要作用是对输入图像求卷积运算。如下图所示,输入图片的维数为[c_0,h_0,w_0] ;卷积核的维数为[c_1,c_0,h_k,w_k],其中c_0在图中没有表示出来,一个卷积核可以看成由c_1个维数为[c_0,h_k,w_k]的三维滤波器组成;除了这些参数通常在计算卷积运算的时候还有一些超参数比如:stride(步长):S,padding(填充):P。
根据上面所说的参数就可以求出输出特征的维数为[c_1,h_1,w_1],其中
h_1 = (h_0-h_k+2P)/S+1,
w_1 = (w_0-w_k+2P)/S+1。
![d3db0447468382555e41f0cdb7eb3b23.png](https://img-blog.csdnimg.cn/img_convert/d3db0447468382555e41f0cdb7eb3b23.png)
卷积的计算过程其实很简单,但不是很容易说清楚,下面通过代码来说明。
基本环境设置:
%load_ext cython #代码运行在jupyter-notebook中import matplotlib.pyplot as pltimport numpy as np%matplotlib inlineplt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plotsplt.rcParams['image.interpolation'] = 'nearest'plt.rcParams['image.cmap'] = 'gray'
卷积层计算的代码如下,想象一副图像尺寸为MxM,卷积核mxm。在计算时,卷积核与图像中每个mxm大小的图像块做element-wise相乘,然后得到的结果相加得到一个值,然后再移动一个stride,做同样的运算,直到整副输入图像遍历完,上述过程得到的值就组成了输出特征,具体运算过程还是看代码。
def conv_forward_naive(x, w, b, conv_param):
out = None
stride = conv_param['stride']
pad = conv_param['pad']
N, C, W, H = x.shape
F, C, HH, WW = w.shape
H_out = 1 + (H + 2 * pad - HH) / stride
W_out = 1 + (W + 2 * pad - WW) / stride
npad = ((0,0), (0,0), (pad,pad), (pad,pad))
x_pad = np.pad(x, pad_width=npad, mode='constant