美文网首页
经典卷积神经网络——AlexNet

经典卷积神经网络——AlexNet

作者: 小黄不头秃 | 来源:发表于2022-09-06 00:06 被阅读0次

    (一)AlexNet的简介

    这也是一个远古网络(2012年左右),但是他掀起了一波机器学习的浪潮。一个里程碑意义的网络。

    我们可以看一下这些年来随着机器学习的发展,同时硬件的发展情况。在上世界八九十年代的时候,神经网络兴起,但由于算力问题,逐渐被核方法所取代。一直发展到2010年左右,随着算力的逐渐增强,神经网络又重新焕发出强大的生命力。

    数据的大小也在逐渐的发展,从一开始的手写数字识别的MNIST(6k,28,28)数据集一直发展到imagenet(1.2m,469,387)的数据集。可见数据集的大小在飞速增长,识别的类也从10类增加到1000类.

    AlexNet赢得了2012年的imageNet竞赛的冠军。相较于从前的LeNet,它更深更大,引入了丢弃法,relu,maxpooling等

    可以比较一下,这一代的神经网络和LeNet的改变。

    激活函数从原来的sigmoid改为relu,在一定程度上减缓了梯度消失。全连接层后加入了dropout防止过拟合。并且做了数据增强。

    (二)代码实现

    这里的数据集仍然使用MNIST,所以通道数还是1哈,如果是最初的AlexNet应该通道数设为3。

    import torch
    from torch import nn
    from torchvision import transforms
    import torchvision
    from torch.utils import data
    from d2l import torch as d2l
    import numpy as np
    import matplotlib.pyplot as plt
    
    net = nn.Sequential(
        # 这里,我们使用一个11*11的更大窗口来捕捉对象。
        # 同时,步幅为4,以减少输出的高度和宽度。
        # 另外,输出通道的数目远大于LeNet
        nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        # 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数
        nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        # 使用三个连续的卷积层和较小的卷积窗口。
        # 除了最后的卷积层,输出通道的数量进一步增加。
        # 在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度
        nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
        nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
        nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        nn.Flatten(),
        # 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合
        nn.Linear(6400, 4096), nn.ReLU(),
        nn.Dropout(p=0.5),
        nn.Linear(4096, 4096), nn.ReLU(),
        nn.Dropout(p=0.5),
        # 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000
        nn.Linear(4096, 10))
    
    print(net)
    
    x = torch.randn(1,1,224,224)
    
    for layer in net:
        x = layer(x)
        print(layer.__class__.__name__,"output shape:",x.shape)
    
    # 现在使用mnist数据集测试一下结果
    def load_data_fashion_mnist(batch_size, resize=None):
        """下载或者加载Fashion-MNIST数据集"""
        trans = [transforms.ToTensor()]
        if resize:
            # 需要把图片拉长,正常时不会这么做的
            trans.insert(0, transforms.Resize(resize))
        trans = transforms.Compose(trans) # 这是一步可以去掉的操作,这个就是把多个图像处理的步骤整合到一起
        mnist_train = torchvision.datasets.FashionMNIST(
            root="../data/",
            train=True,
            transform=trans,
            download=False # 要是没下载过就选择true
        )
        mnist_test = torchvision.datasets.FashionMNIST(
            root="../data/",
            train=False,
            transform=trans,
            download=False # 要是没下载过就选择true
        )
        return (data.DataLoader(mnist_train,batch_size=batch_size,shuffle=True,num_workers=0),
                data.DataLoader(mnist_test,batch_size=batch_size,shuffle=True,num_workers=0))
    
    
    # 超参数设置
    batch_size = 64
    learning_rate = 0.01
    epochs = 10
    train_iter,test_iter = load_data_fashion_mnist(batch_size=batch_size,resize=224)
    d2l.train_ch6(net,train_iter,test_iter,epochs,lr=learning_rate,device=d2l.try_gpu())
    # 2G显卡,用时45min 17.9s。哭死
    
    train acc 0.901, test acc 0.897

    相关文章

      网友评论

          本文标题:经典卷积神经网络——AlexNet

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