卷积神经网络学习(一)——AlexNet(附tensorflow2.0模型搭建)

这是我学习深度学习第一个接触的比较复杂的神经网络,可能有点理解错误欢迎交流指正hh

简介

AlexNet是由2012年ImageNet大规模视觉挑战赛(ILSVRC)冠军团队所提出一种更深层次的卷积神经网络,将比赛中的120万个高分辨率图像分类为1000个不同的类别,在测试集上第一和第五的错误率分别37.5%和17.0%,比当时最先进的技术还要好!
之后他们便发表了一篇文章《ImageNet Classification with Deep Convolutional Neural Networks》,第一作者为Alex Krizhevsky,AlexNet的名字也因此的来。

特点

使用ReLU函数作为激活函数

在此之前的模型中常用tanh或Sigmoid作为神经元输出的激活函数,分别为
f ( x ) = tanh ⁡ ( x ) {\rm{f}}(x) = \tanh (x) f(x)=tanh(x)
f ( x ) = 1 1 + e − x f(x) = \frac{1}{{1 + {e^{ - x}}}} f(x)=1+ex1

在这里插入图片描述
在这里插入图片描述
tanh和Sigmoid都为饱和非线性(saturating nonlinearities)激活函数,所谓饱和非线性就是会对输入值进行压缩,或者说会使数据在一定区间。

在这里插入图片描述

此文中用到的ReLU函数为非饱和非线性(non-saturating nonlinearity)激活函数f(x)=max(0,x),而由于Sigmoid和tanh在反向传播求误差梯度时,求导涉及除法,计算量相对大,因此非饱和非线性函数的速度是远高于饱和非线性的。从下图我们可以看出,一个四层卷积神经网络使用ReLU作为激活函数时,其在CIFAR-10数据集上训练错误率达到25%的速度是使用tanh作为激活函数时的6倍之多。

在这里插入图片描述

重叠池化(Overlapping Pooling)并使用Max Pooling

池化(Pooling)也成下采样或欠采样,是特征降维的一种方法,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。
下图中分别为最大池化(Max Pooling)和平均池化(Average Pooling)的直观表示。

在这里插入图片描述

通常来讲,max-pooling的效果更好,虽然max-pooling和average-pooling都对数据做了下采样,但是max-pooling感觉更像是做了特征选择,选出了分类辨识度更好的特征,提供了非线性,根据相关理论,特征提取的误差主要来自两个方面:(1)邻域大小受限造成的估计值方差增大;(2)卷积层参数误差造成估计均值的偏移。一般来说,average-pooling能减小第一种误差,更多的保留图像的背景信息,max-pooling能减小第二种误差,更多的保留纹理信息。average-pooling更强调对整体特征信息进行一层下采样,在减少参数维度的贡献上更大一点,更多的体现在信息的完整传递这个维度上,在一个很大很有代表性的模型中,比如说DenseNet中的模块之间的连接大多采用average-pooling,在减少维度的同时,更有利信息传递到下一个模块进行特征提取。
但是average-pooling在全局平均池化操作中应用也比较广,在ResNet和Inception结构中最后一层都使用了平均池化。有的时候在模型接近分类器的末端使用全局平均池化还可以代替Flatten操作,使输入数据变成一位向量。

重叠池化是指池化单元的大小(Size)大于其步数(Stride),文中提到这种方案在top-1和top-5的错误率上分别下降0.4%和0.3%。

提出局部响应归一化LRN(Local Response Normalization)

在这里插入图片描述

在这里插入图片描述

公式看上去比较复杂,但理解起来非常简单。i表示第i个核在位置(x,y)运用激活函数ReLU后的输出,n是同一位置上临近的kernal map的数目,N是kernal的总数。参数K,n,alpha,belta都是超参数,一般设置k=2,n=5,alpha=1*e-4,beta=0.75。

预防过拟合处理

Dropout

Dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。

Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。
Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,如图1所示。

在这里插入图片描述

