残差网络ResNet到ResNeXt解读,最强ResNeXt预训练模型已开源及如何使用
它叫ResNeXt WSL,有超过8亿个参数,用Instagram上面的9.4亿张图做了 (弱监督预训练) ,用ImageNet做了微调。
背景介绍:残差网络的发展
● ResNet (2015)
传统网络出现的问题:
深度学习中的基础网络的发展从ALexNet(5个卷积层)、VGG(19个卷积层)到GoogLeNet(22个卷积层),网络的结构在不断变深。这是因为更深的网络可以进行更加复杂的特征模式的提取,从而理论上更深的网络可以得到更好的结果。但是通过简单的叠加层的方式来增加网络深度,可能引来梯度消失/梯度爆炸的问题:
- “梯度消失”:指的是即当梯度(小于1.0)在被反向传播到前面的层时,重复的相乘可能会使梯度变得无限小。
- “梯度爆炸”:指的是即当梯度(大于1.0)在被反向传播到前面的层时,重复的相乘可能会使梯度变得非常大甚至无限大导致溢出。
因此随着网络深度的不断增加,常常会出现以下两个问题:
- 长时间训练但是网络收敛变得非常困难甚至不收敛(这个问题很大程度已被标准初始化和中间标准化层解决)。
- 网络性能会逐渐趋于饱和,甚至还会开始下降,可以观察到下图中56层的误差比20层的更多,故这种现象并不是由于过拟合造成的。这种现象称为深度网络的退化问题。
?contribution:
- 将层变为学习关于层输入的残差函数,而不是学习未参考的函数。
- bottleneck design
优点:
- 相比传统的卷积神经网络如VGG复杂度降低,需要的参数下降
- 可以做到更深,不会出现梯度弥散的问题。
- 优化简单,分类准确度加深由于使用更深的网络
- 解决深层次网络的退化问题
在输入与输出之间(称为堆积层)引入一个前向反馈的shortcut connection,这有点类似与电路中的“短路”,也是文中提到identity mapping(恒等映射y=x,也就是输入与输出是相等的映射关系。)ResNet通过引入残差网络结构(residual network),解决了退化问题。其主要思想是将堆叠的非线性层从,拟合原来的最优解映射输出H(X),变成去,拟合输出和输入的差F(X) = H(X) - X,X为输入,此时原最优解映射H(X)就可以改写成F(X) + X。而作者认为这两种表达的效果相同,但是优化的难度却并不相同,作者假设F(x)的优化会比H(x)简单的多。这一想法也是源于图像处理中的残差向量编码,通过一个reformulation,将一个问题分解成多个尺度直接的残差问题,能够很好的起到优化训练的效果。
残差映射跟原映射相比更容易被优化。比如把5映射到5.1,那么引入残差前是F’(5) = 5.1,引入残差后是H(5) = 5.1, H(5) = F(5) + 5, F(5) = 0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。后者输出变化明显对权重的调整作用更大,所以效果更好。
这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),一般称整个结构为一个”building block“。其中右图又称为**”bottleneck design”**(间隔1 * 1、3 * 3、1 * 1的三层网络,第一层用于降低维度,第三层用于升高维度),目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
残差网络的本质:
残差网络的等价结构:
残差网络单元其中可以分解成右图的形式,从图中可以看出,残差网络其实是由多种路径组合的一个网络,直白了说,残差网络其实是很多并行子网络的组合,整个残差网络其实相当于一个多人投票系统(Ensembling)。
● ResNeXt (2016)
?contribution:
- 增加基数 cardinality 比增加深度和宽度更有效。(在某一层并行transform的路径数提取为第三维度,称为”cardinality”。)
- 用一种平行堆叠相同拓扑结构的blocks代替原来 ResNet 的三层卷积的block,在不明显增加参数量级的情况下提升了模型的准确率,同时由于拓扑结构相同,超参数也减少了,便于模型移植。
优点
- 提高准确率
- 减少超参数数量(得益于子模块的拓扑结构)
上图所示提出了深度网络的新维度,除了深度、宽度(Channel数)外,作者将在某一层并行transform的路径数提取为第三维度,称为”cardinality”。跟Inception单元不同的是,这些并行路径均共享同一拓扑结构,而非精心设计的卷积核并联。除了并行相同的路径外,也添加了层与层间的shortcut connection。
● ResNeXt WSL(2019)
?contribution:
- 预训练模型
如何使用:
import torch
model = torch.hub.load('facebookresearch/WSL-Images', 'resnext101_32x8d_wsl')
# or
# model = torch.hub.load('facebookresearch/WSL-Images', 'resnext101_32x16d_wsl')
# or
# model = torch.hub.load('facebookresearch/WSL-Images', 'resnext101_32x32d_wsl')
# or
#model = torch.hub.load('facebookresearch/WSL-Images', 'resnext101_32x48d_wsl')
model.eval()
ResNeXt WSL使用例子:
# Download an example image from the pytorch website
import urllib
url, filename = ("https://github.com/pytorch/hub/raw/master/dog.jpg", "dog.jpg")
try: urllib.URLopener().retrieve(url, filename)
except: urllib.request.urlretrieve(url, filename)
# sample execution (requires torchvision)
from PIL import Image
from torchvision import transforms
input_image = Image.open(filename)
preprocess = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model# move the input and model to GPU for speed if available
if torch.cuda.is_available():input_batch = input_batch.to('cuda')model.to('cuda')with torch.no_grad():output = model(input_batch)
# Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
print(output[0])
# The output has unnormalized scores. To get probabilities, you can run a softmax on it.
print(torch.nn.functional.softmax(output[0], dim=0))
只有一点需要注意:这次开源的模型,要求所有输入图像,都用相同的方式归一化 (Normalization) 。
ResNeXt主页、GitHub项目、ECCV论文
Colab Demo:https://colab.research.google.com/github/pytorch/pytorch.github.io/blob/master/assets/hub/facebookresearch_WSL-Images_resnext.ipynb、
残差网络ResNet到ResNeXt解读,最强ResNeXt预训练模型已开源及如何使用相关推荐
- 对残差网络resnet shortcut的解释
重读残差网络--resnet(对百度vd模型解读) 往事如yan 已于 2022-02-25 07:53:37 修改 652 收藏 4 分类专栏: AI基础 深度学习概念 文章标签: 网络 cnn p ...
- (pytorch-深度学习)实现残差网络(ResNet)
实现残差网络(ResNet) 我们一般认为,增加神经网络模型的层数,充分训练后的模型理论上能更有效地降低训练误差. 理论上,原模型解的空间只是新模型解的空间的子空间.也就是说,如果我们能将新添加的层训 ...
- dlibdotnet 人脸相似度源代码_使用dlib中的深度残差网络(ResNet)实现实时人脸识别 - supersayajin - 博客园...
opencv中提供的基于haar特征级联进行人脸检测的方法效果非常不好,本文使用dlib中提供的人脸检测方法(使用HOG特征或卷积神经网方法),并使用提供的深度残差网络(ResNet)实现实时人脸识别 ...
- 残差网络ResNet
文章目录 ResNet模型 两个注意点 关于x 关于残差单元 核心实验 原因分析 ResNet的效果 题外话 ResNet是由何凯明在论文Deep Residual Learning for Imag ...
- 深度残差网络RESNET
一.残差神经网络--ResNet的综述 深度学习网络的深度对最后的分类和识别的效果有着很大的影响,所以正常想法就是能把网络设计的越深越好, 但是事实上却不是这样,常规的网络的堆叠(plain netw ...
- 深度学习目标检测 RCNN F-RCNN SPP yolo-v1 v2 v3 残差网络ResNet MobileNet SqueezeNet ShuffleNet
深度学习目标检测--结构变化顺序是RCNN->SPP->Fast RCNN->Faster RCNN->YOLO->SSD->YOLO2->Mask RCNN ...
- 吴教授的CNN课堂:进阶 | 从LeNet到残差网络(ResNet)和Inception Net
转载自:https://www.jianshu.com/p/841ac51c7961 第二周是关于卷积网络(CNN)进阶部分,学到挺多新东西.因为之前了解过CNN基础后,就大多在用RNN进行自然语言处 ...
- 何恺明编年史之深度残差网络ResNet
文章目录 前言 一.提出ResNet原因 二.深度残差模块 1.数学理论基础 2.深度网络结构 三.Pytorch代码实现 四.总结 前言 图像分类是计算机视觉任务的基石,在目标监测.图像分割等任务中 ...
- 【深度学习】深度残差网络ResNet
文章目录 1 残差网络ResNet 1.1要解决的问题 1.2 残差网络结构 1.3 捷径连接 1.4 总结 1 残差网络ResNet 1.1要解决的问题 在传统CNN架构中,如果我们简单堆叠CN ...
最新文章
- NEU 1040 Count
- 【Google Play】正式版上架流程 ( 创建版本 | 设置国家地区 | 发布正式版 )
- ACL 2019 | 巧用文本语境信息:基于上下文感知的向量优化
- 【CDS技术揭秘系列 02】阿里云CDS-SLS大揭秘
- ACM题解系列之一:刘汝佳:《算法竞赛入门经典》(第2版)
- 两个富翁打赌_打赌您无法解决这个Google面试问题。
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 使用Java处理大文件
- 路德维希贝多芬计算机怎么操作,贝多芬是不是听不见和看不见
- 单片机 c语言 宏程序,宏程序学习的几点心得.doc
- 【EOS】EOS环境基础
- C# string.Format json格式字符串报错”输入字符串的格式不正确“
- 计算机桌面怎么改为d盘,win7怎么把桌面文件夹路径改为d盘
- Docker容器下安装ubantu,其中 command not found 的问题(已经解决)
- 从万物归零到虚拟与现实交错
- Android开发者进退两难的出路;转行还是进阶?转行转什么最好
- jenkins启动一直显示 Jenkins正在启动,请稍后...
- 浅谈光耦电路在开关量采集电路中的设计
- AJAXJSON基础入门与提升
- codeforces 448CPainting Fence