【CNN】深度卷积神经网络(AlexNet)是什么?如何实现AlexNet?

news2024/11/29 22:52:50

系列文章目录

第二章 深度学习 CNN中的深度卷积神经网络(AlexNet)


目录

系列文章目录

文章目录

前言

一、深度卷积神经网络(AlexNet)是什么?

二、AlexNet的网络结构

三、实现AlexNet模型

总结


前言

本文主要是介绍卷积神经网络中的深度卷积神经网络(AlexNet),它包含对深度卷积神经网络(AlexNet)一个简单的介绍,以及如何实现LeNet?读完这篇文章,你会对卷积神经网络(LeNet)有个基本的了解。


一、深度卷积神经网络(AlexNet)是什么?

深度卷积神经网络(AlexNet)是在2012年提出来的。这个模型的名字来源于论文第一作者的姓名Alex Krizhevsky 。AlexNet使用了8层卷积神经网络,并以很大的优势赢得了ImageNet 2012图像识别挑战赛。

AlexNet与LeNet的设计理念非常相似,但也有显著的区别,下面我们会提到。

 Krizhevsky, A., Sutskever, I., & Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. In Advances in neural information processing systems (pp. 1097-1105).

二、AlexNet的网络结构

我们来了解下AlexNet的网络结构,如下图所示:

可以看出AlexNet与LeNet的网络结构非常相似,这里我们重点阐述两者的区别,从而了解AlexNet的网络结构。(如果需要了解LeNet网络可以参考:(3条消息) 【CNN】卷积神经网络(LeNet)是什么?如何实现LeNet?_晓亮.的博客-CSDN博客icon-default.png?t=N3I4https://blog.csdn.net/m0_51816252/article/details/130657443

第一,与相对较小的LeNet相比,AlexNet包含8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。

AlexNet第一层中的卷积窗口形状是11×11。因为ImageNet中绝大多数图像的高和宽均比MNIST图像的高和宽大10倍以上,ImageNet图像的物体占用更多的像素,所以需要更大的卷积窗口来捕获物体。

第二层中的卷积窗口形状减小到5×5,之后全采用3×3。此外,第一、第二和第五个卷积层之后都使用了窗口形状为3×3、步幅为2的最大池化层。而且,AlexNet使用的卷积通道数也大于LeNet中的卷积通道数数十倍。最后一个卷积层的是两个输出个数为4096的全连接层。

第二,AlexNet将sigmoid激活函数改成了更加简单的ReLU激活函数。

一方面,ReLU激活函数的计算更简单,例如它并没有sigmoid激活函数中的求幂运算。另一方面,ReLU激活函数在不同的参数初始化方法下使模型更容易训练。这是由于当sigmoid激活函数输出极接近0或1时,这些区域的梯度几乎为0,从而造成反向传播无法继续更新部分模型参数;而ReLU激活函数在正区间的梯度恒为1。因此,若模型参数初始化不当,sigmoid函数可能在正区间得到几乎为0的梯度,从而令模型无法得到有效训练。

第三,AlexNet通过丢弃法(dropout)来控制全连接层的模型复杂度。而LeNet并没有使用丢弃法。

第四,AlexNet引入了大量的图像增广,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。

三、实现AlexNet模型

这里我们直接使用sequential来构造模型:

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
            nn.ReLU(),
            nn.MaxPool2d(3, 2), # kernel_size, stride
            # 减小卷积窗口,使用填充为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(256*5*5, 4096),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(),
            nn.Dropout(0.5),
            # 输出层。
            nn.Linear(4096, 1000),
        )

    def forward(self, img):
        feature = self.conv(img)
        output = self.fc(feature.view(img.shape[0], -1))
        return output

创建完模型后,我们可以输入下面代码来查看每个层的形状。

net = AlexNet()

print(net)

这里我直接给出输出结果:

