目录
一:LeNet-5解析
论文地址:http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf
1.网络结构
不知道卷积层的先去看我上两篇文章
图中:输入32*32*3数据,经过两个卷积网络得到一个400的数据,在经过一个两层神经网络输出十个类别
整个LeNet-5网络总共包括7层(不含输入层):conv1(卷积层)-pool1(池化层)-conv2-pool2-fc3(第一层神经网络)-fc4(第二层神经网络)-output(输出)
输入层:
输入一个32*32像素的图像,通道数为3
1.conv1:
卷积层,使用6个5*5大小的卷积核,padding=0,stride=1,得到6个28*28大小的特征图:32-5+1=28
2.pool1层:
池化层,使用6个2*2大小的卷积核进行池化,padding=0,stride=2,得到6个14*14带下的特征图:28/2=14
3.conv2:
同conv1一样的卷积层,但是这个使用的是16个5*5的卷积核
4.pool2:
同pool1一样的池化层,但是这个是使用16个2*2大小的卷积核
5.fc3,fc4:
全连接层:每个神经元都与前面卷积好的特征图相连接,计算输入向量和权重向量之间的点积,再加上偏置,然后再通过sortmax函数输出
6.output层:
最后的 Output 层也是全连接层,采用了softmax函数计算输入向量和参数向量之间的距离
激活层默认不画网络图中,整个网络图使用的是sigmoid和Tanh函数
将卷积,激活,池化视作一层
2.参数形状
二:AlexNet
AlexNet结构相对简单,使用了8层卷积神经网络,前五层是卷积层,剩下的3层是全连接层。
1层:
卷积层,基本结构为:卷积---ReLU---池化
1.卷积:输入277*277*3,96个11*11*3的卷积核,不扩充边缘padding=0,步长=4,所以FeatrueMap大小为(227-11+0*2+4)/4=55,即55*55*96
2.激活函数使用ReLU
3.池化:池化和大小为3*3,padding=0,步长为2。所以FeatureMap输出大小为:(55-3+0*2)/2=27,即第一层的输出为27*27*96(如果使用的是两个GPU,那么会将分成两组,每组27*27*48)
2层:
C2的基本结构为:卷积–>ReLU–>池化
1.卷积:输入27×27×96,256个5×5×96的卷积核,扩充边缘padding = 2, 步长stride = 1,因此其FeatureMap大小为(27-5+2×2+1)/1 = 27,即27×27×256;
2.激活函数:ReLU;
3.池化:池化核大小3 × 3,不扩充边缘padding = 0,步长stride = 2,因此其FeatureMap输出大小为(27-3+0+2)/2=13, 即C2输出为13×13×256(此处未将输出分到两个GPU中,若按照论文将分成两组,每组为13×13×128)
3层:
3的基本结构为:卷积–>ReLU。注意一点:此层没有进行MaxPooling操作。
卷积:输入13×13×256,384个3×3×256的卷积核, 扩充边缘padding = 1,步长stride = 1,因此其FeatureMap大小为(13-3+1×2+1)/1 = 13,即13×13×384;
激活函数:ReLU,即C3输出为13×13×384(此处未将输出分到两个GPU中,若按照论文将分成两组,每组为13×13×192);
4 层
4的基本结构为:卷积–>ReLU。注意一点:此层也没有进行MaxPooling操作。
卷积:输入13×13×384,384个3×3×384的卷积核, 扩充边缘padding = 1,步长stride = 1,因此其FeatureMap大小为(13-3+1×2+1)/1 = 13,即13×13×384;
激活函数:ReLU,即C4输出为13×13×384(此处未将输出分到两个GPU中,若按照论文将分成两组,每组为13×13×192);
5 层
5的基本结构为:卷积–>ReLU–>池化
卷积:输入13×13×384,256个3×3×384的卷积核,扩充边缘padding = 1,步长stride = 1,因此其FeatureMap大小为(13-3+1×2+1)/1 = 13,即13×13×256;
激活函数:ReLU;
池化:池化核大小3 × 3, 扩充边缘padding = 0,步长stride = 2,因此其FeatureMap输出大小为(13-3+0×2+2)/2=6, 即C5输出为6×6×256(此处未将输出分到两个GPU中,若按照论文将分成两组,每组为6×6×128);
6 全连接层
6的基本结构为:全连接–>>ReLU–>Dropout
全连接:此层的全连接实际上是通过卷积进行的,输入6×6×256,4096个6×6×256的卷积核,扩充边缘padding = 0, 步长stride = 1, 因此其FeatureMap大小为(6-6+0×2+1)/1 = 1,即1×1×4096;
激活函数:ReLU;
Dropout:全连接层中去掉了一些神经节点,达到防止过拟合,FC6输出为1×1×4096;
7 全连接层
7的基本结构为:全连接–>>ReLU–>Dropout
全连接:此层的全连接,输入1×1×4096;
激活函数:ReLU;
Dropout:全连接层中去掉了一些神经节点,达到防止过拟合,FC7输出为1×1×4096;
8 全连接层
8的基本结构为:全连接–>>softmax
全连接:此层的全连接,输入1×1×4096;
softmax:softmax为1000,FC8输出为1×1×1000
总参数量:60M=6000万,5层卷积+3层全连接
使用了非线性激活函数:ReLU
使用了批标准化
三:卷积网络结构的优化:
1.常见结构特点:
整个过程:AlexNet---NIN--(VGG--GoogLeNet)---ResNet
NIN:引入1*1卷积
NIN网络是inception的前身,提供了减少训练数量的思想,提高了运算的速度
GoogleNet:用更多的卷积,更深的层次可以得到更好的结构(没有证明浅的层次不能达到整个效果)
2.引入Inception模块
1.Inception结构:
Inception模块的核心思想就是将不同的卷积层通过并联的方式结合在一起,经过不同卷积层处理的结果矩阵在深度这个维度拼接起来,形成一个更深的矩阵。Inception模块可以反复叠堆形成更大的网络,它可以对网络的深度和宽度进行高效的扩充,在提升深度学习网络准确率的同时防止过拟合现象的发生。Inception模块的优点是可以对尺寸较大的矩阵先进行降维处理的同时,在不同尺寸上对视觉信息进行聚合,方便从不同尺度对特征进行提取
首先我们要说一下在Network in Network中引入的1 x 1卷积结构的相关作用
1.MLP卷积(1x1卷积)
目的:提出了一种新的深度网络结构,称为“网络中的网络”(NIN),增强接受域内局部贴片的模型判别能力。
做法:对于传统线性卷积核:采用线性滤波器,然后采用非线性激活。
提出MLP卷积取代传统线性卷积核
作用或优点:
1、多个1x1的卷积核级联加上配合激活函数,将feature map由多通道的线性组合变为非线性组合(信息整合),提高特征抽象能力(Multilayer Perceptron,缩写MLP,就是一个多层神经网络)
2、1x1的卷积核操作还可以实现卷积核通道数的降维和升维,实现参数的减小化
2.1x1卷积介绍
从图中,看到1 x 1卷积的过程,那么这里先假设只有3个1x1Filter,那么最终结果还是56x56x3。但是每一个FIlter的三个参数的作用,看作是对三个通道进行了线性组合。
我们甚至可以把这几个FIlter可以看成就是一个简单的神经元结构,每个神经元参数数量与前面的通道数量相等。
通常在卷积之后会加入非线性激活函数,在这里之后加入激活函数,就可以理解成一个简单的MLP网络了。
3.通道数变化:
那么对于1x1网络对通道数的变化,其实并不是最重要的特点,因为毕竟3 x 3,5 x 5都可以带来通道数的变化,
而1x1卷积的参数并不多,我们拿下面的例子来看。
保持通道数不变
提升通道数
减少通道数
4.Inception层
这个结构也叫盗梦空间
目的:
代替人工去确定到底使用1x1,3x3,5x5还是是否需要max_pooling层,有网络自动去寻找适合的结构。
特点:
是每一个卷积/池化最终结构的长,宽大小一致
特殊的池化层,需要添加padding,步长来时输出大小一致,并且选择32的通道数
最终结果28x28x256,使用更少的参数,达到AlexNet或者VGG同样类似的输出结果
5.Inception改进
改进目的:减少计算,如5x5卷积的运算量
- 上面的参数:5 x 5 x 32 x 192 =153600
- 下面的参数:192 x 16 + 5 x 5 x 16 x 32 = 3072 + 12800 = 15872
所以上面的结构会需要大量的计算,我们把这种改进的结构称之为网络的"瓶颈",网络缩小后扩大。
那么这样改变会影响网络的性能和效果吗?
GoogleNet就是如此,获得了非常好的效果。所以合理的设计网络当中的Inception结构能够减少计算,实现更好的效果
三:卷积神经网络学习特征可视化
我们肯定会疑问这个深度的卷积网络到底在干什么,可以将网络学习中产生的特征图可视化一下,看看每一层都干什么
- layer1,layer2学习到的特征基本是颜色、边缘等低层特征
- layer3学习到的特征,一些纹理特征,如网格纹理
- layer4学习到的特征会稍微复杂些,比如狗的头部形状
- layer5学习到的是完整一些的,比如关键性的区分特征
四:案例
我们来使用一个VGG16的模型进行预测,这个模型源码文件中提供了相关的处理图片的接口预测结果概率的处理API
from tensorflow.python.keras.applications import VGG16
from tensorflow.python.keras.applications.vgg16 import decode_predictions
from tensorflow.python.keras.applications.vgg16 import preprocess_input
preprocess_input:处理输入图片
decode_predictions:对预测结果进行处理
1.获取模型数据
因为数据要到网上下载,所以第一次运行会很慢
model = VGG16()
print(model.summary())
模型打印为:
2.图片的输入以及格式转换
先下载一个API
pip install PIL
from tensorflow.keras.preprocessing.image import load_img
from tensorflow.keras.preprocessing.image import img_to_array
3.进行本地图片加载
# 加载一个图片到VGG指定输入大小
image = load_img('./tiger.png', target_size=(224, 224))
# 进行数据转换到numpy数组形式,以便于VGG能够进行使用
image = img_to_array(image)
# 形状修改
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
4.使用模型对数据进行处理和预测
# 输入数据进行预测,进行图片的归一化处理
image = preprocess_input(image)
y_predict = model.predict(image)
# 进行结果解码
label = decode_predictions(y_predict)
# 进行lable获取
res = label[0][0]
# 预测的结果输出
print('预测的类别为:%s 概率为:(%.2f%%)' % (res[1], res[2]*100))
输出结果:
8192/35363 [=====>........................] - ETA: 0s
24576/35363 [===================>..........] - ETA: 0s
40960/35363 [==================================] - 0s 6us/step
预测的类别为:tiger 概率为:(80.30%)