CV05-ResNet笔记
目录
一、为什么是ResNet
二、Residual Learning细节
2.1 shortcut计算
2.2 1×1卷积调整channel维度大小
2.3 ResNet层数
2.4 ResNet里的Basic Block 和 Bottleneck Block
2.5 Global Average Pooling 全局平均池化
2.6 Batch Normalization
学习ResNet,记录一些自己认为重要的要点,以免日后遗忘。
论文地址:https://arxiv.org/abs/1512.03385
论文下载请自备云梯。
复现论文代码:https://github.com/Ascetics/Pytorch-ResNet
一、为什么是ResNet
一般认为,当网络越来也深,其表现能力越强。但是,实际上网络的能力并不会随着深度增加一直增强,会出现网络的退化现象,也就是深度增加其能力反而不如浅层网络(其在测试集和训练集上的准确率都下降),这个不是过拟合(训练集上准确率提高,测试集上准确率下降)。
即使只增加恒等映射层,实验结果也是网络出现退化,随着深度的加深连学习一个恒等映射都变困难。所以,何恺明提出残差网络Residual Net,来解决这个问题。ResNet模型的出现使网络的深度大大增加。
论文3.1 Residual Learning中提出,如果要学习一个估值有困难,那么就定义残差
,学习残差
相对容易,然后用
来学习到原来的估值
。
为什么残差可以解决退化的问题呢?我个人的理解就是,经过深度网络的卷积、激活函数,输入的信息损失太多。那么把这个损失的信息补回来就解决了退化问题。所以,每间隔几个卷积、激活函数就对结果加一次输入,这样就不会造成输入信息的损失,网络层数可以一直加下去。
二、Residual Learning细节
2.1 shortcut计算
Residual Net中的shortcut就是公式中的输入x。如图,在经过卷积、ReLU、卷积以后,直接将输入加入,得到输出后再经过ReLU。这个Residual learning block计算并没有因为加入输入x而增加更多的参数。加入x是元素级别的加法,也就是说spatial和channel方向的维数要一致。
2.2 1×1卷积调整维度大小
因为卷积操作,导致channel发生了变化(stride=2导致spatial减小一倍,同时需要channel要增大一倍),所以需要对输入x做维度调整,才能做加法。
那么,1×1卷积就解决了channel不一致这个问题。至于spatial不一致,设置1×1卷积参数stride=2就可以解决。
2.3 ResNet层数
ResNet的层数指的是有参数的层数(卷积层、全连接层),也就是层数=conv1 + conv2 + conv3 + conv4 + conv5 + fc。根据层数的不同,ResNet分成5类,即ResNet18、ResNet34、ResNet50、ResNet101、ResNet152。
conv1是一个7×7卷积,out_channels=64,stride=2。经过这一层,out_channels变为64,spatial维数减小一半。
最大池化,kernel_size=3×3,stride=2。经过这一层,out_channels不变仍为64,输出spatial维数减小一半。
conv2-conv5根据层数不同使用不同数量的Basic Block或Bottleneck Block。
全局平均池化层,将张量拉成out_channels维度的向量,后面接全连接层。
将输出映射到n个分类,后面接softmax。
表格下面的文字描述,Downsampling is performed by conv3_1, conv4_1, and conv5_1 with stride of 2,容易被忽略。conv2是不做下采样的(stride=1)。conv3-conv5有多个block,但是只有第一个block才做下采样(stride=2),其余的不做下采样(stride=1)。
2.4 ResNet里的Basic Block 和 Bottleneck Block
随着深度的增加,每一层的参数个数会变的非常大(主要是channel变大,channel每层增大一倍,50层以上的ResNet的channel很大)。上面提到ResNet就是在计算得到的输出上加输入。为了提高效率,在层数较低的时(ResNet18、ResNet34 )使用Basic Block,在层数较高时(ResNet50、ResNet101、ResNet152)时使用Bottleneck Block。
第一种,在ResNet18、ResNet34使用Basic Block,每个Block都是两个维数相同的卷积,图中左侧省略了BN。输入和输出维度一致,计算输出直接加上输入就可以了。比如图中左侧,输入是channel=64,卷积计算和输出都是channel=64。需要注意,每个Basic Block的channel数不变,后一个conv层的channel是上一个conv层channel的2倍。
第二种,在ResNet50、ResNet101、ResNet152使用Bottleneck Block,每个Block的channel很大的情况,先用1×1卷积调整维度,将channel降下来进行卷积,再用1×1卷积将channel升上去,被称为BottleNeck。比如右图中,输入channel=256,先1×1卷积将channel降到64,计算输出是channel=64,再用1×1卷积将channel升到256,再做加法。256——64——256就像瓶颈一样——BottleNeck。需要注意,每个Bottleneck Block的channel输出都是输入的4倍,后一个conv层的输入channel是上一个conv层输出channel的2倍
2.5 Global Average Pooling 全局平均池化
为了连接全连接层。需要把矩阵拉成一维向量,以前办法是flatten。C×H×W的张量,经过flatten变成了一维向量,有CHW个元素。
而全局平均池化的意思,实际上就是池化的kernel_size和输入大小相同,这样每个channel就只有一个平均值输出。C×H×W的张量,经过全局平均池化变成了C×1×1,有C个元素。
全局平均池化的好处就是,全连接层的参数大大减少,避免过拟合。
2.6 Batch Normalization
ResNet统一的在卷积conv和激活函数ReLU之间使用BN,也就是说统一使用conv-BN-ReLU这样的顺序。
为什么卷积里面的bias=False?因为,后面有Batch Normalization。如果卷积就加bias,卷积后做batch normalization还要再加bias,那么卷积的bias就无效了。所以,后面如果有BN,卷积就不加bias。
相关文章:

