图像分类实质上就是从给定的类别集合中为图像分配对应标签的任务。
例如:
类别集(caegories)有(bird,dog,pig)三个类别,输入一张图片,分类模型会给图像分配多个标签,每个标签的概率不相同,取最大作为其类别,这就完成了图像分类的任务
AlexNet简介:
2012 年的ImageNet图像识别挑战赛中,AlexNet横空出世,它击败了日本选手的传统方法构建的SVM模型,首次证明了学习到的特征可以超越手工设计的特征,从而一举打破计算机视觉研究的方向
AlexNet网络的特点:
2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络:VGGNet,并取得了LISVRC2014比赛分类项目的第二名,主要贡献是使用很小的卷积核(3*3)构建卷积神经网络结构,能够取得较好的识别精度,常用来提取图像特征的有VGG-16和VGG-19
VGG特点:
VGG块:
在使用tf.keras实现模型时,首先要实现VGG块,它的组成规律是:连续使用多个相同的填充为1、卷积核大小为33的卷积层后接上一个步幅为2、窗口形状为22的最大池化层。卷积层保持输入的高和宽不变,而池化层则对其减半。我们使用vgg_block函数来实现这个基础的VGG块,它可以指定卷积层的数量num_convs和每层的卷积核个数num_filters
# 定义VGG网络中的卷积块:卷积层的个数,卷积层中卷积核的个数
def vgg_block(num_convs, num_filters):
# 构建序列模型
blk = tf.keras.models.Sequential()
# 遍历所有的卷积层
for _ in range(num_convs):
# 每个卷积层:num_filter个卷积核,卷积核大小为3*3,padding是same,激活函数是relu
blk.add(tf.keras.layers.Conv2D(num_filters,kernel_size=3,
padding='same',activation='relu'))
# 卷积块最后是一个最大池化,窗口大小为2*2,步长为2
blk.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))
return blk
GoogLeNet的名字不是GoogleNet,而是GoogLeNet,这是为了致敬LeNet。GoogLeNet和AlexNet/VGGNet这类依靠加深网络结构的深度的思想不完全一样。GoogLeNet在加深度的同时做了结构上的创新,引入了一个叫做Inception的结构来代替之前的卷积加激活的经典组件。
GoogLeNet中的基础卷积块叫做Inception块,Inception块的结构比较复杂,如下图所示:
Inception块里有4条并行的线路,前3条线路使用窗口大小分别是11,33,55的卷积层来抽取不同空间尺寸下的信息,其中中间2个线路会对输入先做11卷积来减少通道数,以降低模型的复杂度。第4条线路则使用33最大池化层,后接11卷积层来改变通道数。4条线路都使用了合适的填充来使输入与输出的高和宽一致。最后我们将每条线路的输出在通道维度上连接,并向后进行传输
1*1 卷积核:
为什么1*1卷积核可以减少网络参数?
以inception模块为例,来说明1x1的卷积如何来减少模型参数:
如上图:a是未加入11卷积的inception模块,b是加入了11卷积的inception模块
我们以33卷积线路为例,假设输入的特征图大小为(2828192),卷积核的个数是128:
a图参数个数为:33192128 = 221184
b图参数个数为:1119296 + 3396128 = 129024
对比可知,加入1*1卷积后参数量减少了
整个网络架构我们分为5个模块,每个模块之间使用步幅为2的33最大池化层来减少输出宽度
B1模块
第一模块使用一个64通道的77卷积层。
B2模块
第二模块使用2个卷积层:首先是64通道的11卷积层,然后是将通道增大3倍的33卷积层
B3模块
第三模块串联2个完整的Inception块,第一个Inception块的输出通道数为64+128+32+32=256,第二个Inception块输出通道数增至128+192+96+64=480
B4模块
第四个模块比较复杂,它串联了5个Inception块,其输出通道数分别是192+208+48+64=512,160+224+64+64=512,128+256+64+64=512,112+288+64+64=528,256+320+128+128=832
并且在第1和第4个Inception后面增加了辅助分类器(根据实验发现网络中间层具有很强的识别能力,为了利用中间层抽象的特征,在某些中间层中添加含有多层的分类器)
辅助分类器:
考虑到GoogLeNet相当深的网络模型会影响反向传播(会出现梯度消失的情况),又想到中间的网络层具有很强的判别例,所以增加了一个辅助分类器
优点:
GoogLeNet论文写到:训练阶段,最后把这两个辅助分类器输出的结果赋予0.3的权重后加入了最后的损失中,验证阶段,这两个auxilary的结果被去掉了
B5模块
第五模块有两个Inception块,输出通道数为256+320+128+128=832,384+384+128+128=1024.
后面紧跟输出层,该模块使用全局平均池化层(GAP)来将每个通道的高和宽变成1。最后输出变成二维数组后接输出个数为标签类别数的全连接层。
全局平均池化层(GAP)
目的是用来替代全连接层前的Flatten。传统的CNN最后一层都是全连接层,参数个数非常之多,容易引起过拟合(如Alexnet),一个CNN模型,大部分的参数都被全连接层给占用了,所以论文提出采用了全局均值池化替代全连接层。与传统的全连接层不同,我们对每个特征图一整张图片进行全局均值池化,这样每张特征图都可以得到一个输出。这样采用均值池化,连参数都省了,可以大大减小网络参数,避免过拟合,另一方面它有一个特点,每张特征图相当于一个输出特征,然后这个特征就表示了我们输出类的特征
优点: