CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

2023-05-16

本文翻译总结自CS231n Lecture 9。

本篇将深入介绍当前的应用和研究工作中最火的几个CNN网络架构——AlexNet、VGGNet、GoogleNet和ResNet,它们都在ImageNet分类任务中有很好的表现。另外,本篇也会粗略介绍一些其他的架构。

LeNet-5回顾

我们先来回顾一下最基本的LeNet,它可以说是首个效果比较好的CNN。它使用了5x5的卷积核,stride为1。池化层卷积核是2x2的,stride为2。最后还有几个全连接层。网络结构很简单也很容易理解。
01|center

AlexNet

接下来讲的是AlexNet,它是第一个在ImageNet分类上表现不错的大规模的CNN,在2012年一举碾压其他方法获得冠军,于是开启了一个新的时代。

它的基本架构组成如下图,它是由若干卷积层、池化层、归一化层和全连接层组成的。左边方括号里的内容为数据的形状,右边有卷积核的详细参数。总体来说AlexNet和LeNet很像,只不过网络层数大大增加。
02|center
整个网络架构可视化出来是这样的(输入层的224x224应为227x227):
03|center

下面总结一下这个网络的一些特点和小细节:

  1. 它是第一个使用ReLU的网络;
  2. 它使用了局部响应归一化层(Local Response Normalization Layers, LRN),了解LRN可以看这里和这里。不过要注意,这种层现在已经不常用了,因为研究发现它的作用不是很大;
  3. 它使用了很多数据增广(data augmentation)技术,比如翻转(flipping)、PCA Jittering、随机裁切(cropping)、颜色归一化(color normalization)等等;
  4. 使用了0.5的dropout;
  5. batch size为128;
  6. SGD Momentum为0.9;
  7. 学习率为0.01,每次loss不降的时候手动除以10,直到最后收敛;
  8. L2 weight decay为5e-4;
  9. 使用7个CNN ensemble(多次训练模型取均值),效果提升为18.2% → \rightarrow 15.4%。

另外提一句,从上面的架构图中,CONV1层的的96个kernel分成了两组,每组48个,这主要是历史原因,当时用的GPU显存不够用,用了两块GPU。CONV1、CONV2、CONV4和CONV5在每块GPU上只利用了所在层一半的feature map,而CONV3、FC6、FC7和FC8则使用了所在层全部的feature map。

AlexNet是第一个使用CNN架构在ImageNet Large Scale Visual Recognition Challenge(ILSVRC)上取得冠军的网络,它能力挺不错,不过后面讲到的一些网络架构更加优秀,也是在我们实际应用中可以优先考虑使用的。

ZFNet赢得了2013年ILSVRC的冠军,它所做的是对AlexNet的超参数进行了一些改进,网络架构没什么太大变化。但在2014年,有两个新的很厉害的网络架构被提出来——VGGNet和GoogleNet。它们与之前网络的主要差异在于网络深度大大增加,相比于AlexNet的8层,它们分别有19层和22层。下面我们分别具体讲一下两个网络。

VGG

VGG主要有两点改进:

  1. 显著增加了网络层数(16层到19层)
  2. 大大减小了kernel size,使用的是3x3 CONV stride 1 padding 1和2x2 MAX POOL stride 2这样的filter。

VGG和AlexNet的对比如下:
04|center

加深网络很好理解,但为什么要缩小filter到3x3呢?我们来小小地计算一下:
当使用一个7x7的filter时,它的感受野是7x7的。但如果我们使用三个3x3的filter来替换这一个7x7的filter呢?
从输入经过第一个3x3 filter,感受野为3x3,第一个filter的输出再经过第二个3x3 filter,感受野为5x5(三个3x3的相邻的区域综合起来是5x5),经过第三个filter之后,感受野为7x7。这样,经过替代后,在感受野不变的情况下:

  • 网络更深了,大大增加了网络的非线性能力;
  • 网络参数变少了: 3 × ( 3 2 C i n C o u t ) &lt; 7 2 C i n C o u t 3 \times (3^2 C_{in}C_{out}) &lt; 7^2 C_{in}C_{out} 3×(32CinCout)<72CinCout,其中 C i n C_{in} Cin C o u t C_{out} Cout为分别为输入、输出的feature map数。

