《深度学习》AlexNet网络

时间:2024-11-21 08:01:12

文章目录

  • 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 数据读取

之后补充。。。。。