机器学习笔记(十四):TensorFlow实战六(经典卷积神经网络:AlexNet )

1 - 引言

2012年,Imagenet比赛冠军的model——Alexnet [2](以第一作者alex命名)。这个网络算是一个具有突破性意义的模型
首先它证明了CNN在复杂模型下的有效性,然后GPU实现使得训练在可接受的时间范围内得到结果,让之后的网络模型构建变得更加复杂,并且通过GPU加速越来越得到关注
论文原文:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

神经网络整体结构如下图所示:
在这里插入图片描述

Alexnet 模型的创新之处:

  • ReLU
    一般神经元的激活函数会选择sigmoid函数或者tanh函数,然而Alex发现在训练时间的梯度衰减方面,这些非线性饱和函数要比非线性非饱和函数慢很多。在AlexNet中用的非线性非饱和函数是f=max(0,x),即ReLU。实验结果表明,要将深度网络训练至training error rate达到25%的话,ReLU只需5个epochs的迭代,但tanh单元需要35个epochs的迭代,用ReLU比tanh快6倍。

  • 双GPU加速
    为提高运行速度和提高网络运行规模,作者采用双GPU的设计模式。并且规定GPU只能在特定的层进行通信交流。其实就是每一个GPU负责一半的运算处理。作者的实验数据表示,two-GPU方案会比只用one-GPU跑半个上面大小网络的方案,在准确度上提高了1.7%的top-1和1.2%的top-5。值得注意的是,虽然one-GPU网络规模只有two-GPU的一半,但其实这两个网络其实并非等价的。

  • LRN局部响应归一化

ReLU本来是不需要对输入进行标准化,但本文发现进行局部标准化能提高性能。
b x , y i = α x , y i / ( k + α j = m a x ( 0 , i n / 2 ) m i n ( N 1 , i + n / 2 ) ( α x , y j ) 2 ) b^i_{x,y}=\alpha^i_{x,y}/(k+\alpha\sum^{min(N-1,i+n/2)}_{j=max(0,i-n/2)}(\alpha^j_{x,y})^2)

这种响应归一化实现了一种模仿真实神经元的横向抑制,从而在使用不同内核计算的神经元输出之间产生较大的竞争

  • 重叠池化
    实验表示使用 带交叠的池化的效果比的传统要好,在top-1和top-5上分别提高了0.4%和0.3%,在训练阶段有避免过拟合的作用。

  • Dropout
    Dropout是一种随机使神经元失活的一种正则化方法,可以有效的避免过拟合。在我们之前实现用LeNet-5来识别MNIST训练集的时候就使用了这种方法

下面让我们来详细的介绍AlexNet

2 - AlexNet模型结构分析

在这里插入图片描述

2.1 - Conv1阶段

在这里插入图片描述

  • 输入数据:227x227x3
  • 卷积核:11x11x3
  • 卷积核移动步长:4
  • 卷积核数量:96
  • 池化层:3x3
  • 池化层移动步长:2
  • 输出数据:27x27x96

2.2 - Conv2阶段

在这里插入图片描述

  • 输入数据:27x27x96
  • 卷积核:5x5
  • 卷积核数量:256
  • 卷积核移动步长:2
  • padding : 2
  • 池化层:3x3
  • 池化层移动步长:2
  • 输出数据:13x13x256

2.3 - Conv3阶段

在这里插入图片描述

  • 输入数据:13x13x256
  • 卷积核:3x3
  • pading : 1
  • 卷积核数量:384
  • 输出数据:13x13x384

2.4 - Conv4阶段

在这里插入图片描述

  • 输入数据13x13x384
  • 卷积核:3x3
  • pad:1
  • 卷积核数量:384
  • 输出数据:1313384

2.5 - Conv5阶段

在这里插入图片描述

  • 输入数据13x13x384
  • 卷积核:3x3
  • pad:1
  • 卷积核数量:256
  • 输出数据:1313256

之后三个阶段为全连接阶段参数如图所示

2.6 FC6阶段

在这里插入图片描述

2.7 FC6阶段

在这里插入图片描述

2.8 FC6阶段

在这里插入图片描述

3 - TensorFlow搭建AlexNet模型:

Keras简介:

Keras中文手册 https://keras-cn.readthedocs.io/en/latest/

Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:

简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
支持CNN和RNN,或二者的结合
无缝CPU和GPU切换
Keras适用的Python版本是:Python 2.7-3.6

Keras是一个在TensorFlow之上的高级深度学习框架,可以理解为Keras为TensorFlow的使用提供了多种方便的API,我们可以通过Keras提供的API快速的使用TensorFlow搭建我们所需要的神经网络模型

def AlexNet():

    model = Sequential()
    model.add(Conv2D(96,(11,11),strides=(4,4),input_shape=(227,227,3),padding='valid',activation='relu',kernel_initializer='uniform'))
    model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
    model.add(Conv2D(256,(5,5),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
    model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
    model.add(Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
    model.add(Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
    model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
    model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
    model.add(Flatten())
    model.add(Dense(4096,activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4096,activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1000,activation='softmax'))
    return model

以上是使用Kears快速搭建的一个AlexNet结构。
完整的AlexNet应用模型(Tensorflow)版github地址:
https://github.com/kratzert/finetune_alexnet_with_tensorflow

猜你喜欢

转载自blog.csdn.net/HHH_ANS/article/details/84325832