Optimization 如何使用渐变但不调整权重的图层?

Optimization 如何使用渐变但不调整权重的图层?,optimization,pytorch,backpropagation,Optimization,Pytorch,Backpropagation,是否可以标记向前传球的一部分,以便只向后传播梯度,而不调整权重 在下面的示例代码中,我有一个模块,它只使用一个层(一组参数),但在前进步骤中使用了两次。在优化过程中,我希望权重也能调整两次。如果我只想调整某一层使用的权重,我能做什么 导入火炬 类示例模型(torch.nn.Module): def _u初始(自身,dim)->无: 超级(示例模型,self)。\uuuuu init\uuuuuuu() 自线性=火炬nn线性(尺寸,尺寸) def前进(自身,x): out1=自线性(x)#在此处反

是否可以标记向前传球的一部分,以便只向后传播梯度,而不调整权重

在下面的示例代码中,我有一个
模块
,它只使用一个层(一组参数),但在前进步骤中使用了两次。在优化过程中,我希望权重也能调整两次。如果我只想调整某一层使用的权重,我能做什么

导入火炬
类示例模型(torch.nn.Module):
def _u初始(自身,dim)->无:
超级(示例模型,self)。\uuuuu init\uuuuuuu()
自线性=火炬nn线性(尺寸,尺寸)
def前进(自身,x):
out1=自线性(x)#在此处反向支撑梯度并调整权重
out2=自线性(out1)#此处仅支持后支撑渐变
返回2
#本例中的随机输入输出数据
N、 D=64100
x=火炬。随机数N(N,D)
y=火炬。随机数N(N,D)
模型=示例模型(D)
标准=torch.nn.MSELoss(reduce='sum')
optimizer=torch.optim.Adam(model.parameters())
y_pred=模型(x)
损失=标准(y_pred,y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
以下内容将不起作用,因为使用
火炬。没有梯度()
根本没有梯度反向传播:

def转发(自身,x):
out1=自线性(x)#在此处反向支撑梯度并调整权重
使用手电筒。无梯度()
out2=自线性(out1)#此处仅支持后支撑渐变
返回2
我不能简单地从优化中排除参数,因为它们需要在第一部分进行优化(即
out1=self.linear(x)
)。 出于同样的原因,我也不能将这些参数的学习率设置为0


我还可以做些什么来实现这一点?

一种方法是使用临时禁用图层参数上的渐变:

def forward(self, x):
    out1 = self.linear(x)  # backprop gradients and adjust weights here
    self.linear.requires_grad_(False)
    out2 = self.linear(out1)  # only backprop gradients here
    self.linear.requires_grad_(True)
    return out2
这仍然让梯度流通过激活;它只是阻止他们达到参数

您还可以考虑手动操作权张量和调用<代码> .Debug() >:


我在pytorch论坛上也问了这个问题,ptrblck为你的建议添加了解释:太好了,我把答案充实了一点
import torch.nn.functional as F
def forward(self, x):
    out1 = self.linear(x)
    out2 = F.linear(out1, self.linear.weight.detach(), self.linear.bias.detach())
    return out2