文章目录
- 1.AlexNet的网络架构
- 2.示例:手写数字识别
- 2.1 数据读取
学习目标:
- 知道AlexNet网络结构
- 能够利用AlexNet完成图像分类
2012年,AlexNet横空出世,该模型的名字源于论⽂第⼀作者的姓名AlexKrizhevsky 。AlexNet使⽤了8层卷积神经⽹络,以很⼤的优势赢得了
ImageNet 2012图像识别挑战赛。它⾸次证明了学习到的特征可以超越⼿⼯设计的特征,从⽽⼀举打破计算机视觉研究的⽅向。
1.AlexNet的网络架构
AlexNet与LeNet的设计理念⾮常相似,但也有显著的区别,其⽹络架构如下图所示:
该网络的特点是:
- AlexNet包含8层变换,有5层卷积和2层全连接隐藏层,以及1个全连接输出层(softmax)
- AlexNet第⼀层中的卷积核形状1111,第⼆层中的卷积核形状减⼩到55,之后全采⽤33。所有的池化层窗⼝⼤⼩为33、步幅为2的最⼤池化。
- AlexNet将sigmoid激活函数改成了ReLU激活函数,使计算更简单,⽹络更容易训练
- AlexNet通过dropOut来控制全连接层的模型复杂度。
- AlexNet引⼊了⼤量的图像增强,如翻转、裁剪和颜⾊变化,从⽽进⼀步扩⼤数据集来缓解过拟合。
在tf.keras中实现AlexNet模型:
import tensorflow as tf
# 搭建网络
net = tf.keras.Sequential(
[
# 第一个卷积层:卷积核个数是96,卷积核大小是11,步长是4
tf.keras.layers.Conv2D(filters=96, kernel_size=11, strides=4, activation='relu'),
# 池化,都是3*3,步长为2
tf.keras.layers.MaxPooling2D(pool_size=3, strides=2),
# 第二层卷积:卷积核个数是256,卷积核大小是5,padding为same
tf.keras.layers.Conv2D(filters=256, kernel_size=5, padding='same', activation='relu'),
# 池化
tf.keras.layers.MaxPooling2D(pool_size=3, strides=2),
# 紧跟着三个卷积层:卷积核个数分别是384,384,256,卷积核大小都是3,padding都是same
tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(filters=256, kernel_size=3, padding='same', activation='relu'),
# 池化
tf.keras.layers.MaxPooling2D(pool_size=3, strides=2),
# 摊开,伸展成一维的向量
tf.keras.layers.Flatten(),
# 全连接,4096
tf.keras.layers.Dense(4096, activation='relu'),
# 正则化,随机失活
tf.keras.layers.Dropout(0.5),
# 全连接,4096
tf.keras.layers.Dense(4096, activation='relu'),
# 正则化,随机失活
tf.keras.layers.Dropout(0.5),
# 输出层
tf.keras.layers.Dense(10, activation='softmax')
]
我们构造⼀个⾼和宽均为227的单通道数据样本来看⼀下模型的架构:
# 构造输入为xX,并将其送入到net网络中
X = tf.random.uniform((1, 227, 227, 1))
y = net(X)
# 查看网络的结构
net.summary()
2.示例:手写数字识别
AlexNet使⽤ImageNet数据集进⾏训练,但因为ImageNet数据集较⼤训练时间较⻓,我们仍⽤前⾯的MNIST数据集来演示AlexNet。读取数据的时将图像⾼和宽扩⼤到AlexNet使⽤的图像⾼和宽227。这个通过 tf.image.resize_with_pad 来实现。
2.1 数据读取
之后补充。。。。。