使用深度卷积神经网络进行ImageNet图像分类
目录
1.引言
2012年被认为是深度学习复兴之始,当时来自多伦多大学的Hinton(深度学习三巨头之一)和他的学生Alex Krizhevsky提出了一个名叫“AlexNet”的神经网络结构,该结构在当年的ImageNet LSVRC-2012竞赛一举夺冠,并以此开启了深度学习的热潮。
2.网络结构
网络包含8个层:前5层为卷积层,后3层为全连接层,最后一个全连接层的输出被送到一个1000路的softmax分类器。
2.1 小细节
- 原论文中,AlexNet的输入图像尺寸是224x224x3,但是实际图像尺寸为227x227x3。
- 因为计算量太大,使用了两台GPU进行训练,并只在确定的层之间交互(注意看卷积核映射虚线:第2、第4和第5个卷积层的内核,仅连接到位于同一GPU上的前一层中的内核映射,第三个卷积层的内核连接到第二层的所有内核映射。)
(最好跟着流程算一遍)
2.2 代码部分
#01:定义网络结构:在__init__构造函数中申明各个层的定义,在forward中实现层之间的连接关系
class AlexNet(nn.Module):
def __init__(self,num_classes):
super().__init__()
self.conv1=nn.Sequential(
nn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4, padding=0),
nn.BatchNorm2d(96), #BN加在激活函数前面或后面
nn.ReLU(inplace=True), #inplace=True将上层网络传递下来的tensor直接进行修改,来节省运算内寸
nn.MaxPool2d(kernel_size=3, stride=2)
)
self.conv2=nn.Sequential(
nn.Conv2d(in_channels=96, out_channels=256, kernel_size=5, stride=1,padding=2), nn.BatchNorm2d(256),
nn.BatchNorm2d(256)
nn.ReLU(inplace=True),
nn.MaxPool2d(3,2)
)
self.conv3=nn.Sequential(
nn.Conv2d(in_channels=256,out_channels=384,kernel_size=3,stride=1,padding=1),
nn.BatchNorm2d(384),
nn.ReLU(inplace=True)
)
self.conv4=nn.Sequential(
nn.Conv2d(in_channels=384,out_channels=384,kernel_size=3,stride=1,padding=1),
nn.BatchNorm2d(384),
nn.ReLU(inplace=True)
)