需要掌握的点是:作用,具体操作,直接映射并相加
Resnet50的作用
这么简单的问题需要搞那么复杂么?
dy(x)/dx=F(x)=> y(x)=x+F(x)*dt,这不就是个微分方程的差分化么? 所以ResNet就是个微分方程啊。 至于说其收敛性好,就是通过这种操作使得网络的结构更均匀,整个映射就是由几乎完全一样的模块来构造,而且当F(x)=0的时候,相应的模块就相当于不存在,或者是当F(x)按照一定比例scaling的时候,等价于调整步长dx, 这种结构使得映射空间的曲率更平滑,基本是均匀的,并且可以或者通过跳过某些F(x)模块或者通过对F(x)的scaling来调整映射复杂度,达到模型复杂度和问题复杂度的更好的匹配,这一点在普通的CNN中是很难完成的。简单说,ResNet构造了一个平滑的解空间流形,在这个平滑的流形上更容易找到解。
其实这句话,我们也可以反思我们,梯度下降还是我们的机器学习里面的GBDT也是有残差的概念,其实我觉得大家都思想都是差不多的,那就是残差。所以为什么Resnet 叫做残差网络,的确是在弥补残差,或者是决定弥补多少残差。
ResNet / DenseNet 等一系列工作,本质上都是在调整网络结构以去适应优化器。
------ 重要的地方
1.总结让模型自己去决定网络的深度,梯度可以更好的向前传播
2.残差这两个字眼出发,为什么叫做残差网络而不是叫做其他的网络,是因为这个残差和我们的GBDT的很相似,也就是让额外的层来弥补这一层特征没有正确表达的地方。也就是上面提到了的微分方程离散化的问题。
— ResNet v1与ResNet v2的区别
def forward(self, x):
residual = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out = self.relu(out)
out = self.conv3(out)
out = self.bn3(out)
if self.downsample is not None:
residual = self.downsample(x)
out += residual
out = self.relu(out)
return out
https://blog.csdn.net/gbyy42299/article/details/81505083
https://zhuanlan.zhihu.com/p/42706477
关键就是激活函数不能在分之之前,BN层不能在addition之后,但是可以在非直接映射那一部分。前者会影响模型的表达,后者会改变x的分布,不符合直接映射的条件 更直观的说法就是要恒等映射,这两者都不能带来,一个是全部都不能带来一个是局部都不能带来。
图的结构有两个特点:1、conv-bn-relu;2、最后的relu在addition后面 3. BN要在前面。
添加链接描述
1.网络本身决定深度
2.可以不同层的特征进行结合
3.残差本身可以弥补之前的缺陷GBDT