基本概念
- 处理图像分类问题,而诞生的具有一系类特殊操作的神经网络。
- 普通神经网络即由多层(N个神经元)构成。对于图像来说,如果采用普通神经网络将会面临模型参数量巨大的问题。大量的参数会增加巨大训练需求,也容易造成过拟合。同样,过多参数容易使神经网络模型收敛到一个较差的局部极值。
Eg: 对于一副图像,假设大小 1000 ∗ 1000 1000 * 1000 1000∗1000,每一个像素点都是输入。使用普通神经网络,假设有100个神经元,则会产生: 1000 ∗ 1000 ∗ 100 + 100 ≈ 1 0 8 1000 * 1000 * 100 + 100 \approx 10^8 1000∗1000∗100+100≈108 个参数。
- 卷积神经网络的解决办法是采用两种策略:
1.局部连接: 图像具有很强的区域性,某一部分与其周围的像素具有较强的相关性,特征具有相似性,比如:额头、脖子等。因此可以将图像分区域连入不同的神经元,例如每个神经元仅与图像中 10 ∗ 10 10*10 10∗10的局部图像相连接,则参数量为: 10 ∗ 10 ∗ 100 + 100 ≈ 1 0 4 10*10*100+100 \approx 10^4 10∗10∗100+100≈104 。
2.参数共享: 从一整副图像来看,其整体的特征与所有区域相关,例如:人脸图像,每个区域虽有差异但都是脸的一部份,都表示脸。因此所有区域特征又可看成是相似的,所有神经元参数共用,则参数量为: 10 ∗ 10 + 1 = 21 10*10+1 = 21 10∗10+1=21。 - 局部连接和参数共享就构成卷积核(本质就是参数量固定的单个神经元),成为卷积的基本操作,大降低参数量。
基本结构
- 卷积层
- 卷积层的核心即卷积核(参数量固定的单个神经元),通常表示为
N
∗
N
N*N
N∗N的矩阵,在图像上从上到下,从左到右对图像进行计算,得到卷积特征。例如:
3
∗
3
3*3
3∗3卷积核。
- 当然卷积核移动的步长可以任意,步长为2,如下图:
- 此外通过卷积会使图象变小,为了使图象大小不变可以在原图周围添加padding层(通常值为0),添加几层padding需根据卷积核的大小判断。
- 对于多通道输入,不同通道使用卷积核不同,参数不共享,bias共享同一个,但最终的卷积结果为所有通道的和。
若要输出多种结果即多通道,就要使用多组卷结核,这些卷积核之间参数也不共享。
- 输出大小:输入图像大小 N ∗ N N*N N∗N,卷积核大小 m ∗ m m*m m∗m,步长为s,padding为p。公式: ( N − m + 2 p ) / s + 1 (N - m + 2p)/s +1 (N−m+2p)/s+1。
- 参数数目: 卷积核大小 m ∗ m m*m m∗m,输入图像通道數Ci,输出通道数Co。公式: C i ∗ m ∗ m ∗ C o Ci * m * m * Co Ci∗m∗m∗Co。
- 池化层
- 通常有两种池化处理方式(max和average),对于边缘池化核无法覆盖到的,直接选择丢去或者使用padding层扩充。
- 池化核大小通常为2*2、步长为2、不重叠、不补零(边缘未覆盖的就舍去)。用于减少图象尺寸,从而减少计算量。同时也对图像进行特征整合、降低冗余,但也一定程度上损失精度。
- 全连接层
- 就是普通的神经网络层。卷积层的输出展开之后连入全连接层的每一个神经元上。
- 全连接层后不会再有卷积层和池化层。
- 为什么卷积神经网络,在卷积层后面还会加上全连接层呢?
卷积层中的卷积单元是局部视野,它就像我们的眼睛将整个图片每一部分的都特征提取出来。全连接层就像我们的大脑,将卷积层提取的特征结合展开,进行整合处理,做出最后的决策。用机器学习的术语来说:卷积层为“特征提取器”,全连接层为“决策分类器”。
Keras API
- 卷积层:一维卷积:tf.keras.layers.Conv1D、二维卷积:tf.keras.layers.Conv2D、三维卷积:tf.keras.layers.Conv3D。
主要参数:
参数名 | 含义 |
---|---|
filters | 卷积核个数 |
kernel_size | 卷积核大小,需根据数据维度 |
strides | 步长 |
padding | “valid” or “same”,默认=“valid”,same即需要padding,保持输出大小一致 |
activation | 激活函数 |
data_format | 输入数据的形状,默认="channels_last ",(batch, height, width, channels) |
use_bias | boolean ,是否使用b(偏移量) |
kernel_initializer | 参数w的初始化方式 |
bias_initializer | 偏移量b的初始化方式 |
input_shapae | 2-D数据 (batch, height, width, channels) |
- 池化层:average:tf.keras.layers.AveragePooling2D、max:tf.keras.layers.MaxPool2D。
主要参数:
参数名 | 含义 |
---|---|
pool_size | 池化核大小,默认=(2,2) |
strides | 步长,默认=2 |
padding | “valid” or “same”,默认 = ‘valid’ |