今天学习并实现了ResNet——残差网络,在CIFAR10集合上进行训练。
首先是残差的理解,一般的神经网络输入x,期望输出是H(X),神经网络本身可以看做F(x),训练的目标是F(x)=H(x),而对于ResNet,把输入x加上F(x)作为输出,因此变成F(x)+x=H(x),所以训练的目标变成F(x)=H(x)-x,神经网络训练的目标变成了残差。看起来很容易的东西,但是第一个想到确实很难哎。。。。
书中对ResNet实现,__init__中的layers让我琢磨了好久,仔细读代码后发现就是表示堆叠多少个残差模块,layers里面只用了两个整数,在layer1、2、3中表示分别堆叠多少个残差模块,但是不知道这样的好处是什么?为啥不用blocks_in_1、blocks_in_2这样的参数命名?
这是训练20次迭代后再训练集上达到的效果:
Test loss: 1.158967, acc: 0.634400
这是训练50次迭代后在训练集上达到的效果:
loss: 0.759746, acc: 0.762700
领取专属 10元无门槛券
私享最新 技术干货