美文网首页
AlexNet详解

AlexNet详解

作者: 风之旅人c | 来源:发表于2019-07-13 21:39 被阅读0次

    本篇博文主要介绍AlexNet以及利用PyTorch实现AlexNet训练CIFAR10数据集,最终在CIFAR10实现了75%的识别率。

    AlexNet详解

      AlexNet的网络结构分为5个卷积层和三个全连接层,原文中因为显存原因使用了两块GPU,现在我们使用1块GPU,AlexNet是VGGNet、GoogLeNet、ResNet、DenseNet等经典网络的基础和开端。

    AlexNet的创新点

    Relu作为激活函数

      在最初的模型中,输入和输出的关系一般如下所示:
    y=\sum w_ix_i+b_i
      这样仅仅是纯粹的线性关系,具有较大的局限性,即使有多层网络,也难以拟合出
    后来我们引入了SigmoidReLu函数,相关的激活函数可以看[常用的激活函数].

    数据增强

    AlexNet中对数据做了以下操作:

    1. 随机裁剪,对256×256的图片进行随机裁剪到227×227,然后进行水平翻转。
    2. 测试的时候,对左上、右上、左下、右下、中间分别做了5次裁剪,然后翻转,共10个裁剪,之后对结果求平均。
    3. 对RGB空间做PCA(主成分分析),然后对主成分做一个(0, 0.1)的高斯扰动,也就是对颜色、光照作变换,结果使错误率又下降了1%。

    层叠池化

      在AlexNet中,池化是可重叠的,每次池化单元移动的步长小于自身的大小。

    局部相应归一化

    Dropout

    AlexNet的网络结构

    AlexNet的网络包含5层卷积层和3层全连接层。


    卷积层结构
    全连接层结构

    AlexNet网络代码如下(训练CIFAR10数据集)

    class AlexNet(nn.Module):
        def __init__(self, num_classes=NUM_CLASSES):
            super(AlexNet, self).__init__()
            self.features = nn.Sequential(
                nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2),
                nn.Conv2d(64, 192, kernel_size=3, padding=1),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2),
                nn.Conv2d(192, 384, kernel_size=3, padding=1),
                nn.ReLU(inplace=True),
                nn.Conv2d(384, 256, kernel_size=3, padding=1),
                nn.ReLU(inplace=True),
                nn.Conv2d(256, 256, kernel_size=3, padding=1),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2),
            )
            self.classifier = nn.Sequential(
                nn.Dropout(),
                nn.Linear(256 * 2 * 2, 4096),
                nn.ReLU(inplace=True),
                nn.Dropout(),
                nn.Linear(4096, 4096),
                nn.ReLU(inplace=True),
                nn.Linear(4096, num_classes),
            )
    
        def forward(self, x):
            x = self.features(x)
            x = x.view(x.size(0), 256 * 2 * 2)
            x = self.classifier(x)
            return x
    

    特别说明:
    1.Conv2d的参数说明:

    nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True)
    

      在nn.Conv2d中,in_channels表示输入数据体的深度,out_channel。表示输出数据体的深度,kernel_size表示卷积核的大小,stride表示滑动的步长,padding表示边界填充0的个数,dilation表示输入数据体的空间间隔,groups表示输入数据体和输出数据体在深度上的关联,bias表示偏置。

    相关文章

      网友评论

          本文标题:AlexNet详解

          本文链接:https://www.haomeiwen.com/subject/wwqfkctx.html