基于libtorch的Alexnet深度学习网络实现——Alexnet网络结构与原理

Alexnet网络在LeNet-5网络的基础上发展起来,该网络是加深网络的开山之作,也即深度学习发展过程中的一个重要里程碑。该网络的主要创新点为:

1. 使用Relu函数作为激活函数;

2. 增加Dropout方法来避免过拟合;

3. 使用最大值池化,之前的神经网络都使用均值池化;

4. 增加LRN层来增强模型的泛化能力(本文我们先不讲LRN层,假设网络结构无此层,后续更新我们再把LRN层加上去)。

无LRN层的Alexnet网络结构如下图所示,,其主要由5个卷积层conv1~conv53个最大值池化层pool1~pool33个Affine层fc1~fc3,以及输出端的Softmax层构成。下文我们将分别讲解各层的结构、原理。

01

conv1层

conv1为Alexnet网络的输入层,将其信息列出如下:

输入:3张227*227图像(也可以理解为一张227*227的RGB彩色图,其具有三通道,每通道为1张227*227图像)。

卷积核:96个3*11*11卷积核。

卷积步长:4。

前文中我们讲过卷积步长的概念,当时我们默认步长为1,也就是默认卷积窗口自左向右、从上往下滑动的步长为1个像素点,但此处卷积步长不再是1个像素点,而是4个像素点:

卷积神经网络原理及其C++/Opencv实现(1)

填充(padding):0。

我们举个例子来说明填充操作。假设填充长度为n,那么将在矩阵左、右侧都填充n列,上、下侧都填充n行,如下图所示:

输出:96个55*55卷积结果。这里之所以得到55*55的卷积结果,可按以下公式计算:

行:(227-11)/4+1=55

列:(227-11)/4+1=55

更广泛的公式:

行:(输入行数+padding*2-卷积核行数)/卷积步长+1

列:(输入列数+padding*2-卷积核列数)/卷积步长+1

这里的卷积核为3个通道,也即维度为3*11*11,只因其输入为3通道数据,所以每通道的输入数据对应1个通道的11*11卷积核,最后把3通道数据对应位置的卷积结果相加,就是最终的卷积结果。假设卷积核为3通道的3*3矩阵,卷积步长为1,那么3通道图像中某一点的卷积操作如下图所示:

通道1的卷积结果:Σx1i*k1i,0≤i9

通道2的卷积结果:Σx2i*k2i,0≤i9

通道3的卷积结果:Σx3i*k3i,0≤i9

该点的最终卷积结果:Σx1i*k1i+Σx2i*k2i+Σx3i*k3i,0≤i9

02

pool1层

本层为最大值池化层,关于最大值池化操作、均值池化操作我们在前文讲过:

卷积神经网络原理及其C++/Opencv实现(2)

下面列出该层的信息:

输入:96张55*55的卷积结果图。

池化窗口尺寸:3*3。

池化窗口滑动步长:2个像素点。

池化模式:最大值池化。

输出尺寸:96张27*27的池化结果。这里得到的27*27尺寸与上述卷积结果的尺寸类似:

行:(55-3)/2+1=27

列:(55-3)/2+1=27

也即:

行:(输入行数-池化窗口行数)/池化窗口滑动步长+1

列:(输入列数-池化窗口列数)/池化窗口滑动步长+1

03

conv2层

conv2卷积层的信息列出如下:

输入:96张27*27图像。

卷积核:256个5*5卷积核。

卷积步长:1。

填充(padding):2。

输出:256个27*27卷积结果。

行:(27+2*2-5)/1+1=27

列:(27+2*2-5)/1+1=27

04

pool2层

本层为最大值池化层,其信息列出如下:

输入:256张27*27的卷积结果图。

池化窗口尺寸:3*3。

池化窗口滑动步长:2个像素点。

池化模式:最大值池化。

输出尺寸:256张13*13的池化结果。

行:(27-3)/2+1=13

列:(27-3)/2+1=13

05

conv3层

conv3卷积层的信息列出如下:

输入:256张13*13图像。

卷积核:384个3*3卷积核。

卷积步长:1。

填充(padding):1。

输出:384个13*13卷积结果。

行:(13+1*2-3)/1+1=13

列:(13+1*2-3)/1+1=13

06

conv4层

conv4卷积层的信息列出如下:

输入:384张13*13图像。

卷积核:384个3*3卷积核。

卷积步长:1。

填充(padding):1。

输出:384个13*13卷积结果。

行:(13+1*2-3)/1+1=13

列:(13+1*2-3)/1+1=13

07

conv5层

conv5卷积层的信息列出如下:

输入:384张13*13图像。

卷积核:256个3*3卷积核。

卷积步长:1。

填充(padding):1。

输出:256个13*13卷积结果。

行:(13+1*2-3)/1+1=13

列:(13+1*2-3)/1+1=13

08

pool3层

本层为最大值池化层,其信息列出如下:

输入:256张13*13的卷积结果图。

池化窗口尺寸:3*3。

池化窗口滑动步长:2个像素点。

池化模式:最大值池化。

输出尺寸:256张6*6的池化结果。并将256*6*6的数据按顺序展开成长度为9216的一维向量

行:(13-3)/2+1=6

列:(13-3)/2+1=6

09

fc1层

fc1层为Affine层,关于Affine层的计算过程,我们前文有讲过:

卷积神经网络原理及其C++/Opencv实现(2)

本层信息如下:

输入:长度为9216的一维向量。

输出:长度为4096的一维向量。

Dropout比例:0.5

Alexnet网络的主要创新之处就是在Affine层增加了Dropout操作来避免过拟合(如上图所示)。假设Affine层的输入为长度为n的一维向量X,那么其每个神经元的输出可按下式计算:

Dropout操作,就是随机删除X向量中一定比例的数据(也可以理解为随机将X向量中一定比例的数据清零),那么每个神经元的输出为:

Dropout操作通常删除(清零)0.5比例的输入数据,比如本层的输入数据有9216个,那么将随机删除9216*0.5=4608的数据,相当于只输入一半的数据。

10

fc2层

本层为为Affine层,与fc1层类似,也包含了Dropout操作:

输入:长度为4096的一维向量。

输出:长度为4096的一维向量。

Dropout比例:0.5

Dropout操作删除(清零)0.5比例的输入数据,本层的输入数据有4096个,那么将随机删除4096*0.5=2048的数据,相当于只输入2048个数据。

11

fc3层

本层为全连接层,包含了Affine层和Softmax层,不过其Affine层的输出不需要再经过Relu函数了,而是直接输出到Softmax层,转换为0~1的概率值。

输入:长度为4096的一维向量。

输出:长度为1000的一维向量。

关于Softmax层的计算,我们前文也有讲过:

卷积神经网络原理及其C++/Opencv实现(2)

Alexnet网络输出1000个概率值,实际使用中,我们可以根据实际情况修改,比如我们如果分类cifa-10数据,总共只有10个分类,那么把该层的输出由1000改为10即可。

本文我们就讲到这里,下篇文章来我们将使用libtorch来实现本文所讲的网络结构,并使用实现的网络对Cifar-10数据集进行训练、分类。

欢迎扫码关注以下微信公众号,接下来会不定时更新更加精彩的内容噢~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌萌哒程序猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值