【问题标题】:Get encoder from trained UNet从经过训练的 UNet 获取编码器
【发布时间】:2020-12-25 02:28:42
【问题描述】:

我已经在一些图像上训练了一个 UNet 模型,但现在我想提取模型的编码器部分。我的 UNet 具有以下架构:

UNet(
  (conv_final): Conv2d(8, 1, kernel_size=(1, 1), stride=(1, 1))
  (down_convs): ModuleList(
    (0): DownConv(
      (conv1): Conv2d(1, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    )
    (1): DownConv(
      (conv1): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    )
    (2): DownConv(
      (conv1): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    )
    (3): DownConv(
      (conv1): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    )
    (4): DownConv(
      (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    )
  )
  (up_convs): ModuleList(
    (0): UpConv(
      (upconv): ConvTranspose2d(128, 64, kernel_size=(2, 2), stride=(2, 2))
      (conv1): Conv2d(128, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    )
    (1): UpConv(
      (upconv): ConvTranspose2d(64, 32, kernel_size=(2, 2), stride=(2, 2))
      (conv1): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    )
    (2): UpConv(
      (upconv): ConvTranspose2d(32, 16, kernel_size=(2, 2), stride=(2, 2))
      (conv1): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    )
    (3): UpConv(
      (upconv): ConvTranspose2d(16, 8, kernel_size=(2, 2), stride=(2, 2))
      (conv1): Conv2d(16, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (conv2): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    )
  )
)

我尝试通过 model.down_convs 加载编码器层,但出现以下错误:

TypeError Traceback(最近一次调用最后一次)在 ----> 1 res = 编码器(train_img)

~/anaconda3/envs/work/lib/python3.8/site-packages/torch/nn/modules/module.py 在通话中(自我,*输入,**kwargs)548 结果= self._slow_forward(*input, **kwargs) 549 else: –> 550 result = self.forward(*input, **kwargs) 551 用于挂钩 self._forward_hooks.values(): 552 hook_result = hook(self, input, 结果)

TypeError: forward() 接受 1 个位置参数,但给出了 2 个

我已附上model,您可以试试看。以及来自here的权重

请告诉我。

【问题讨论】:

    标签: python-3.x deep-learning pytorch autoencoder encoder-decoder


    【解决方案1】:

    这应该可行。

    net = UNet(8) # network object having 8 classes
    net.load_state_dict(torch.load('PATH'))
    print(net) #see the names of the layers of encoder. 
    net1 = net.down_convs #as you have named the encoder as down_convs
    
    #net1 is your encoder. 
    

    【讨论】:

    猜你喜欢
    • 2020-12-07
    • 2019-02-15
    • 2019-08-22
    • 2019-05-28
    • 2020-08-19
    • 2023-03-16
    • 2019-10-12
    • 2021-01-03
    • 2016-05-14
    相关资源
    最近更新 更多