Pytorch【60天修炼计划】之第二阶段——进阶:卷积神经网络之AlexNet

接着我们上一个经典的卷积神经网络LeNet,我们这一篇主要记录一下深度卷积神经网络中经典模型 AlexNet,从论文中可以找到其架构:
在这里插入图片描述

  • input[ 3, 224 × 224 ] ( channels, weight * height)
  • Conv2d[ 1, 96, 11 × 11, 4, 0 ] (in_channels, out_channels, kernel_size, stride, padding)
  • Maxpool2d [96, 3 × 3, 2 ](channels, kernel_size, stride)
  • Conv2d[ 96, 256, 5 × 5, 1, 2 ](in_channels, out_channels, kernel_size, stride, padding)
  • Maxpool2d[ 256, 3 × 3, 2 ]
  • Conv2d [ 256, 384, 3 × 3, 1, 1 ]
  • Conv2d[ 384, 384, 3 × 3, 1, 1 ]
  • Maxpool2d[ 384, 3 × 3, 2 ]
  • FC [ 256 × 5 × 5, 4096 ]
  • FC[ 4096, 4096 ]
  • FC [ 4096, 10 ]

AlexNet 特点

首先在论文中,特别描述了一下ReLU激活函数,从下图(实线表示ReLU激活函数,虚线表示Tanh激活函数)对比显示随着epochs的增加,ReLU激活函数达到第训练错误率更快。
在这里插入图片描述
除此之外,ReLU激活函数的计算更简单,例如它并没有sigmoid激活函数中的求幂运算。另一方面,ReLU激活函数在不同的参数初始化方法下使模型更容易训练。这是由于当sigmoid激活函数输出极接近0或1时,这些区域的梯度几乎为0,从而造成反向传播无法继续更新部分模型参数;而ReLU激活函数在正区间的梯度恒为1。因此,若模型参数初始化不当,sigmoid函数可能在正区间得到几乎为0的梯度,从而令模型无法得到有效训练。

此外,AlexNet在防止过拟合中采用了Dropout方法(丢弃法),它用来控制全连接层的模型复杂度。


项目结构图

在这里插入图片描述

模型

按照上面对于网络结构的分解,在pytorch构建如下网络:

class AlexNet(nn.Module):
    def __init__(self):
        super(AlexNet, self).__init__()
        self.conv = nn.Sequential(
            # 第一层卷积层
            nn.Conv2d(1, 96, 11, 4, 0),# in_channels, out_channels, kernel_size, stride, padding
            nn.ReLU(),
            nn.MaxPool2d(3, 2), # kernel_size, stride
            # 第二层卷积层。减⼩卷积窗⼝,使⽤填充为2来使得输⼊与输出的⾼和宽⼀致,且增⼤输出通道数
            nn.Conv2d(96, 256, 5, 1, 2),
            nn.ReLU(),
            nn.MaxPool2d(3, 2),
            # 第三层卷积层,使用更小的卷积窗口
            nn.Conv2d(256, 384, 3, 1, 1),
            nn.ReLU(),
            # 第四层卷积层
            nn.Conv2d(384, 384, 3, 1, 1),
            nn.ReLU(),
            # 第五层卷积层
            nn.Conv2d(384, 256, 3, 1, 1),
            nn.ReLU(),
            nn.MaxPool2d(3, 2)
        )

        self.fc = nn.Sequential(
            nn.Linear(256 * 5 * 5, 4096),
            nn.ReLU(),
            # Dropout来防止过拟合
            nn.Dropout(0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(4096, 10)
        )

    def forward(self, img):
        feature = self.conv(img)
        #print(feature)
        output = self.fc(feature.view(img.shape[0], -1))
        return output

训练数据过程同LeNet,不再放出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章