有时我们会用其他任务(如分类)预训练好网络,然后固定卷积层作为图像特征提取器,然后用当前任务的数据只训练全连接层。那么PyTorch如何在训练时固定底层只更新上层呢?这意味着我们希望反向传播计算梯度时,我们只希望计算到最上面的卷积层,对于卷积层,我们并不希望计算梯度并用梯度来更新参数。
我们知道,网络中的所有操作对象都是Variable对象,而Variable有两个参数可以用于这个目的:requires_grad和volatile。
requires_grad=False
在用户手动定义Variable时,参数requires_grad默认值是False。而在Module中的层在定义时,相关Variable的requires_grad参数默认是True。
在计算图中,如果有一个输入的requires_grad是True,那么输出的requires_grad也是True。只有在所有输入的requires_grad都为False时,输出的requires_grad才为False。
>>>x = Variable(torch.randn(2, 3), requires_grad=