【发布时间】:2020-07-01 06:11:25
【问题描述】:
在 pytorch 中,是否有一种有效的方法来反向传播梯度但不更新其对应的变量?在更新期间每次复制权重似乎太昂贵了。但是no_grad & set_grad_enabled 不允许反向传播。
例如。以下似乎花费了太多时间,因为每次更新权重时都需要复制模型:
def __init__():
…
self.model = MyModel()
self.func1 = FuncModel1()
self.func2 = FuncModel2()
…
def trainstep(input):
f1 = self.func1(input)
f2 = self.func2(input)
…
# want to update weights in model & f1 with respect to loss1
loss1 = my_loss(model(f1), y1)
# don’t want to update weights in self.model with respect to loss2
# but want to update weights in f2 for loss2
copy_model = MyModel()
copy_model.load_state_dict(self.model.state_dict())
loss2 = my_loss(copy_model(f2), y2)
total_loss = loss1 + loss2
…
total_loss.backward()
optimizer.step()
【问题讨论】:
-
什么是 f1 和 f2?请显示您的完整模型定义
-
这不是真正的代码:我正在举一个例子。 f1 和 f2 是使用我要更新的权重计算的张量。
标签: pytorch gradient torch backpropagation