使用Pytorch实现AlexNet
AlexNet结构
input是224×224x3,此处padding应为[1,2],即在特征矩阵左边加上一列0,右边加上两列0,上面加上一列0,下面加上两列0
特点
- 使用Relu替换之前的sigmoid的作为激活函数
- 使用数据增强Data Augmentation抑制过拟合,比如增加噪声,翻转,随机裁剪等
- 使用LRN局部响应归一化
- 在全连接层使用Dropout随机失活防止过拟合
- 使用两块GPU 进行并行计算
第一层
Conv1的处理流程是: 卷积–>ReLU–>池化–>归一化。
- 卷积,input是224×224x3,此处padding应为[1,2],即在特征矩阵左边加上一列0,右边加上两列0,上面加上一列0,下面加上两列0.使用48*2=96个11×11×3的卷积核,stride=4得到的FeatureMap为55×55×96,即output.{( 224-11+(1+2))/4+1=55}
- ReLU,将卷积层输出的FeatureMap输入到ReLU函数中,即input是55×55×96.
- 池化Maxpool1,使用3×3步长为2的池化单元,padding=0(重叠池化,步长小于池化单元的宽度),输出为27×27×96 {55−3)/2+1=27}
- 局部响应归一化,使用k=2,n=5,α=10−4,β=0.75进行局部归一化,输出的仍然为27×27×96,输出分为两组,每组的大小为27×27×48
第二层
Conv2的处理流程是:卷积–>ReLU–>池化–>归一化
- 卷积,输入是2组27×27×48。使用2组,每组128个,尺寸为5×5×48的卷积核,并作了边缘填充padding=2,卷积的步长stride=1. 则输出的FeatureMap为2组,每组的大小为27×27x128. {(27+2∗2−5)/1+1=27}
- ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
- 池化运算的尺寸为3×3,步长为2,padding=0,池化后图像的尺寸为(27−3)/2+1=13,输出为13×13×256
- 局部响应归一化,使用k=2,n=5,α=10−4,β=0.75进行局部归一化,输出的仍然为13×13×256,输出分为2组,每组的大小为13×13×128
第三层
Conv3的处理流程是: 卷积–>ReLU
- 卷积,输入是13×13×256,使用2组共384,尺寸为3×3×2563的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13x384
- ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
第四层
Conv4和Conv3类似
- 卷积,输入是13×13×384,分为两组,每组为13×13×192.使用2组,每组192个尺寸为3×3×192的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13x384,分为两组,每组为13×13×192
- ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
第五层
Conv5处理流程为:卷积–>ReLU–>池化
- 卷积,输入为13×13×384,分为两组,每组为13×13×192。使用2组,每组为128,尺寸为3×3×192的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13×256
- ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
- 池化,池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为 (13−3)/2+1=6,即池化后的输出为6×6×256
第六层
FC6全连接 -->ReLU -->Dropout
- 卷积->全连接:
输入为6×6×256,该层有4096个卷积核,每个卷积核的大小为6×6×256。由于卷积核的尺寸刚好与待处理特征图(输入)的尺寸相同,即卷积核中的每个系数只与特征图(输入)尺寸的一个像素值相乘,一一对应,因此,该层被称为全连接层。由于卷积核与特征图的尺寸相同,卷积运算后只有一个值,因此,卷积后的像素层尺寸为4096×1×1,即有4096个神经元。 - ReLU,这4096个运算结果通过ReLU激活函数生成4096个值
- Dropout,抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元
第七层
FC7全连接–>ReLU–>Dropout
- 全连接,输入为4096的向量
- ReLU,这4096个运算结果通过ReLU激活函数生成4096个值
- Dropout,抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元
第八层
最后一步不进行失活
第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出1000个float型的值,这就是预测结果。
参数表
数据准备
数据集下载
(此处膜拜一波大佬)-----------太阳花的小绿豆
具体实现(由于原文是使用两块GPU进行并行运算,此处我们之分析一半的模型)
model.py
import torch.nn as nn
import torch
'''
使用nn.Sequential, 将一系列的层结构打包,形成一个整体
'''
class AlexNet(nn.Module):
def __init__(self, num_classes=1000, init_weights=False):
super(AlexNet, self).__init__()
# 专门用来提取图像特征
self.features = nn.Sequential(
nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2), # input[3, 224, 224] output[48, 55, 55]
nn.ReLU(inplace=True), # inPlace=True, 增加计算量减少内存使用的一个方法
nn.MaxPool2d(kernel_size=3, stride=2), # output[48, 27, 27]
nn.Conv2d(48, 128, kernel_size=5, padding=2), # output[128, 27, 27]
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 13, 13]
nn.Conv2d(128, 192, kernel_size=3, padding=1), # output[192, 13, 13]
nn.ReLU(inplace=True),
nn.Conv2d(192, 192, kernel_size=3, padding=1), # output[192, 13, 13]
nn.ReLU(inplace=True),
nn.Conv2d(192, 128, kernel_size=3