如何在没有毕业成绩的多个输入模型中创建共享权重图层

时间:2019-07-15 10:44:34

标签: python neural-network deep-learning pytorch

我想创建一个具有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

2 个答案:

答案 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