【发布时间】:2021-04-26 23:04:39
【问题描述】:
我有一个包含许多卷积层的 CNN。对于这些卷积层中的每一个,我都附加了一个分类器,以检查中间层的输出。在为每个分类器产生损失之后,我想更新分类器的权重,而不触及卷积层的权重。这段代码:
for i in range(len(loss_per_layer)):
loss_per_layer[i].backward(retain_graph=True)
self.classifiers[i].weight.data -= self.learning_rate * self.alpha[i] * self.classifiers[i].weight.grad.data
self.classifiers[i].bias.data -= self.learning_rate * self.alpha[i] * self.classifiers[i].bias.grad.data
如果分类器由单个 nn.Linear 层组成,我可以这样做。但是,我的分类器是这样的:
self.classifiers.append(nn.Sequential(
nn.Linear(int(feature_map * input_shape[1] * input_shape[2]), 100),
nn.ReLU(True),
nn.Dropout(),
nn.Linear(100, self.num_classes),
nn.Sigmoid(),
))
如何在不触及网络其余部分的情况下更新 Sequential 块的权重?我最近从 keras 更改为 pytorch,因此不确定如何在这种情况下准确地使用 optimizer.step() 函数,但我怀疑可以使用它来完成。
请注意,我需要任何形状的序列块的通用解决方案,因为它会在模型的未来迭代中发生变化。
非常感谢任何帮助。
【问题讨论】:
标签: python deep-learning pytorch