欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-06 17:30:54
...

接着我们上一个经典的卷积神经网络LeNet,我们这一篇主要记录一下深度卷积神经网络中经典模型 AlexNet,从论文中可以找到其架构:
Pytorch【60天修炼计划】之第二阶段——进阶:卷积神经网络之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**函数达到第训练错误率更快。
Pytorch【60天修炼计划】之第二阶段——进阶:卷积神经网络之AlexNet
除此之外,ReLU**函数的计算更简单,例如它并没有sigmoid**函数中的求幂运算。另一方面,ReLU**函数在不同的参数初始化方法下使模型更容易训练。这是由于当sigmoid**函数输出极接近0或1时,这些区域的梯度几乎为0,从而造成反向传播无法继续更新部分模型参数;而ReLU**函数在正区间的梯度恒为1。因此,若模型参数初始化不当,sigmoid函数可能在正区间得到几乎为0的梯度,从而令模型无法得到有效训练。

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


项目结构图

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

模型

按照上面对于网络结构的分解,在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,不再放出。

相关标签: Pytorch CNN