【问题标题】:How to share the common parts of two models in pytorch?pytorch中如何共享两个模型的共同部分?
【发布时间】:2023-03-21 07:20:01
【问题描述】:

我在使用 pytorch 实现模型时遇到了问题。

我想建两个模型,其中一些是共享的,像这样共享编码器部分

Model1: input_1 -> encoder -> decoder_1 -> ouput_1
Model2: input_2 -> encoder -> decoder_2 -> ouput_2  

我想做的是让两个模型一起使用编码器部分,但解码器部分不一样。查了一下参数共享,但是好像和这里的要求有些出入。

我自己的想法是建立一个包含encode、decoder_1、decoder_2的模型,然后根据输入选择使用哪个decoder。

我不太清楚这个方法,如果可以的话,你能举个简单的例子来使用两个模型的共同部分吗?

【问题讨论】:

    标签: deep-learning conv-neural-network pytorch


    【解决方案1】:

    你可以这样做:

    import torch.nn as nn
    
    class SharedModel(nn.Module):
        def __init__(self, mode):
            super(SharedModel, self).__init__()
            self.mode = mode # use 1 or 2
    
            self.encoder = ...
            self.decoder_1 = ...
            self.decoder_2 = ...
    
    
        def forward(self, x):
            x = self.encoder(x)
            if self.mode == 1:
                x = self.decoder_1(x)
            elif self.mode == 2:
                x = self.decoder_2(x)
            else:
                raise ValueError("Unkown mode.")
            return x
    

    【讨论】:

    • 前向函数中的模式是否比初始化函数中的模式好一些?因为在训练的时候输入了两种数据。
    • @DirkLi 您可以使用model = SharedModel() 轻松更改模式,然后在需要更改操作模式时设置model.mode = 1 # or 2
    【解决方案2】:

    我不会做一个SharedModel,宁愿做两个,而是分享encoder的一部分。

    import torch
    
    class Model(torch.nn.Module):
        def __init__(self, encoder, decoder):
            super().__init__()
            self.encoder: torch.nn.Module = encoder
            self.decoder: torch.nn.Module
    
    
        def forward(self, x):
            return self.decoder(self.encoder)
    
    encoder = ...
    decoder1 = ...
    decoder2 = ...
    first = Model(encoder, decoder1)
    second = Model(encoder, decoder2)
    

    您也可以拆分Model 类,但本质上,将编码器作为参数传递给构造函数,它将在您喜欢的多个模型之间共享。

    不需要if、自定义mode 和其他解决方法。此外,它是独立于输入的,不会意外传递错误的输入并得到结果。

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 2019-04-02
      • 2018-06-10
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2022-01-06
      • 2018-04-03
      • 1970-01-01
      相关资源
      最近更新 更多