作为深度学习的开山之作AlexNet,给后来的研究者们带来了很大的启发。它首次在两块GTX 580 GPU上做神经网络,并且在2012年ImageNet竞赛中取得了冠军。这一成就为深度学习的兴起奠定了重要基础,也为现在的显卡公司NVIDIA的市值超越苹果贡献了一份功劳。
下面将介绍AlexNet的网络结构和论文复现。实验内容为使用AlexNet网络进行猫狗分类任务,包括模型搭建、训练、测试以及结果分析。
网络结构
AlexNet的网络一共有8层,前5层是卷积层,剩下3层是全连接层。具体结构如下:
第一层至第五层为卷积层,分别进行卷积和池化操作。第六至第八层为全连接层,最终输出softmax为1000,对应ImageNet竞赛的分类个数。
数据集
实验使用的数据集为包含猫狗图片的数据集,其中猫的图片有12500张,狗的图片也有12500张。训练数据集包括猫和狗各12300张,验证集和测试集各包括猫和狗各100张。数据集链接: https://pan.baidu.com/s/11UHodPIHRDwHiRoae_fqtQ 提取码:d0fa。
数据集分类
将数据集中的猫和狗分别放在train_0和train_1文件夹中。
import os
import re
import shutil
origin_path = '/workspace/src/how-to-read-paper/dataset/train'
target_path_0 = '/workspace/src/how-to-read-paper/dataset/train_0/0'
target_path_1 = '/workspace/src/how-to-read-paper/dataset/train_0/1'
os.makedirs(target_path_0, exist_ok=True)
os.makedirs(target_path_1, exist_ok=True)
file_list = os.listdir(origin_path)
for i in range(len(file_list)):
old_path = os.path.join(origin_path, file_list[i])
result = re.findall(r'\w+', file_list[i])[0]
if result == 'cat':
shutil.move(old_path, target_path_0)
else:
shutil.move(old_path, target_path_1)
模型搭建
进行模型搭建和数据导入:
import torch
# 其他相关库的导入
# 超参数设置
# 卷积层和全连接层的定义
# 训练集、测试集、验证集的导入
# 归一化处理
# 数据加载器的设置
训练
进行模型训练:
# 定义模型
# 优化器的选择
# 训练集训练
# 验证集进行验证
# 开始训练
测试
进行模型测试:
# 验证集的test_loss
# 取最好的模型进行测试
# 输出测试集准确率
实验结果分析
实验结果显示,使用最优的模型进行测试时,测试集的准确率分别为89.0%和91.5%。从实验结果可以看出,模型在epoch=20时已经表现良好。为了训练一个更好的模型,可以尝试数据增强、使用正则化项、噪声注入等方法。
注:本实验代码地址