数据增强(Data Augmentation)

在AlexNet中采用了两种截然不同的数据增强方式

  • 图像平移(image translations),水平翻转(horizontal reflections)和图像块提取(patch extractions)
    其中值得一提的是Alex等人提出的图像块提取方法,如下图所示,在图像中选取一定大小的区域,包含中心、左上、右上、左下、右下区域共五张图像,并以同样的方法在其水平翻转图像中得到五张图像总共10张图像。

在这里插入图片描述

  • 色度调整
    改变图像RGB通道的强度。
    在Alex的论文中使用了主成分分析(PCA)进行调整,简单来说就是先加倍图像通过PCA提取图像主成分,在通过一系列计算得出一些值与主成分进行相加。(?不确定理解对不对)

模型结构

AlexNet原文结构图

这张图为论文中给出的原图,从图中我们可以看出AlexNet网络是一个8层网络,包括5个卷积层和3个全连接层。其中,在第1,2,5层使用了Max pooling,且1,2层还使用了LRN操作;第6,7,8层使用了dense操作,且6,7层使用了dropout全连接操作。
当时实验使用的GPU为两块GTX 580,由于性能有限所以采取了分布式计算的方式,将feature maps分别交由两块GPU分别处理,最后将结果进行整合。由于目前GPU性能已达到一定水准,在此就简化为下图更为直观的进行理解。

AlexNet课件结构图

这张图是Andrew教授课件上展示的AlexNet模型结构图。
值得注意的是在这张图中输入的图像大小为227×227×3,而论文中给出的输入图像大小为224×224×3。这是由于根据图片卷积输出大小计算公式算出227在次可以得到更好的效果,Andrew教授进行的改进。

图像卷积尺寸计算公式

  • 输入图像大小:W*W
  • Filter大小:F*F
  • 步长:S
  • padding:P
  • 输出图像大小:N*N

[N = \frac{{W - F + 2P}}{S} + 1]

tensorflow2.0模型搭建

# tensorflow2.0
import tensorflow as tf
from tensorflow import keras

class LRN(keras.layers.Layer):
    def __init__(self):
        super(LRN, self).__init__()
        self.depth_radius=2
        self.bias=1
        self.alpha=1e-4
        self.beta=0.75
    def call(self,x):
        return tf.nn.lrn(x,depth_radius=self.depth_radius,
                         bias=self.bias,alpha=self.alpha,
                         beta=self.beta)
    
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(filters=96,
                              kernel_size=(11,11),
                              strides=4,
                              activation='relu',
                              padding='same',
                              input_shape=(227,227,3)))
model.add(keras.layers.MaxPool2D(pool_size=(3,3),strides=2))
model.add(LRN())
model.add(keras.layers.Conv2D(filters=256,
                              kernel_size=(5,5),
                              strides=1,
                              activation='relu',
                              padding='same'))
model.add(keras.layers.MaxPool2D(pool_size=(3,3),strides=2))
model.add(LRN())
model.add(keras.layers.Conv2D(filters=384,
                              kernel_size=(3,3),
                              strides=1,
                              activation='relu',
                              padding='same'))

model.add(keras.layers.Conv2D(filters=384,
                              kernel_size=(3,3),
                              strides=1,
                              activation='relu',
                              padding='same'))
model.add(keras.layers.Conv2D(filters=256,
                              kernel_size=(3,3),
                              strides=1,
                              activation='relu',
                              padding='same'))
model.add(keras.layers.MaxPool2D(pool_size=(3,3),strides=2))

model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(4096,activation='relu'))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(4096,activation='relu'))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(1000,activation="softmax"))

model.compile(loss="sparse_categorical_crossentropy",
              optimizer="sgd",
              metrics = ["accuracy"])

引用:
ImageNet Classification with Deep Convolutional Neural Networks
图像分类中max-pooling和average-pooling之间的异同
理解dropout
深度学习中Dropout原理解析
【深度学习技术】LRN 局部响应归一化

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值