AlexNet是ImageNet LSVRC-2012夺冠模型,可以说是深度卷积神经网络的开篇。
AlexNet出自:ImageNet Classification with Deep Convolutional Neural Networks
论文总结:
1、该论文提出了AlexNet模型,对计算机视觉产生了非常大的影响。
2、提出RELU非线性激活函数,在imageNet数据集上比tanh,sigmiod等激活函数收敛快
3、由于当时GPU算力不够,在两个GPU上进行训练。
4、提出了 Local Response Normalization(局部响应归一化),即经卷积层输出后,各像素点在同方向的前面n/2个通道(最小为第0个通道)和后n/2个通道进行归一化。公式如下:
5、重叠池化,即池化核步长小于池化核大小,能够抑制过拟合。
6、数据增强:图像平移和水平反转;利用PCA改变图片的RGB值。
7、dropout:训练时以0.5的概率随机丢弃神经元的输出。在测试时使用全部神经元,并将神经元的输出乘以0.5。
8、.训练细节:
batch size=128,momentum=0.9,L2:0.0005;
W:均值为0方差为0.01的高斯分布随机初始化,
b:第二、四、五卷积层和全连接层初始化为1,使RELU有一个正向的输入,其余全为0;
学习率:初始为0.01,在训练过程中手动调节,一般是当错误率不下降时,学习率缩小10倍。
AlexNet网络结构详解
图片输入:论文中这里感觉有点问题,网上查了下,输入应该为(227,227,3)
conv1:
96个(11,11,3)的卷积核,stride=4。输出(55,55,96)
LRN:输出尺寸不变。
maxpooling:(3,3),stride=2,输出(27,27,96)
conv2
256个(5,5,96)的卷积核,stride=1,pading=2,输出(27,27,256)
LRN:输出尺寸不变。
maxpooling:(3,3),stride=2,输出(13,13,256)
conv3
384个(3,3,256)的卷积核,stride=1,pading=1,输出(13,13,384)
conv4
192个(3,3,384)的卷积核,stride=1,pading=1,输出(13,13,192)
conv5
256个(3,3,192)的卷积核,stride=1,pading=2,输出(13,13,256)
LRN:输出尺寸不变。
maxpooling:(3,3),stride=2,输出(6,6,256)
fc1
输出4096
fc2
输出4096
fc3
经softmax函数输出1000
注 :除了最后一层,其余层全用的ReLu激活函数
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
def alexNet_model():
alexNet = keras.Sequential()
#第一层
alexNet.add(layers.Conv2D(filters=96,kernel_size=(11,11),strides=(4,4),
activation='relu',input_shape=(227,227,3),name='Conv1'))
alexNet.add(layers.BatchNormalization(name='BN1'))
alexNet.add(layers.MaxPool2D(pool_size=(3,3),strides=(2,2),name='Pool1'))
#第二层
alexNet.add(layers.Conv2D(filters=256,kernel_size=(5,5),strides=(1,1),padding='same',
activation='relu',name='Conv2'))
alexNet.add(layers.BatchNormalization(name='BN2'))
alexNet.add(layers.MaxPool2D(pool_size=(3,3),strides=(2,2),name='Pool2'))
#第三层
alexNet.add(layers.Conv2D(filters=384,kernel_size=(3,3),strides=(1,1),padding='same',
activation='relu',name='Conv3'))
#第四层
alexNet.add(layers.Conv2D(filters=192,kernel_size=(3,3),strides=(1,1),padding='same',
activation='relu',name='Conv4'))
#第五层
alexNet.add(layers.Conv2D(filters=256,kernel_size=(3,3),strides=(1,1),padding='same',
activation='relu',name='Conv5'))
alexNet.add(layers.BatchNormalization(name='BN3'))
alexNet.add(layers.MaxPool2D(pool_size=(3,3),strides=(2,2),name='Pool3'))
#全连接层
alexNet.add(layers.Flatten())
alexNet.add(layers.Dense(4096,activation='relu',name='fc1'))
alexNet.add(layers.Dense(4096,activation='relu',name='fc2'))
alexNet.add(layers.Dense(1000,activation='softmax',name='output'))
return alexNet
AlexNet = alexNet_model()
AlexNet.summary()