我有一个包含多个层的神经网络,但在其中一层中,我需要改变一些神经元的权重和偏差(w 和 b) 然而,允许同一层中其他神经元的其他 w 和 b训练过程中的变化。我正在使用 PyTorch。
所以假设n层有X1 + X2 = X神经元。我需要修复 X1 神经元的 w 和 b,并让其他 X2 神经元在训练过程中发生变化。
一个简单的入门想法会对我有好处,甚至如何去做!
我曾尝试使用
LocallyConnected1D
层,但网络的可视化描绘了与我需要的非常不同的东西。
来自 PyTorch 示例,使用经过训练的 CNN 作为单层感知器的固定特征提取器,执行以下操作:
model_conv = torchvision.models.resnet18(weights='IMAGENET1K_V1')
for param in model_conv.parameters():
param.requires_grad = False
冻结
model_conv
的参数。 PyTorch 网站上的示例然后继续将 model_conv
的输出传递给像往常一样训练的 Linear
层。
requires_grad
参数的文档,这是冻结部分模型的推荐方法:
设置 requires_grad 应该是控制模型的哪些部分是梯度计算的一部分的主要方式,例如,如果您需要在模型微调期间冻结部分预训练模型。
通过在上面的示例中添加
if
条件,您应该能够仅冻结一些参数,同时保留其他参数。
for name, parameter in yournetwork.named_parameters():
if 'key' in name:
parameter.requires_grad = False
您可以将“键”更改为您要修复的参数,此操作将冻结您选择的层的权重。