CNN介绍
卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
卷积神经网络(Convolutional Neural Networks / CNNs / ConvNets)与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。
所以哪里不同呢?卷积神经网络默认输入是图像,可以让我们把特定的性质编码入网络结构,使是我们的前馈函数更加有效率,并减少了大量参数。
卷积神经网络利用输入是图片的特点,把神经元设计成三个维度 : width, height, depth(注意这个depth不是神经网络的深度,而是用来描述神经元的) 。比如输入的图片大小是 32 × 32 × 3 (rgb),那么输入神经元就也具有 32×32×3 的维度。一个卷积神经网络由很多层组成,它们的输入是三维的,输出也是三维的,有的层有参数,有的层不需要参数。下面是图解:
卷积神经网络通常包含以下几种层:
- 卷积层(Convolutional layer),卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
- 线性整流层(Rectified Linear Units layer, ReLU layer),这一层神经的活性化函数(Activation function)使用线性整流(Rectified Linear Units,
ReLU)。 - 池化层(Pooling layer),通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
- 全连接层( Fully-Connected layer), 把所有局部特征结合变成全局特征,用来计算最后每一类的得分。
一个卷积神经网络各层应用实例:

卷积运算
如上图所示,CNN的运算是由三个部分组成的,第一部分原始数据对应的左图, 第二部分滤波器也可以称之为卷积核中间的那个图。第三部对应的是图像的右边代表原始数据和卷积核运算的结果。
im2col操作是用来优化卷积运算,它的核心是将卷积核感受野的转化成一行(列)来存储,优化运算速度,减少内存访问时间。

上面描述的是二维的情况,当三维的时候,示意图如下
im2col 操作示意图:
对于卷积核,将卷积核展开处理:
将输入图像得到的矩阵与卷积核展开后的列做矩阵乘法(可以大批量加速),得到结果后进行col2im操作复原结果:
im2col 代码展示:
def im2col(input_data, filter_h, filter_w, stride=1, pad=0):
"""
Parameters
----------
input_data : 由(数据量, 通道, 高, 长)的4维数组构成的输入数据
filter_h : 滤波器的高
filter_w : 滤波器的长
stride : 步幅
pad : 填充
Returns
-------
col : 2维数组
"""
N, C, H, W = input_data.shape
# 第二步计算输出卷积核的高度和宽度
out_h = (H + 2*pad - filter_h)//stride + 1
out_w = (W + 2*pad - filter_w)//stride + 1
# 填充padiing 只填充H,W维度的
img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))
for y in range(filter_h):
y_max = y + stride*out_h
for x in range(filter_w):
x_max = x + stride*out_w
# y:y_max:stride是指从y到 y_max,每次移动stride
# 一次性取[out_h *stride,out_w *stride]大小的数据,放入新矩阵中
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
# print(col)
# 原来shape是(N,C,filter_h,filter_w,out_h,out_w)
# 在进行组合时,先把横向的所有分块排列好,然后排列不同通道的,最后排列不同高度的
# 即顺序是filter_w --> C --> filter_h
col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)
return col
池化
池化层的实现和卷积层相同,都使用 im2col 展开输入数据。不过,池化的情况下,在通道方向上是独立的,这一点和卷积层不同。

只需对展开的矩阵求各行的最大值,并转换为合适的形状即可,如下图

本文详细介绍了卷积神经网络(CNN)的基本结构和工作原理,包括卷积层、ReLU激活函数、池化层以及全连接层的作用。CNN通过卷积运算和滤波器提取图像特征,im2col操作优化了运算效率。此外,文章还讨论了三维情况下的卷积以及池化的实现方式。
620

被折叠的 条评论
为什么被折叠?



