动手学深度学习之卷积神经网络进阶(ModernCNN)

本文是基于《动手学深度学习》的笔记,深入探讨了深度卷积神经网络,包括AlexNet、VGG、NiN和GoogLeNet。AlexNet首次证明了学习到的特征胜过手工设计,采用ReLU激活函数和数据增强来缓解过拟合。VGG通过重复的基础块构建深度模型,NiN则用1x1卷积层替代全连接层。GoogLeNet利用Inception模块并行抽取信息,降低模型复杂度。文章还提供了相应的PyTorch实现代码。
摘要由CSDN通过智能技术生成

参考伯禹学习平台《动手学深度学习》课程内容内容撰写的学习笔记
原文链接:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV/lesson/T5r2YnM8A4vZpxPUbCQSyW
感谢伯禹平台,Datawhale,和鲸,AWS给我们提供的免费学习机会!!
总的学习感受:伯禹的课程做的很好,课程非常系统,每个较高级别的课程都会有需要掌握的前续基础知识的介绍,因此很适合本人这种基础较差的同学学习,建议基础较差的同学可以关注伯禹的其他课程:
数学基础:https://www.boyuai.com/elites/course/D91JM0bv72Zop1D3
机器学习基础:https://www.boyuai.com/elites/course/5ICEBwpbHVwwnK3C
该内容与卷积神经网络基础,lenet为系列内容,建议相互参考学习。

深度卷积神经网络(AlexNet)

LeNet: 在大的真实数据集上的表现并不尽如⼈意。
1.神经网络计算复杂。
2.还没有⼤量深⼊研究参数初始化和⾮凸优化算法等诸多领域。

机器学习的特征提取:手工定义的特征提取函数
神经网络的特征提取:通过学习得到数据的多级表征,并逐级表⽰越来越抽象的概念或模式。

神经网络发展的限制:数据、硬件
(比如说神经网络,第一层就会用来识别图形的边边角角,第二层会组合出各种花纹轮廓,第三层就会发现物品,直到最后完成整个分类任务,这些参数都是通过学习得到的。但是在很长一段时间里,神经网络方法都比不上SVM这些机器学习的方法,因为神经网络它会需要非常大的数据量,并且对硬件的计算要求非常高,直到AlexNet的出现)

AlexNet

首次证明了学习到的特征可以超越⼿⼯设计的特征,从而⼀举打破计算机视觉研究的前状。
特征:

  1. 8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。
  2. 将sigmoid激活函数改成了更加简单的ReLU激活函数。
  3. 用Dropout来控制全连接层的模型复杂度。***(防止过拟合的问题,用dropout做稀疏,增加模型泛化能力)***
  4. 引入数据增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。

Image Name

区别:使用的数据集不同,leNet(MINIST),AlexNet(IMAGENET)
通道数:多的通道数代表的是更多的特征
Relu的倒数是常数,计算更快,收敛更快,sigmoid函数可能会梯度消失的问题。

#目前GPU算力资源预计17日上线,在此之前本代码只能使用CPU运行。
#考虑到本代码中的模型过大,CPU训练较慢,
#我们还将代码上传了一份到 https://www.kaggle.com/boyuai/boyu-d2l-modernconvolutionalnetwork
#如希望提前使用gpu运行请至kaggle。

import time
import torch
from torch import nn, optim
import torchvision
import numpy as np
import sys
sys.path.append("/home/kesci/input/")
import d2lzh1981 as d2l
import os
import torch.nn.functional as F

device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)

class AlexNet(nn.Module):
def init(self):
super(AlexNet, self).init()
self.conv = nn.Sequential(
nn.Conv2d(1, 96, 11, 4), # in_channels, out_channels, kernel_size, stride, padding(默认0)
nn.ReLU(),
nn.MaxPool2d(3, 2), # kernel_size, stride
# 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数(上下左右各加2)
nn.Conv2d(96, 256, 5, 1, 2),
nn.ReLU(),
nn.MaxPool2d(3, 2),
# 连续3个卷积层,且使用更小的卷积窗口。除了最后的卷积层外,进一步增大了输出通道数。
# 前两个卷积层后不使用池化层来减小输入的高和宽
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)
)
# 这里全连接层的输出个数比LeNet中的大数倍。使用丢弃层来缓解过拟合
self.fc = nn.Sequential(
nn.Linear(25655, 4096), #(输入神经元的个数,输出神经元的个数)5*5feature map宽和高
nn.ReLU(),
n

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值