AlexNet(
  (conv): Sequential(
    (0): Conv2d(1, 96, kernel_size=(11, 11), stride=(4, 4))
    (1): ReLU()
    (2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
    (3): Conv2d(96, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (4): ReLU()
    (5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
    (6): Conv2d(256, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (7): ReLU()
    (8): Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU()
    (10): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (11): ReLU()
    (12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (fc): Sequential(
    (0): Linear(in_features=6400, out_features=4096, bias=True)
    (1): ReLU()
    (2): Dropout(p=0.5)
    (3): Linear(in_features=4096, out_features=4096, bias=True)
    (4): ReLU()
    (5): Dropout(p=0.5)
    (6): Linear(in_features=4096, out_features=1000, bias=True)
  )
)

我们可以看见模型包含8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。


总结

读完这篇文章,我相信你已经对深度卷积神经网络(AlexNet)有了一个基本的了解了,AlexNet的出现,它首次证明了学习到的特征可以超越手工设计的特征,这在当时是一个很大的突破。希望大家读完这篇文章能够有所收获。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在autoDL上运行github的代码

大佬们的教程:(249条消息) AutoDL使用教程:1)创建实例 2)配置环境上传数据 3)PyCharm2021.3专业版下载安装与远程连接完整步骤 4)实时查看tensorboard曲线情况_孟孟单单的博客-CSDN博客 (227条消息) 「炼丹…

智能的本质人工智能与机器人领域的64个问题

以艾伦纽厄尔(Allen Newell)和赫伯特西蒙(Herbert Simon)为代表,他们基本上倾向于智能已经达到数理逻辑的最高形式,并将符号处理作为研究重点,他们共同发表了著名论文《逻辑理论家》&#xff08…

“灵光一现”的动态特征:EEG研究

导读 尤里卡效应(Eureka effect;灵光一现)是指突然解决问题的常见经验。在这里,本文以一种模式识别范式来研究这种效应,该范式要求在格式塔规则和先验知识的基础上分割复杂场景和识别物体。受试者必须在模糊的场景中检测物体,并通…

【刷题】栈与队列:滑动窗口的最大值

题目 首先先来看题目描述: 这是一道栈与队列相关的题,给定我们一个整型数组,有一个长度为k的滑动窗口,让我们计算每次窗口的最大值。 我们的想法可以是得到一队列数据结构,让进入这个队列的第一个数据一定是最大的&a…

使用无线传感器网络进行源定位(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 本文提出了一种用于反狙击应用的源定位过程:​使用广义互相关(GCC)方法确定到达时间差&…

uboot fatal error: configs/.h: No such file or directory 解决方法

环境 Win10 64位 ubuntu 20.04 虚拟机 VMware Workstation 16 Pro 开发板:NK-980IOT(NUC980DK61Y) gcc 交叉编译工具链: ARM 官方 gcc version 11.2.1 20220111 NUC980 uboot 版本 :尝试移植到 u-boot-2019.10&am…

【游戏逆向】《某山奇缘》发包函数

一个游戏我们拿来以后第一件事肯定是要去分析发包函数。 因为发包函数可以给我们很多有用的信息。 第一,所有的功能都可以通过发包实现。 第二,发包中的参数可以获悉游戏中的数据形式,例如某些参数是类型,ID是什么样的值。 第…

Java 中同步机制的几种方式及使用

在Java中,同步机制是用来解决多线程并发访问共享资源的问题。如果多个线程同时访问共享资源,可能会导致数据不一致、死锁等问题。Java中提供了多种同步机制,例如synchronized关键字、Lock接口、Semaphore类、CountDownLatch类等。本文将介绍J…

Vivado综合属性系列之二 SRL_STYLE

目录 一、前言 二、SRL_STYLE 2.1 移位寄存器实现方式 2.2 工程代码 2.3 参考资料 一、前言 移位寄存器SRL在工程中属于使用频率较高个模块,可用于存储数据,实现串并转换; 根据数据移动方向可分为左移寄存器,右移寄存器&#x…

Vue3-黑马(八)

目录: (1)vue3-进阶-antdv-分页 (2)vue3-进阶-antdv-搜索 (3)vue3-进阶-antdv-删除1 (1)vue3-进阶-antdv-分页 分页显示不对,修改下方分页条: …

Web 自动化笔记-第一章 Selenium 环境搭建

1.自动化测试能解决什么问题? 1. 解决-回归测试 2. 解决-压力测试 3. 解决-兼容性测试 4. 提高测试效率,保证产品质量 回归测试: 项目在发新版本之后对项目之前的功能进行验证 压力测试: 可以理解多用户同时去操作软件, 统计软件服…

近1500支队伍、6000名开发者齐聚,第三届Light技术公益创造营收官

在很多老年人看来,融入数字生活并不容易,经常误点广告、不时接到诈骗电话、不会操作智能手机……但有些老年人并不担心这些,“误点了付款,有人会打电话过来,提醒我不要被骗了。”一位老人放心地进行着“网上冲浪”。而…

Python程序员该如何提高薪资水平?我来谈谈实用的五大方法

今天我要跟小伙伴们讨论的话题是:Python程序员该如何提升自己的价值?换句话说,程序员该如何逐渐增加自己的薪资?我想这是大家都关心的一个问题。首先,我们要明确一点,程序员的价值所在是什么?关…

深度学习之图像分类(一):AlexNet

本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,MobileNet&#xff0c…

var、let、const和执行上下文

let/const/var let 基本语法 ES6新增了let命令,用于声明变量,其语法类似于var,但是所声明的变量只在let命令所在的代码块内有效 不存在变量提升 var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为und…

【部署jar包到服务器】

部署打好的jar包到服务器 首先需要安装对应版本的jdk 查看所有可安装的jdk版本 yum -y list java 选择对应的安装 例如 yum install -y java-1.8.0-openjdk-devel.x86_64 安装好之后,查看jdk版本 java -version 默认安装位置在 usr/lib/jvm之中 倘若你之前的版本不对…

引爆海外市场:ChatGPT带来定制化营销活动的奇迹

在定制一场海外营销活动时,需要首先了解海外市场和定制营销活动的关键是研究目标市场的文化和消费习惯。这包括但不限于: 目标市场的语言和文化背景当地消费者的购买习惯和偏好该领域的市场趋势和竞争情况目标市场的法律法规、行业标准和规范推广渠道和…

编译opencv4.7.0 + opencv_contrib 记录

最近一个项目需要涉及到图像拼接算法,网上了解一番,也大致有思路: 1. 利用surf算法查找特征点 2. 过滤掉一些,获取good点 3. 然后进行配准(图像扭曲),对接 4. 形成最终拼接图片 这些工作&a…

NeRF原理简介及实现

“ NeRF(Neural Radiance Fields)是一种先进的计算机图形学技术,能够使用深度全连接神经网络优化场景的连续5D函数表示,从而生成高度逼真的3D场景。该技术的优势在于没有使用离散化的网格或体素来表示场景,而是使用一个…

【Pandas与SQL系列】Pandas实现分布函数percent_rank、cume_dist

目录 1,分布函数,1.1,percent_rank()1.2,cume_dist()1.3 SQL例子 2,Pandas 实现3,补充Pandas实现排序 1,分布函数, 应用场景:快速查看某个记录所归属的组内的比例 分布函数分类及基础语法&…