VGG16的具体参数如下:
05|center
可以看到,每张图片forward的过程中需要占用约100M的内存,这确实是个很大的数字。另外138M的参数量,也比AlexNet的60M多出不少。其中占用内存大的主要是最前面的卷积层(因为网络前面部分数据量还比较大)和全连接层(之后我们可以看到一些架构通过去掉全连接层来节省内存)。

下面总结一下这个网络的一些特点和小细节:

  1. 它赢得了ILSVRC’14的冠军;
  2. 它使用了和AlexNet类似的训练方法;
  3. 它没有使用AlexNet中用的LRN层(因为实验发现LRN用处不大);
  4. 它分为VGG16和VGG19(其中VGG19只是多了三层,效果稍好一些,占用内存也更多)。实际使用中VGG16用的更多;
  5. 为了提升效果使用了ensemble(多次训练模型,最后取均值);
  6. FC7中得到的feature map(也就是一个1x4096的向量)提取出了很好的feature,可以用来做其他任务。

接下来讲一下同样在2014年提出的网络GoogleNet。

GoogleNet

GoogleNet是ILSVRC’14中的分类冠军,它除了使用更深的网络(22层),还有一个更大的亮点——注重计算效率(Computational Efficiency)。GoogleNet中没有使用全连接层,这大大减少了参数量。此外,它还使用了“Inception模块”(后面详细讲)。这样一来,整个网络只需要5M的参数量,仅仅是AlexNet的十二分之一!

现在讲一下这个神奇的“Inception模块”。它的主要思想是设计一种效果好的局部网络拓扑结构(local network topology),也就是在网络中嵌套网络,最后把这些网络堆叠成一个网络,示意图大概是这样的:
06|center

举个Inception模块的最naive的栗子(见下图),输入被分别送到不同kernel size的卷积核中(1x1,3x3,5x5),另外还加了一个池化。各部分分别产生输出之后,再把它们连成一个整体作为输出。
07|center

但是直接这样做会有问题,把各部分输出联系来之后,feature map的数量成数倍的增长。我们的解决方案是引入“bottleneck”层,这种层使用1x1的卷积层,不过使用的filter数目更少,也就是说减少了feature map的数量,新的架构举例如下图:
08|center
注意图中的红色部分,它们将256个feature map减少到了64个,也就大大降低了参数量。改进后的Inception模块只需要358M次操作(之前需要854M次)。

在GoogleNet中,网络的开头部分是一个主干形的stem network,这个部分和之前AlexNet和VGG中的差不多,是卷积池化之类的层的叠加(见下图蓝框)。之后把上面说的Inception模块串到了一起,最后加上用于分类的层形(注意没有全连接层)成了整个网络。
09|center

其中需要注意下图中框出来的部分,它们和网络的最后做了类似的工作,也输出了分类标签。最终使用三处输出一起计算loss。这样做的原因是网络层数很多,中间的结果也很有用。此外中间的这两处输出也会计算梯度,这有助于缓解这种层数很多的网络中的梯度消失的问题。
10|center

到这里,整个网络我们就介绍完啦,总体来说,网络之所以这样设计、之所以效果这么好有两方面原因。一是前面提到的Inception Model很有用。此外还有一个重要原因,就是Google财大气粗有钱任性,可以用大量的机器验证各种各样奇奇怪怪的网络架构,最后挑选出效果好的就行了(有钱真好.jpg)。

