深度学习——AlexNet网络结构

AlexNet的网络架构

特点: 1. AlexNet包含8层变换,有5层卷积和2层全连接隐藏层,以及1个全连接输出层 2. AlexNet第一层中的卷积核形状是1111。第二层中的卷积核形状减小到5 5,之后全采用33。所有的池化层窗口大小为33、步幅为2的最大池化。 3. AlexNet将sigmoid激活函数改成了ReLU激活函数,使计算更简单,网络更容易训练 4. AlexNet通过dropOut来控制全连接层的模型复杂度。 5. AlexNet引入了大量的图像增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。

在tf.keras中实现AlexNet模型:

ini 复制代码
# 构建AlexNet模型
net = tf.keras.models.Sequential([
    # 卷积层:96个卷积核,卷积核为11*11,步幅为4,激活函数relu

tf.keras.layers.Conv2D(filters=96,kernel_size=11,strides=4,activation='relu'),
    # 池化:窗口大小为3*3、步幅为2
    tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
    # 卷积层:256个卷积核,卷积核为5*5,步幅为1,padding为same,激活函数rel
 
 tf.keras.layers.Conv2D(filters=256,kernel_size=5,padding='same',activation='relu'
    # 池化:窗口大小为3*3、步幅为2
    tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
    # 卷积层:384个卷积核,卷积核为3*3,步幅为1,padding为same,激活函数relu
 
 tf.keras.layers.Conv2D(filters=384,kernel_size=3,padding='same',activation='relu'
    # 卷积层:384个卷积核,卷积核为3*3,步幅为1,padding为same,激活函数relu

tf.keras.layers.Conv2D(filters=384,kernel_size=3,padding='same',activation='relu'
    # 卷积层:256个卷积核,卷积核为3*3,步幅为1,padding为same,激活函数relu

tf.keras.layers.Conv2D(filters=256,kernel_size=3,padding='same',activation='relu'
    # 池化:窗口大小为3*3、步幅为2
    tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
    # 伸展为1维向量
    tf.keras.layers.Flatten(),
    # 全连接层:4096个神经元,激活函数relu
    tf.keras.layers.Dense(4096,activation='relu'),
    # 随机失活
    tf.keras.layers.Dropout(0.5),
    # 全链接层:4096个神经元,激活函数relu
    tf.keras.layers.Dense(4096,activation='relu'),
    # 随机失活
    tf.keras.layers.Dropout(0.5),
    # 输出层:10个神经元,激活函数softmax
    tf.keras.layers.Dense(10,activation='softmax')
])

我们构造一个高和宽均为227的单通道数据样本来看一下模型的架构:

ini 复制代码
# 构造输入X,并将其送入到net网络中
X = tf.random.uniform((1,227,227,1)
y = net(X)

# 通过net.summay()查看网络的形状
net.summay()

手写数字势识别

首先获取数据,并进行维度调整:

ini 复制代码
import numpy as np
# 获取手写数字数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 训练集数据维度的调整:N H W C
train_images = np.reshape(train_images,
(train_images.shape[0],train_images.shape[1],train_images.shape[2],1))

# 测试集数据维度的调整:N H W C
test_images = np.reshape(test_images,
(test_images.shape[0],test_images.shape[1],test_images.shape[2],1))

由于使用全部数据训练时间较长,我们定义两个方法获取部分数据,并将图像调整为227*227大小,进行模型训练:

ini 复制代码
# 定义两个方法随机抽取部分样本演示
# 获取训练集数据
def get_train(size):
    # 随机生成要抽样的样本的索引
    index = np.random.randint(0, np.shape(train_images)[0], size)
    # 将这些数据resize成227*227大小
    resized_images = tf.image.resize_with_pad(train_images[index],227,227,)
    # 返回抽取的
    return resized_images.numpy(), train_labels[index]

# 获取测试集数据
def get_test(size):
    # 随机生成要抽样的样本的索引
    index = np.random.randint(0, np.shape(test_images)[0], size)
    # 将这些数据resize成227*227大小
    resized_images = tf.image.resize_with_pad(test_images[index],227,227,)
    # 返回抽样的测试样本
    return resized_images.numpy(), test_labels[index]

调用上述两个方法,获取参与模型训练和测试的数据集:

ini 复制代码
# 获取训练样本和测试样本
train_images,train_labels = get_train(256)
test_images,test_labels = get_test(128)

为了让大家更好的理解,我们将数据展示出来:

ini 复制代码
# 数据展示:将数据集的前九个数据集进行展示
for i in range(9):
plt.subplot(3,3,i+1)
# 以灰度图显示,不进行插值
plt.imshow(train_images[i].astype(np.int8).squeeze(), cmap='gray',
interpolation='none')

# 设置图片的标题:对应的类别
plt.title("数字{}".format(train_labels[i]))
  • 模型编译
ini 复制代码
# 指定优化器,损失函数和评价指标
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.0,nesterov=False)

net.compile(optimizer=optimizer,
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy'])
  • 模型训练
ini 复制代码
# 模型训练:指定训练数据,batchsize,epoch,验证集
net.fit(train_images,train_labels,batch_size=128,epochs=3,verbose=1,validation_sp

模型评估

ini 复制代码
# 指定测试数据
net.evaluate(test_images,test_labels,verbose=1)

如果我们使用整个数据集训练网络,并进行评估的结果: [0.4866700246334076, 0.8395]

相关推荐
NAGNIP11 分钟前
一文搞懂量化、剪枝和知识蒸馏都是什么?
算法
点云SLAM24 分钟前
GTSAM 中自定义因子(Custom Factor)的详解和实战示例
算法·机器人·slam·后端优化·gtsam·gtsam自定义因子·因子图
萘柰奈1 小时前
LeetCode刷题记录----62.不同路径(Medium)
算法·leetcode·职场和发展
阳光明媚sunny1 小时前
爬楼梯算法java实现
算法·动态规划
贝塔实验室2 小时前
LDPC码的概念
科技·学习·程序人生·算法·学习方法·程序员创富·改行学it
weixin_307779132 小时前
矩形势阱(V(x) = -H for |x|≤L)的束缚态能级求解与宇称分类
算法
MMjeaty2 小时前
数据结构——栈和队列
数据结构·算法
机器学习之心7 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
max5006008 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
王哥儿聊AI9 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程