【问题标题】:How to discard a branch after training a pytorch model训练pytorch模型后如何丢弃分支
【发布时间】:2021-08-19 16:31:09
【问题描述】:

我正在尝试在pytorch 中实现一个 FCN,其整体结构如下:

到目前为止的代码如下所示:

class SNet(nn.Module):
    def __init__(self):
        super(SNet, self).__init__()
        
        self.enc_a = encoder(...)
        self.dec_a = decoder(...)
        
        self.enc_b = encoder(...)
        self.dec_b = decoder(...)
    
    def forward(self, x1, x2):
        x1 = self.enc_a(x1)
        x2 = self.enc_b(x2)
        x2 = self.dec_b(x2)
        x1 = self.dec_a(torch.cat((x1, x2), dim=-1)
        return x1, x2

keras 中,使用函数式API 相对容易做到这一点。但是,我在pytorch 中找不到任何具体的示例/教程。

  1. 如何在训练后丢弃dec_a(自动编码器分支的解码器部分)?
  2. 在联合训练期间,loss 将是来自两个分支的loss 的总和(可选加权)?

【问题讨论】:

  • 你可以设置model.dec_a = nn.Identity(),让它不再做任何事情,只返回输入。这就是你要找的吗?
  • > 你可以设置 model.dec_a = nn.Identity() 如果我没记错的话还是会执行不必​​要的计算?
  • 它将用一个无操作层替换dec_a。所以原来的dec_a 执行的计算将不再发生。
  • 我不能在没有dec_a 的情况下创建新模型并使用训练网络中的相应块初始化权重吗?
  • 你可以。这相当于同一件事。如果您担心开销,可以查看nn.Identity() (pytorch.org/docs/stable/_modules/torch/nn/modules/…) 的来源;它实际上只是返回输入而不做任何事情。

标签: machine-learning pytorch autoencoder


【解决方案1】:

您还可以为模型定义单独的模式以进行训练和推理:

class SNet(nn.Module):
  def __init__(self):
    super(SNet, self).__init__()
    
    self.enc_a = encoder(...)
    self.dec_a = decoder(...)
    
    self.enc_b = encoder(...)
    self.dec_b = decoder(...)
    
    self.training = True

  def forward(self, x1, x2):
    if self.training:
        x1 = self.enc_a(x1)
        x2 = self.enc_b(x2)
        x2 = self.dec_b(x2)
        x1 = self.dec_a(torch.cat((x1, x2), dim=-1)
        return x1, x2
    else:
        x1 = self.enc_a(x1)
        x2 = self.enc_b(x2)
        x2 = self.dec_b(x2)
        return x2

这些块是示例,可能无法完全按照您的意愿执行,因为我认为您在块图中定义训练和推理操作的方式与您的代码之间存在一些歧义,但无论如何您都明白了仅在训练模式下如何使用某些模块。然后你可以相应地设置这个变量。

【讨论】:

  • 我明白你的意思。我正在寻找的是:``` else: x1 = self.enc_a(x1) x2 = self.enc_b(x2) x2 = self.dec_b(x2) x1 = self.dec_a(torch.cat((x1, x2 ), dim=-1) 返回 x1 ```
猜你喜欢
  • 2020-07-27
  • 2021-09-11
  • 2018-01-03
  • 1970-01-01
  • 2021-07-16
  • 2019-09-11
  • 2018-02-20
  • 1970-01-01
  • 2021-11-18
相关资源
最近更新 更多