接下来我们的目光转向2015年的冠军——ResNet,具体请看下一篇文章~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上) 的相关文章

  • 无人机器件选择参考

    无人机飞控 xff0c 引脚预留数量 1 xff0c 四路pwm 2 xff0c 无线通信spi 3 xff0c 陀螺仪通信用iic 4 xff0c 串口调试用uart 5 xff0c led灯用普通io 6 xff0c 电量检测和电机堵塞
  • 字节对齐的规则总结

    一 什么是字节对齐 为什么要对齐 现代计算机中内存空间都是按照byte划分的 xff0c 从理论上讲似乎对任何类型的变量的访问可以从任何地址开始 xff0c 但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问 xff0c 这就需要
  • C++中第三方库的一般使用方式(libxl库为例)

    本篇介绍如何使用C C 43 43 的第三方库 xff0c 学会使用第三方库很重要 xff0c 尤其对于使用C C 43 43 语言的人来说 xff0c 标准库能做的事不能说太少 xff0c 恰当的说应该是没那么有趣 学会使用第三方库 xf
  • 三相电动机用单相电源

    三相电机改为单相运行 单相电机配用电容不是越大越好 三相电动机用单相电源 三相电机改为单相运行 介绍几种简便易行的方法 xff0c 可以不改动电机内部绕组而将三相电机改为单相运行 有6 种 xff1a 一 加电容法 xff39 形接法的三相
  • curl_init()和curl_multi_init()多线程的速度比较

    来源 http www webkaka com tutorial php 2013 102843 php中curl init 的作用很大 xff0c 尤其是在抓取网页内容或文件信息的时候 xff0c 例如之前文章curl获得header检测
  • 连接两字符串函数

    include lt stdio h gt include 34 string h 34 char Strcat char s1 char s2 printf 34 连接之后的字符串为 xff1a 34 for s1 61 39 0 39
  • CAN通信数据帧介绍

    CAN通信有五个帧 xff0c 其中最重要的是数据帧 xff01 xff01 xff01 xff01 我们下面开始讨论数据帧 一 数据帧的格式 xff08 数据帧有七个段组成 xff09 xff0c 帧起始 表示数据帧开始的段 xff0c
  • STM32压力传感器信号采集-24位AD HX720 HX711 原理介绍

    我做过很多工业用压力采集产品 xff0c 用过很多高分辨率的AD芯片 xff0c 其中有两款值得推荐 一个是海芯科技出的HX711等24位AD xff0c 一个是塞普拉斯出的CS5532等24位AD 国产芯片和进口芯片有差距 xff0c 但
  • stm32实现网络音频-原理图单片机程序C#上位机程序

    电子可以一边玩 xff0c 一边研究 xff0c 网络音频这个课题特别适合电子爱好者 几方面的挑战如下 xff0c 单片机实现对接以太网 实时对音频流解码播放 xff0c 上位机配合单片机做音频流传输控制 xff0c 音频信号的对接放大处理
  • rosdep init and update Error

    rosdep init Error sudo rosdep init ERROR default sources list file already exists br etc ros rosdep sources list d 20 de
  • Postman汉化版本竟如此简单,全中文真香

    对于国内程序员来说 xff0c 外国开发软件的一个使用门槛是全英文的 xff0c 对于不熟悉各种专业术语的同学 xff0c 上手比较麻烦 因此有种方法就是使用汉化版的外国软件 xff0c 但 Postman 并没有汉化版本 但是postma
  • YOLOv5识别目标的实时坐标打印

    引言 这个功能看似鸡肋 xff0c 但对于无人机目标识别与追踪有重要意义 xff0c 通过目标在摄像头视野的坐标位置 xff0c 可以推算出无人机相对与目标的位置 xff0c 从而对无人机进行位置矫正 因此 xff0c 添加代码打印坐标并不
  • 六、WebRTC中ICE的实现

    一 Candidate种类 amp 优先级 高到底 xff1a host srflx prflx relay 同一局域网内通过host类型的Candidate在内网建立连接 非同一局域网 xff0c 隔断从STUN TURN服务器中收集sr
  • 七、WebRTC中的SDP

    一 SDP标准规范 格式 xff1a lt type gt 61 lt value gt SDP 会话层 媒体层 媒体音频 媒体视频 二 WebRTC中的SDP的整体结构 1 媒体信息 m 61 行中描述媒体类型 传输类型 Playload
  • linux 信号量sem

    一 信号量 信号量如同一盏红绿信号灯 xff0c 用于临界资源 xff08 如公路 人行道 xff09 的管理 信号量是一种特殊的变量 xff0c 访问具有原子性 P等待 xff1a 信号量的值为0时 xff0c 不能减 xff0c 则进行
  • 1-4 实验3 串口通信

    串口通信 1 实验内容 xff1a PC端串口调试助手向板子发送数据 xff0c 板子接受到数据后 xff0c 再把数据发送回给PC端串口调试助手 2 串口发送接受数据的基本步骤 xff1a 初始化串口 xff08 设置波特率 中断等 xf
  • 1-6 实验5 无线温度检测实验

    无线温度检测实验 1 实验内容 xff1a 协调器建立ZigBee无线网络 xff0c 终端节点自动加入网络 xff0c 然后终端节点周期性地采集温度并将数据发送到协调器 协调器接受数据并通过串口把接受到的数据传给PC端的串口调试助手 2
  • 1-11 实验9 网络管理实验1 获取自身的和父节点网络地址、MAC地址

    p p p style color rgb 51 51 51 font family Arial font size 14px line height 26px 获取自身的和父节点网络地址 MAC地址 p p style color rgb
  • 1-14 实验11 获取网络拓扑

    获取网络拓扑 1 实验内容 xff1a PC端串口调试助手向协调器发送命名 topology 协调器接受到命令后 xff0c 将网络拓扑信息发送到PC机串口调试助手上 2 知识点 xff1a 在1 11 实验9 网络管理实验1 获取自身和父
  • S 串口编程 详解3 串口的初始化、打开/关闭

    串口编程 详解3 串口的初始化 程序打开串口 xff0c 采用两种方法 xff1a 1 程序启动 xff0c 调用OnInitDialog 函数 xff0c 打开串口 xff0c 缺省串口号为COM1 xff0c 如果COM1不存在或被占用

