深度学习经典模型RESNET解析

深度学习经典模型RESNET解析

1. 理论基础

1. 残差学习概念

深度神经网络相当于函数的拟合过程(复合函数)。如果层数足够深,CNN可以拟合任何一个函数。

如果当网络的层数越来越深的时候,由于网络的退化现象(不妨假设拟合的是H(x)),难以训练出来。

那么可以改为训练(F(x) = H(x) - x),此在数学上成为残差(Residual)。则(H(x) = F(x) + x),相当于可以变相训练H(x),这就是残差学习。

用网络实现:将x直接倒入到输出,与经过权重层训练出来的F(x)相加。x的这个通路没有经过网络直接跨接过来,称为恒等映射短接(Identity Mapping Shortcut)。

2. RESNET构建形式

VGG19:19层,如果要扩展到34层,按设计原则堆积(3 imes3)的小卷积核,那么这个34层的网络称为平凡的网络,训练的话会出现退化。

变成残差网络:在层与层之间增加恒等映射跨接层即可。注意跨接层的表示,虚线意味着特征的大小发生了变化,跨接层就不再是恒等映射了

RESNET可以有不同的层数,虽然层数不同,但其具有类似的网络结构,例如它们都是分了五个部分:

(7 imes7)的卷积,后面紧跟一个池化层。第二部分为conv2.x(论文中称为stage),每一个stage里有多个block,不同的RESNET里每个stage中block的数目不一样,重复的次数也不一样,每个block是由若干个卷积层组成。

因此可以实现具有可扩展性的网络。

特殊的结构:最大平均池化(Global average pooling),在最后把整个通道变成一个数字(求平均值,全局平均池化)。作用:替代全连接层,更少的参数(更少的出现过拟合)。

pytorch中:torch.nn.AdaptivAvgPool2d.(output_size)

50层以上/以下的RESNET不同之处:50-没有bottle neck(瓶颈)。50层以上的block:三层组成,50层以下的block:两层组成。(面试:问对哪个模型熟悉,实现过resnet吗,50层+-区别...)。

bottle neck: (1 imes1 -> 3 imes3 ->1 imes1)

使用的原因:如果不降维,增加深度的时候参数量将会变得非常大。

3. 新发展

ResNeXt:分组卷积...注意力机制...WSL弱监督训练...

分组卷积最早出现在AlexNet(当时GPU显存比较小),后来发现还能提高准确度。

2. 代码实现

import torch
import torch.nn as nn
from torch.hub import load_state_dict_from url#预训练权重值引入
model_urls = { }
#padding:扩充图片, 在图片外围补充一些像素点,把这些像素点初始化为0.
#bias:偏置单元
def conv3x3(in_planes, out_planes, stride = 1, padding = 1):
  return nn.Conv2d(in_planes, out_planes, kernel_size = 3, stride = stride, padding = padding, bias = False)#提前封装一下3x3卷积,in_planes, out_planes为输入输出通道数的大小
#bias为False的原因?
def conv1x1(in_planes, out_planes, stride = 1):
  return nn.Conv2d(in_planes, out_planes, kernel_size = 1, stride = stride, bias = False)
class BasicBlock(nn.module):#block类
	super(BasicBlock, self).__init__()#调用父类的初始化函数
//未完待续
  
原文地址:https://www.cnblogs.com/lipoicyclic/p/14583742.html