X2Paddle:手把手教你迁移代码——论文复现方法论
使用飞桨复现论文的基本方法以及基本步骤。本文是飞桨论文复现打卡营第3期课程第二天《飞桨论文复现方法论》的笔记,以AlexNet为例进行复现。
一、通读论文
要想复现论文,首先需要看懂这篇论文做了什么,他的创新点是什么。
以AlexNet为例,其对应论文:《ImageNet Classification with Deep Convolutional Neural Networks》
通过阅读论文,可以知道AlexNet网络结构在整体上类似于LeNet,都是先卷积然后在全连接。但在细节上有很大不同。AlexNet更为复杂,有6000万个参数和65000个神经元,五层卷积,三层全连接网络,最终的输出层是1000通道的softmax。AlexNet利用了两块GPU进行计算,大大提高了运算效率,其架构如下图所示:
它的创新点主要有以下几点:
- 首次引入ReLU激活函数
- 之前都是tanh和sigmoid激活函数,收敛慢且效果不好,用ReLU可以保证很多权重梯度不消失,且计算量更少,效果更好
- 首次使用多个GPU并行训练
- 由于当时的GPU设备显存较小, AlexNet使用了两个GPU并行计算
- overlapping pooling
- 滑动窗口大于滑动步长,可以避免过拟合,进一步提升精度
- 使用Dropout
- 该技术可以减少神经元之间的相互依赖性。因此,模型被强制学习更加稳健的特征
二、原始代码解析
论文发表以后,论文作者一般都会在GitHub上开源自己的代码,我们可以先去看看论文作者的代码,并将其跑通。
以AlexNet为例,其用Pytorch实现的对应代码:https://github.com/littletomatodonkey/AlexNet-Prod/tree/master/AlexNet-torch,其核心是train.py这个文件。
!git clone https://gitee.com/AI-Mart/AlexNet-Prod.git
Cloning into 'AlexNet-Prod'...
remote: Enumerating objects: 62, done.[K
remote: Counting objects: 100% (62/62), done.[K
remote: Compressing objects: 100% (40/40), done.[K
remote: Total 62 (delta 20), reused 62 (delta 20), pack-reused 0[K
Unpacking objects: 100% (62/62), done.
Checking connectivity... done.
!tree AlexNet-Prod/AlexNet-torch
AlexNet-Prod/AlexNet-torch
├── presets.py
├── torchvision
│ ├── datasets
│ │ ├── folder.py
│ │ ├── __init__.py
│ │ └── vision.py
│ ├── _internally_replaced_utils.py
│ ├── models
│ │ ├── alexnet.py
│ │ └── __init__.py
│ └── transforms
│ ├── autoaugment.py
│ ├── functional_pil.py
│ ├── functional.py
│ ├── functional_tensor.py
│ ├── __init__.py
│ └── transforms.py
├── train.py
├── train.sh
└── utils.py
4 directories, 16 files
direct