我想创建一个具有2个输入x和y的模型。我想让损失函数只关心x。因此,该模型只能使用x优化前一层。但是现在即使损失仅与x有关,优化也会在前一层计算x和y。
我试图使y成为y.detach()以使grads停止。但这行不通。而且我也想尝试创建新的共享权重图层,但是我不知道该怎么做。
def forward(self, x, y=None):
x = self.conv1(x)
x = self.bn1(x)
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
y = self.conv1(y)
y = self.bn1(y)
y = self.maxpool(y)
y = self.layer1(y)
return x, y
答案 0 :(得分:0)
您所做的应该有效,您只需要将y.detach()
放在最后,如果损失不包含y
,则不应通过y
修改权重无论如何。
def forward(self, x, y=None):
x = self.conv1(x)
x = self.bn1(x)
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
y = self.conv1(y)
y = self.bn1(y)
y = self.maxpool(y)
y = self.layer1(y)
return x, y.detach()
答案 1 :(得分:0)
最后我使用了一些技巧来解决问题。稍后我将在输出中尝试y.detach()。现在,我通过手动停止渐变来解决此问题。代码:
def forward(self, x, y):
x = self.conv1(x)
x = self.bn1(x)
# x = self.relu(x) # add missed relu
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
self.eval()
y = self.conv1(y)
y = self.bn1(y)
y = self.maxpool(y)
y = self.layer1(y)
self.train()
return x, y