欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > [动手学习深度学习]24. AlexNet

[动手学习深度学习]24. AlexNet

2025/3/16 20:14:25 来源:https://blog.csdn.net/yuri5151/article/details/146250854  浏览:    关键词:[动手学习深度学习]24. AlexNet

发展介绍

AlexNet是引起深度学习热潮的第一个网络,2012年左右的网络
理解深度学习发展,可以先看硬件的发展过程:
请添加图片描述
可以看出近几年,计算比数据发展的要快
因为计算和数据不一样的速度,导致了很多模型的区别

  • 在90年代的时候,当速数据不够大,计算速度也比较均匀的时候,用的是神经网络,因为神经网络是相对比较便宜的框架
  • 在2000年的时候,CPU、内存性能提高,数据虽然有增加但相对还是原规模,此时核方法是最优的方法,因为核方法相对简单 且 此时硬件规模可以跑通核方法
  • 现在又回到了神经网络,因为计算量更多了,可以构造更深的神经网络

ImageNet

这几年深度神经网络能发展起来,数据起到一个非常重要的作用
这就要提到经典数据集:ImageNet
是2010年的数据集,还是分类任务
但是与mnist数据集存在区别:
请添加图片描述
(样本数是比较多的,但是取在竞赛上的类数是1000类,有120w个样本)

在第三次ImageNet竞赛上(2012年)AlexNet拿到了冠军

AlexNet

  • 本质是更大更深的LeNet(在架构上没有明显区别)
    在这里插入图片描述
  • 这里的提升不仅是更大更深,更多的是观念上的改变:量变引起质变
  • 深度学习相对于传统机器学习最主要的改变:
    不去思考如何人工抽取特征,而是通过端到端的学习,直接通过原始的数据到最终的结果
    • 机器学习:专家提取特征
    • 深度学习:CNN学习特征为softmax回归提供数据

AlexNet架构

  • AlexNet和LeNet对比(图片错误:注意LeNet第二从不用padding)
    在这里插入图片描述
    • 第一个卷积层:
      (注意LeNet第二从不用padding)
      • AlexNet使用更大的核窗口(1111)、通道数、步长
        核窗口:因为图片更大了,一个5
        5的窗口能看的东西变少了,故需要更大的窗口去看更多的内容
        通道数:从6变成了96,要在第一层识别更多的模式
        步长:当时CPU计算没那么快且内存小,如果stride不够大,后续计算会变得非常难
    • 第一个池化层:
      • 更大的池化层
        • 2*2:允许一个像素往一边偏移一点点,不会影响模式输出
        • 3*3:允许往左移或往右移,都不影响输出
      • 使用最大池化
        在这里插入图片描述
    • AlexNet使用了更多的输出通道(16变256):认为应该学习更多的特征
    • 后面池化层用来3*3的最大池化,步长=2,让输入的高宽减半
    • 后面新加了3个卷积层,都是用3*3的卷积层,通道增加到了384,最后再用池化层
      在这里插入图片描述
    • LeNet是在两个卷积层之后是用了两个隐藏层,最后再到softmax做回归
      隐藏层120,然后到84,最后是10作输出
    • AlexNet也用了2个隐藏层,但是隐藏层大小变到了4096

更多细节

  • 激活函数从sigmoid变成了ReLu(ReLu可以减缓梯度消失)
    因为梯度比较大,且在值比较大的时候正向梯度总是为1的,且ReLu在零点处一阶导数=1,所以相对容易数值稳定
  • 隐藏全连接层(两个2096)后加入了丢弃层(Dropout层),来做模型的正则化
  • AlexNet做了数据增强
    觉得120w数据不够大,拿到图片后进行变换,比如进行截取、亮度变换、色温变换
    (因为卷积对位置、光照比较敏感,想让他不敏感,所以在输入时可以增加更多的变种)
    在这里插入图片描述

复杂度对比

在这里插入图片描述

总结

  • AlexNet是更大更深的LeNet,10x参数个数,260x计算复杂度
  • 新加入了dropout、ReLu、最大池化层、数据增强
  • AlexNet赢下2012年ImageNet竞赛后,标志着新一轮神经网络热潮的开始

代码

自定义简单实现

import torch
from torch import nn
from d2l import torch as d2l# 这里用的是fashion_mnist数据集
# 因为ImageNet数据集太大了,训练比较难,时间长,所以这里用了个小数据集进行测试# 和LeNet没有本质区别,都是直接穿起来,所以也用Sequential
net = nn.Sequential(# 起始是五个卷积nn.Conv2d(1, 96, kernel_size = 11, stride=4, padding=1), # 因为这里用的是fashion_mnist,所以输入通道数是1,但是在ImageNet上是3nn.ReLU(),nn.MaxPool2d(kernel_size=3,stride=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,384,kernel_size = 3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=3, stride=2),# 后续是全连接层nn.Flatten(), # 这里是将前面的输出展平,拉成2d形状nn.Linear(9600,4096), nn.ReLU(), # 这里的384看的是上一层的输出,后面的5*5是因为前面有5次最大池化nn.Dropout(0.5),nn.Linear(4096,4096), nn.ReLU(), nn.Dropout(0.5),nn.Linear(4096, 10)
)# 构造一个单通道数据,观察每层形状变化
X = torch.randn(1,1,224,224)
for layer in net:X = layer(X)print(layer.__class__.__name__, 'output shape:\t', X.shape)# 训练Fashion-MNIST
batch_size = 128
# 因为Fashion-MNIST的图片大小是28*28,低于ImageNet,所以这里resize成224*224,模拟ImageNet
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)lr, num_epochs = 0.01, 10
optimizer = torch.optim.Adam(net.parameters(), lr=lr) # 这里用的是Adam优化器

完整代码

(完整训练代码后续更新)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词