卷积神经网络是一种常用的深度学习模型,通常用作图像处理方面的任务,如人脸识别、目标识别等。
本文整理了卷积操作、特征图、卷积核的可训练参数等。
- 输入:7*7*3代表一张3通道的图。
- 卷积核心:3*3*3*2。
- 输出:3*3*2,步长是2,2,1,1
解释:其中前三个维度(3*3*3)代表一个卷积核参数,2代表2个核心。(3,3,3)的含义是(w,h,channel),其中channel代表输入的通道数。(3*3*3*2)的含义是(w,h,channel_in,channel_out)。channel_out表示进行卷积运算新生成“图像”的通道数。
卷积的作用是二维滤波,起到特征提取的作用。
卷积输出的结果,可以直接作为下一层卷积的输入,因此卷积生成结果被叫做“特征图”。
本文用了动画实现卷积的方式,用了矩阵哈达玛积,结果求和,再遍历通道。代码如下:
temp +=
np.sum(padding_array[i*2:i*2+3,j*2:j*2+3,channel]*w_0[:,:,channel])
当编写完上面的代码,我就发现实现卷积的代码有问题,优先求哈达玛积 应转化为 矩阵相乘,将二维矩阵转换为一维矩阵。
(1,n)*(n*1)->(1,1)
遍历通道的相加,也转化为一维矩阵。
Sum{(3*3*3)*(3*3*3)}->(1,27)*(27*1)
通过实际编写代码,卷积操作也是矩阵乘法,相比较全连接网络,仅仅是减少了可训练参数。(对比全连接网络实现手写数字识别。)
单层卷积,可训练参数个数: $$whchannel_{in} * channel_{out}$$
本文用最简单的方法实现了卷积操作,并有做优化,写死padding、stride等参数,但是通过编写代码,充分理解了卷积操作。特别希望对卷积不理解的同学,也尝试编写实验代码,一定会对卷积的含义有更深理解。