动手学深度学习 | 残差网络 ResNet | 27
ResNet
如果说CNN只要你连接一个网路的话, 那么只要连接ResNet就可以了。ResNet是一个很简单的,也是一个很好用的网络。
模型越复杂精度就越高吗?不是的。可以看下图,五角星是最优解,下面F表示模型的解范围,解范围越大,也就表示模型越复杂,那么可以看到,F3的最优解是比F6的最优解距离要短的,但是F6的复杂程度是远大于F3的。这就说明F6“学偏了”。
为了避免上述的情况,我们希望后面更加复杂的模型应该是严格包含前一个模型的解空间的,这样模型距离最优解才会越来越近(至少不会变差)。
后面这里使用了\(1*1\)卷积是为了避免通道数不同,不能进行相加。
这里的加法就是对应元素相加。
ResNet块
- 高宽减半的ResNet块(步幅为2),这里使用\(1*1\)卷积就是要把原来的x通道数进行减半
- 厚接多个高宽不变的ResNet块
ResNet152是用来刷分的一个模型,但实际用的并不是很多,因为它是现在是太贵了。
ResNet那个连接的思想,不仅在ResNet系列使用,基本现在所有新的网络,这个连接都会被使用,不管是Bert,transformer也好,这个残差连接基本就是一个标配了。
代码
QA
- 为什么LeNet的batch_size大于1000,收敛会慢?
因为如果batch_size大的话,其实是有很多重复的图片的,图片的多样性会少,对于重复的图片其实就是在进行重复计算,这样当然是会影响收敛精度的。
- f(x)=x+g(x),这样就能保证至少不会变坏吗?如果g(x)不是变好,那会怎么处理呢?
如果g(x)的贡献不大话,那么在进行梯度下降更新的时候,g(x)的参数就不怎么会被更新,而主要是去更新x的参数。
- 请问在
__init__
里为什么定义两个BN,这两个BN的参数一样吗?
这两个BN是不同的,因为有各自要学习的参数。
- 训练精度一定是高于测试精度的吗?
其实不一定,如果网络中加入了许多的“噪音”的话,那么很有可能测试精度是高于训练精度的。