二叉树的前序,中序,后序的递归、迭代实现
二叉树的前序遍历 递归实现 递归实现没什么好说的。个人感觉将函数功能看成一个整体,不要去想栈中怎么实现的。毕竟自己的脑袋不是电脑,绕着绕着就蒙了。 void preordered_traversal_recursion(TreeNode* root) {if(root NULL) return;container.pus…

DataSet 动态添加列
public DataSet GetNewId(List<string> IdArr){DataSet ds new DataSet();DataTable newtb new DataTable();DataColumn column new DataColumn("cnt", typeof(string));//新增列newtb.Columns.Add(column);for (int i 0; i < IdArr.Count; i){StringBu…

iOS专题1-蓝牙扫描、连接、读写
iOS专题1-蓝牙扫描、连接、读写 概念 外围设备 可以被其他蓝牙设备连接的外部蓝牙设备,不断广播自身的蓝牙名及其数据,如小米手环、共享单车、蓝牙体重秤 中央设备 可以搜索并连接周边的外围设备,并与之进行数据读写通讯,如手机 日常生活中常见的场景是手机app通过蓝…

CV06-Xception笔记
目录 一、为啥是Xception 二、Xception结构 2.1 Xception结构基本描述 2.2 实现细节 2.3 DeepLabV3改进 三、记录pytorch采坑relu激活函数inplaceTrue Xception笔记,记录一些自己认为重要的要点,以免日后遗忘。 复现Xception论文、DeepLabV改进的…

C++排序算法实现(更新中)
比较排序法:如冒泡排序、简单选择排序、合并排序、快速排序。其最优的时间复杂度为O(nlogn)。 其他排序法:如桶排序、基数排序等。时间复杂度可以达到O(n)。但试用范围有要求。 桶排序:排序的数组元素跨距不能很大。因为跨距很大的话…

iOS SwiftUI篇-5 专题NavigationView、NavigationLink
iOS SwiftUI篇-5 专题NavigationView、NavigationLink NavigationView:标题、展示模式、隐藏导航栏、隐藏返回按钮、添加导航栏按钮 NavigationLink:Text文本跳转、Image图片跳转、Button按钮跳转、点击按钮根据业务跳转到不同页面 NavigationView 标题、展示模式 import S…

PHP artisan
Artisan 是 Laravel 提供的 CLI(命令行接口),它提供了非常多实用的命令来帮助我们开发 Laravel 应用。前面我们已使用过 Artisan 命令来生成应用的 App Key 和控制器。在本教程中,我们会用到以下 Artisan 命令,你也可以…

【转载】Pytorch在加载模型参数时指定设备
转载 https://sparkydogx.github.io/2018/09/26/pytorch-state-dict-gpu-to-cpu/ >>> torch.load(tensors.pt) # Load all tensors onto the CPU >>> torch.load(tensors.pt, map_locationtorch.device(cpu)) # Load all tensors onto the CPU, using a fun…

目标检测之Faster-RCNN的pytorch代码详解(数据预处理篇)
首先贴上代码原作者的github:https://github.com/chenyuntc/simple-faster-rcnn-pytorch(非代码作者,博文只解释代码) 今天看完了simple-faster-rcnn-pytorch-master代码的最后一个train.py文件,是时候认真的总结一下了࿰…

hp-ux 集群,内存 小记
hp-ux 集群,内存 小记 -----查看hp 集群状态信息 # cmviewcl -v CLUSTER STATUS dbsvr up NODE STATUS STATE db01 up running Cluster_Lock_LVM: VOLUM…

iOS SwiftUI篇-6 专题TabView
iOS SwiftUI篇-6 专题TabView TabView: 图片+文字组成tabItem,选中时改变图片和文字颜色 跳转到二级页面时隐藏tabbar,返回到首页时显示tabbar 首页、我的两个tab,效果图: 图片文字组成tabItem,选中时改变图片和文字颜色 代码: struct MainContentView: View {@State…

三维刚体变化中Rcw,tcw的含义
高翔博士的《视觉SLAM十四讲》中,介绍Tcw指从世界坐标w到c的变换矩阵。但研一学机器人学的时候,讲T12的含义是,坐标系2相对于坐标系1的变换。于是一脸懵逼。昨天想了一晚上,有了一点自己的想法,在这记录一下࿰…

CV07-DeepLab v3+笔记
目录 一、Dilated Convolution 膨胀卷积 二、ASPP与Encoder & Decoder 三、深度可分离卷积 3.1 深度可分离卷积原理 3.2 深度可分离卷积减小参数量和计算量 3.3 深度可分离卷积实现细节 四、Xception作为Backbone DeepLab v3笔记,记录一些自己认为重要的…

1116.加减乘除
题目描述:根据输入的运算符对输入的整数进行简单的整数运算。 运算符只会是加、减-、乘*、除/、求余%、阶乘!六个运算符之一。 输出运算的结果,如果出现除数为零,则输出“error”,如果求余运算的第二个运算数为0,也输出…

Flutter专题1-环境搭建
Flutter专题1-环境搭建和创建项目 这里以MaciOS为例,其他平台参考官网https://flutter.dev/docs/get-started/install 1. 系统要求 系统:macOS (64-bit) 硬盘空间:2.8G 工具:Git 2.获取Flutter SDK 2.1下载SDK,从https://flutter.dev/docs/development/tools/s…

ORB_SLAM2源码:ORBmatcher.cc
ORBmatcher.cc中的函数,主要实现(1)路标点和特征点的匹配(2D-3D点对)。(2)特征点和特征点的匹配(2D-2D点对)。SearchByProjection的函数重载看得我一脸懵逼。在这做一下笔…

iOS国际化技巧
参考链接:http://www.cocoachina.com/ios/20151120/14258.html http://www.jianshu.com/p/88c1b65e3ddb http://www.cnblogs.com/levilinxi/p/4296712.html http://www.cocoachina.com/appstore/20160310/15632.html http://www.cocoachina.com/ios/20170214/18681.html转载于:…

CV08-数据预处理与数据增强
复现车道线分割项目(Lane Segmentation赛事说明在这里),学习数据预处理和数据增强。学习分为Model、Data、Training、Inference、Deployment五个阶段,也就是建模、数据、训练、推断、部署这五个阶段。现在进入的是Data阶段。项目的…

ORB_SLAM2程序入口(System.cc)
程序入口 ORB_SLAM2的程序入口为src/System.cc。在CMakeList.txt中可知,ORB_SLAM2的可执行程序为: Examples/Stereo/stereo_kitti.cc等。 add_executable(stereo_kitti Examples/Stereo/stereo_kitti.cc) target_link_libraries(stereo_kitti ${PROJECT…

HDU 6229 Wandering Robots 找规律+离散化
题目链接:Wandering Robots 题解:先讲一下规律,对于每一个格子它可以从多少个地方来有一个值(可以从自己到自己),然后答案就是统计合法格子上的数与所有格子的数的比值 比如说样例的3 0格子上的值就是 3 4 …

app、H5、safari、appstore应用主页评分页之间拉起调用、打开手机某些系统功能、app打开文档
定义打开URL的方法 - (void)openURL:(NSString *)urlStr {NSURL *url [NSURL URLWithString:urlStr];UIApplication *app [UIApplication sharedApplication];if ([app canOpenURL:url]) { #ifdef __IPHONE_10_0[app openURL:url options:[NSDictionary dictionary] complet…
XML学习总结
1、XML结构 2、XmlNodeType值为一个枚举类型: 假设我们对一个XML文件进行遍历,不推断节点是否为Element类型。就会将文本节点遍历出来,出现#test。 3、XmlElement和XmlNode的差别:(摘自CSDN论坛) ÿ…

Linux01-基本操作与Shell
目录 一、环境 二、Linux目录结构及基本操作 2.1 Linux目录结构 2.2 基本操作 三、shell 3.1 shell的意义 3.2 su - 一、环境 2019年搞下RHCE的证书,但是一直没有整理Linux学习的笔记,为了不让到手的知识被遗忘,从今天起整理Linux学习…

ORB_SLAM2中Tracking线程的三种追踪方式
1、参考关键帧追踪模式 bool Tracking::TrackReferenceKeyFrame()对参考关键帧中的路标点进行跟踪。在Tracking线程中,每传入一帧,都会进行位姿优化。 以上一帧的位姿为当前位姿进行优化。 (1)计算当前帧的词袋 mCurrentFra…

nodejs 中间件 反向代理 接口转发
背景 随着后端业务系统的增加,纵向需求不断扩展,一个业务系统已经无法满足需求了,衍生出多个业务系统,对外暴露的ip、端口就可能有多个,此时不方便外部接口调用,有些特殊行业客户出于安全性考虑不发提供多…

oneinstack
https://oneinstack.com/转载于:https://www.cnblogs.com/diyunpeng/p/9740895.html

最近在做托盘时,发现 CnTrayIcon1的OnClick 事件,不能被其它按钮来执行,蛋疼。...
比如: procedure TForm1.Button1Click(Sender: TObject);begin CnTrayIcon1.OnClick ; // 这句就是不能通过!!end; 有过路的高手,指点学生一下。谢谢转载于:https://www.cnblogs.com/hahy8008/p/6783614.html

Linux02-帮助手册
目录 一、man手册 1.1 man的基本使用 1.2 mandb更新文档 二、/usr/share/doc 三、access.redhat.com 门户 一、man手册 1.1 man的基本使用 man就是mannual的缩写,手册的意思。Linux的命令很多,参数选项更多,人脑一般是记不住的&…

ORB_SLAM2中Tracking线程
Tracking线程是ORB_SLAM2的主线程。在System.cc中,使用构造函数进行了初始化,开启了三个线程。 可执行程序—>System构造函数(初始化三个线程)—>处理输入的帧(TrackMonocular)—>调用Tracking线程…

selenium的基础知识点
from selenium import webdriver from scrapy.selector import Selector#模拟登陆 browser webdriver.Chrome(executable_pathChromedriver.exe) #路径是Chromedriver.exe的存放位置,windows下只要配置好这个环境就不需要了browser.get(http://w) #需要登陆的那个网…