很久以前看吴恩达老师的视频和西瓜书时用jupyter写的,今天想起来就把它转到这里,真的挺方便。
图像识别、目标检测、风格迁移
实例研究
CNN经典模型:
LeNet-5
AlexNet
VGG
ResNet
LeNet-5:第一个成功应用于数字识别的卷积神经网络。典型的LeNet-5结构包含CONV layer,POOL
layer和FC layer,顺序一般是CONV layer->POOL layer->CONV layer->POOL layer->FC layer->
FC layer->OUTPUT layer,即
y
^
\hat y
y^。但是采用的是 average pool.
改进:使用 max pool 和激活函数 ReLU
from IPython.display import Image
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "5.png", width=600, height=200)
AlexNet:与LeNet类似,只是加多了参数,加深了深度。
VGG:最为复杂,一般卷积层的滤波器设置为 3 ∗ 3 3*3 3∗3,步长为1,相同填充。 池化层按减半设置。(2*2的滤波器,2位步长)
from IPython.display import Image
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "6.png", width=800, height=200)
ResNets(残差网络)解决的问题:神经网络层数越多,网络越深,源于梯度消失和梯度爆炸的影响,整个模型难以训练成功。
ResNets:人为的让神经网络中某些层跳过下一层或即层,隔层相连,弱化每层之间的强联系。便于训练更深层的网络。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/" #单个神经元子模块
Image(filename = libo + "7.png", width=500, height=60)
ResNets为何对深层网络有奇效?
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/" #单个神经元子模块
Image(filename = libo + "8.png", width=600, height=60)
这样,便减少了a[l+2]层对a[l]层参数选择的依赖,使他们之间直接建立了联系。削弱了层层之间的联系,实现隔层线性传递。看似很深的网络变得浅了。
如果a[l] 和a[l+2]的维度不同,通常引入矩阵Ws,与a[l]相乘,使得Ws∗a[l]的维度与a[l+2]
一致。Ws的来法有两种:一种是将Ws作为学习参数,通过模型训练得到;另一种是固定Ws值
(类似单位矩阵),不需要训练。
ResNets同类型层之间,例如CONV layers,大多使用same类型,保持维度相同。如果是不同类型层
之间的连接,例如CONV layer与POOL layer之间,如果维度不同,则引入矩阵Ws。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/" #单个神经元子模块
Image(filename = libo + "9.png", width=600, height=60)
1x1 Convolutions(Networks in Networks):滤波器维度为1,当是单个滤波器时,卷积即乘积。
对于滤波器组,1x1 Convolutions的作用实际上类似全连接层的神经网络结构。
1x1 Convolutions可以用来缩减输入图片的通道数目。所用滤波器为1X1X192 ,数量为32个。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "10.png", width=500, height=50)
Inception Network:在单层网络上可以使用多个不同尺寸的filters,进行same convolutions,把各filter下的输出拼接起来,还可以将CONV layer与POOL layer混合。使用的全部是same pool。由此出现了各种随机组合,由神经网络本身去学习更好参数并选择更好的模块。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "11.png", width=600, height=50)
Inception Network 出现的一个问题是计算量过大,为此,引入1X1的卷积层来减少计算量。该层被称为“瓶颈层”,合理的卷积层在减小计算量的同时,不会降低网络性能。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "12.png", width=600, height=50)
Inception Network :引入了1X1后的一个小模块如下:
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "13.png", width=600, height=50)
每个小模块内部随机组合,多个小模块组成了inception(盗梦空间):
其中网络中间的隐藏层也可以作为输出层,有利于防止过拟合。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "14.png", width=600, height=50)
Transfer Learning(迁移学习):可以把已经训练好的模型的一部分知识应用到另一个相似模型中去。
迁移学习的做法:无需重新构建新的模型,而是利用之前的神经网络模型,只改变样本输入、输出以及输出层的权重系数W[L], b[L]。若样本较少,则只重新训练输出层的权重系数即可。选择方法由样本数量的多少决定。重新训练权重系数时,初始值可由原来的模型得到。
迁移学习有效的原因:神经网络浅层部分能够检测出许多图片固有特征,例如图像边缘、曲线等。因为图片处理太多相同的地方,故可。迁移学习可以保留原神经网络的一部分,再添加新的网络层:
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "15.png", width=600, height=50)
数据扩充:
1.镜像对称:对原有图像对称,旋转。
2.随机裁剪:随机裁剪
3.颜色转换:RGB通道数值进行随意增加或者减少,改变图片色调。
网络模型需要数据,不同的网络需要的数据量不同(下图)。一般说来,数据越少,就需要更多的数据扩充,模型算法也就相对复杂起来,数据扩充对模型的影响不可小视。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "16.png", width=600, height=60)
模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:
由于该方法计算量较大,一般不用于实际项目开发。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "17.png", width=600, height=60)