当前位置: 首页 > article >正文

[动手学习深度学习]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上是3
    nn.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优化器

完整代码

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


http://www.kler.cn/a/587059.html

相关文章:

  • 神经网络的基本知识
  • 补充二分LIS
  • 【公务员考试】高效备考指南
  • 2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题F卷
  • 【C++】—— 一篇文章解决面试 继承菱形继承
  • A SURVEY ON POST-TRAINING OF LARGE LANGUAGE MODELS——大型语言模型的训练后优化综述——第一部分
  • 加密算法逆向与HOOK技术实战
  • OpenHarmony子系统开发 - ArkCompiler开发指导
  • matlab 控制系统GUI设计-PID控制超前滞后控制
  • 打靶日记Kioptix Level 4
  • vue项目如何实现条件查询?
  • 贪吃蛇小游戏-简单开发版
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-2-性能调优工具箱
  • 路由器和网关支持边缘计算
  • 无需归一化的Transformers:神经网络设计的突破
  • 单元测试、系统测试、集成测试
  • MySQL数据库知识总结
  • Java 大视界 -- Java 大数据在智能金融资产定价与风险管理中的应用(134)
  • install of jenkins-2.501-1.1.noarch conflicts with file
  • 【redis】hash 类型应用场景