随机推荐

  • 求关键路径(包含邻接表的建立、拓扑排序)

    include lt stdio h gt include lt stdlib h gt typedef struct node int adjvex 邻接点域 int info 边上的信息 struct node next 指向下一个邻接
  • FPGA串口回环实验

    本文将从个人理解的角度 xff0c 解释FPGA串口通信的原理 xff0c 并进行实战演示 1 写在前面的话 串口通信是初学FPGA必过的一道坎 xff0c 如果能够在不参考任何资料的情况下自己手搓一套串口回环的代码 xff0c Verio
  • Debug Assertion Failed!解决方法详解

    1 野指针 2 内存泄露 解决方法 1 看一看你的程序里是不是有 ASSERT xff08 xff09 或 VERIFY xff08 xff09 语句 这两个宏是用来测试它的参数是否为真的 出现你说的 xff0c 这说明你的指针或表达试有问
  • 用tftp的方式在u_boot下 烧写uImage内核

    用 u boot 进行下载 uImage 一种 kernel 镜像文件 首先 把编译好的 uImage 文件放在 tftpboot 目录下 用网线把开发板和电脑连上 但PC上的网卡显示是没连接的 xff0c 这一点是没有关系的 xff0c
  • 利用NFS服务挂载NFS根文件系统

    嵌入式Linux根文件系统 xff0c 简单地说 xff0c 根文件系统就是一种目录结构 注意根文件系统和普通的文件系统的区别 常见的Linux根文件系统有 xff1a xff08 1 xff09 NFS xff08 网络根文件系统 xff
  • 数据校验之Checksum算法

    校验和 xff08 Checksum xff09 是网络协议使用的数据错误检测方法 xff0c 并且被认为比LRC xff08 纵向冗余校验 xff0c Longitudinal Redundancy Check xff0c LRC xff
  • 位序转字符串的一种高效方法

    include lt stdio h gt include lt stdlib h gt include lt malloc h gt include lt string h gt include lt arpa inet h gt def
  • OpenSIPS实战(一):OpenSIPS使用简介

    1 OpenSIPS是什么 OpenSIPS xff08 Open SIP Server xff09 是一个成熟的开源SIP服务器实现 可以作为SIP代理 路由器 但OpenSIPS不仅仅是一个SIP代理 路由器 xff0c 因为它包含了应
  • Floyd判圈算法(龟兔赛跑算法, Floyd's cycle detection)及其证明

    问题 xff1a 如何检测一个链表是否有环 xff08 循环节 xff09 xff0c 如果有 xff0c 那么如何确定环的起点以及环的长度 空间要求 xff1a 不能存储所经过的的每一个点 举例 xff1a x 0 61 1 x 0 61
  • Ubuntu配置GPU版本pytorch环境(含NVIDIA驱动+Cuda+Cudnn)

    本文更新于2018年8月底 概述 步骤如下 xff1a 1 安装Ubuntu 2 安装NVIDIA 显卡驱动 2 安装NVIDIA Cuda 3 安装NVIDIA CuDNN 4 安装GPU版本的PyTorch 安装Ubuntu 系统版本选
  • PyTorch中的Dataset、Dataloader和_DataloaderIter

    Dataset Pytorch中数据集被抽象为一个抽象类torch utils data Dataset xff0c 所有的数据集都应该继承这个类 xff0c 并override以下两项 xff1a len xff1a 代表样本数量 len
  • 彻底搞懂Lab 颜色空间

    本文参考wikipedia xff0c 并加入了自己的理解 xff0c 有不对的地方多多指教 名称 在开始之前 xff0c 先明确一下Lab颜色空间 xff08 Lab color space xff09 的名字 xff1a Lab的全称是
  • MiniFly微型四轴学习与开发日志(五)——遥控器任务详解

    文章目录 radiolinkTask无线连接任务usblinkTxTask usb发送任务usblinkRxTask usb接收任务commanderTask飞控指令发送任务keyTask按键扫描任务displayTask显示任务confi
  • .与::的使用区别

    今天尝试编写了一个小的Windows应用程序 xff0c 在编写的过程中用到MessageBox函数 但是一直不正确 我当时尝试MessageBox 34 NULL 34 34 Alert 34 34 ERROR 34 MB OK xff0
  • Pytorch中的contiguous理解

    最近遇到这个函数 xff0c 但查的中文博客里的解释貌似不是很到位 xff0c 这里翻译一下stackoverflow上的回答并加上自己的理解 在pytorch中 xff0c 只有很少几个操作是不改变tensor的内容本身 xff0c 而只
  • 一文读懂GAN, pix2pix, CycleGAN和pix2pixHD

    本文翻译 总结自朱俊彦的线上报告 xff0c 主要讲了如何用机器学习生成图片 来源 xff1a Games2018 Webinar 64期 xff1a Siggraph 2018优秀博士论文报告 人员信息 主讲嘉宾 姓名 xff1a 朱俊彦
  • Pytorch中的optimizer

    与优化函数相关的部分在torch optim模块中 xff0c 其中包含了大部分现在已有的流行的优化方法 如何使用Optimizer 要想使用optimizer xff0c 需要创建一个optimizer 对象 xff0c 这个对象会保存当
  • 图像质量评价之结构相似性SSIM(上)

    本文总结归纳自论文 image quality assessment from error visibility to structural similarity 概述 这篇文章主要介绍对图像质量进行打分评价的一个很经典的指数 结构相似性
  • 图像质量评价之结构相似性SSIM(中)

    在上一篇文章中 xff0c 我们介绍了对图像质量进行评价的必要性 主观评价和客观评价的两种标准 xff0c 以及设计符合人类直觉的评价标准的困难性和重要性 本来这篇文章想把我们的主角SSIM讲完 xff0c 但是发现前面需要写的铺垫有点长h
  • CS231n lecture 9:各大经典网络 AlexNet/VGG/GoogleNet/ResNet(上)

    本文翻译总结自CS231n Lecture 9 本篇将深入介绍当前的应用和研究工作中最火的几个CNN网络架构 AlexNet VGGNet GoogleNet和ResNet xff0c 它们都在ImageNet分类任务中有很好的表现 另外