【问题标题】:Build a pytorch model wrap around another pytorch model围绕另一个 pytorch 模型构建一个 pytorch 模型
【发布时间】:2021-06-23 10:12:19
【问题描述】:

是否可以将 pytorch 模型包装在另一个 pytorch 模块中?我无法像迁移学习(简单地连接更多层)那样以正常方式做到这一点,因为为了获得下一个“层”的预期值,我需要等待第一个模块的最后一层来生成多个输出(比如说 100)并使用所有这些输出来获取下一个“层”的值(比如取这些输出的最大值)。我试图将集成模型定义为如下所示:

class integrated(nn.Module):
    def __init__(self):
        super(integrated, self)._init_()

    
    def forward(self, x):

        model = VAE(
        encoder_layer_sizes=args.encoder_layer_sizes,
        latent_size=args.latent_size,
        decoder_layer_sizes=args.decoder_layer_sizes,
        conditional=args.conditional,
        num_labels=10 if args.conditional else 0).to(device)
        device = torch.device('cpu')
        model.load_state_dict(torch.load(r'...'))  # the first model is saved somewhere else beforehand
        model.eval()

        temp = []
        for j in range(100):
                x = model(x)
                temp.append(x)

        y=max(temp)

        return y

我想这样做的原因是我需要使用的库要求输入本身是一个 pytorch 模块。否则我可以简单地将最后一部分留在模块之外。

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    是的,您绝对可以在另一个 Pytorch 模块中使用 Pytorch 模块。您在示例代码中执行此操作的方式有点不寻常,但作为外部模块(VAE,在您的情况下) 更经常在 __init__ 函数中初始化,然后保存为主模块的属性 (integrated)。除此之外,这避免了每次调用 forward 时都必须重新加载子模块。

    另一件看起来有点滑稽的事情是你的 for 循环重复调用 model(x)。如果model 的评估不涉及随机性,那么您只需要一次调用model(x),因为所有 100 次调用都会给出相同的值。因此,假设存在一些随机性,您应该考虑是否可以通过将 100 个 x 副本批处理在一起并使用此批处理输入对 model 的单个调用来获得所需的效果。这最终取决于有关您为何在同一输入上多次调用此函数的其他信息,但无论哪种方式,使用单个批处理评估将比使用许多未批处理评估快 很多

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多