【问题标题】:Is there any way to convert pretrained model from PyTorch to ONNX?有什么方法可以将预训练模型从 PyTorch 转换为 ONNX?
【发布时间】:2018-10-24 16:19:49
【问题描述】:

我在我的自定义数据集上训练了 StarGAN 模型。 我需要将此模型从 .pth(Pytorch) 转换为 .pb 以便在 Android Studio 上使用。 我搜索了很多,我找到了一些转换的方法。 但是,所有解决方案都不适用于我的情况。

我尝试了只包含一个 nn.Linear 层的小型网络。 在这个网络上,解决方案效果很好!

我认为,我的网络包括 Conv2D 层和 MaxPooling2D 层,因此转换处理不起作用。

首先,这是我的网络(StarGAN)。

import torch
import torch.nn as nn
import numpy as np


class ResidualBlock(nn.Module):
    def __init__(self, dim_in, dim_out):
        super(ResidualBlock, self).__init__()
        self.main = nn.Sequential(
            nn.Conv2d(dim_in, dim_out, kernel_size=3, stride=1, padding=1, bias=False),
            nn.InstanceNorm2d(dim_out, affine=True, track_running_stats=True),
            nn.ReLU(inplace=True),
            nn.Conv2d(dim_out, dim_out, kernel_size=3, stride=1, padding=1, bias=False),
            nn.InstanceNorm2d(dim_out, affine=True, track_running_stats=True))

    def forward(self, x):
        return x + self.main(x)


class Generator(nn.Module):
    def __init__(self, conv_dim=64, c_dim=5, repeat_num=6):
        super(Generator, self).__init__()

        layers = []
        layers.append(nn.Conv2d(3 + c_dim, conv_dim, kernel_size=7, stride=1, padding=3, bias=False))
        layers.append(nn.InstanceNorm2d(conv_dim, affine=True, track_running_stats=True))
        layers.append(nn.ReLU(inplace=True))

        curr_dim = conv_dim
        for _ in range(2):
            layers.append(nn.Conv2d(curr_dim, curr_dim * 2, kernel_size=4, stride=2, padding=1, bias=False))
            layers.append(nn.InstanceNorm2d(curr_dim * 2, affine=True, track_running_stats=True))
            layers.append(nn.ReLU(inplace=True))
            curr_dim = curr_dim * 2

        for _ in range(repeat_num):
            layers.append(ResidualBlock(dim_in=curr_dim, dim_out=curr_dim))

        for _ in range(2):
            layers.append(nn.ConvTranspose2d(curr_dim, curr_dim // 2, kernel_size=4, stride=2, padding=1, bias=False))
            layers.append(nn.InstanceNorm2d(curr_dim // 2, affine=True, track_running_stats=True))
            layers.append(nn.ReLU(inplace=True))
            curr_dim = curr_dim // 2

        layers.append(nn.Conv2d(curr_dim, 3, kernel_size=7, stride=1, padding=3, bias=False))
        layers.append(nn.Tanh())
        self.main = nn.Sequential(*layers)

    def forward(self, x, c):
        c = c.view(c.size(0), c.size(1), 1, 1)
        c = c.repeat(1, 1, x.size(2), x.size(3))
        x = torch.cat([x, c], dim=1)
        return self.main(x)


class Discriminator(nn.Module):
    def __init__(self, image_size=128, conv_dim=64, c_dim=5, repeat_num=6):
        super(Discriminator, self).__init__()
        layers = []
        layers.append(nn.Conv2d(3, conv_dim, kernel_size=4, stride=2, padding=1))
        layers.append(nn.LeakyReLU(0.01))

        curr_dim = conv_dim
        for _ in range(1, repeat_num):
            layers.append(nn.Conv2d(curr_dim, curr_dim * 2, kernel_size=4, stride=2, padding=1))
            layers.append(nn.LeakyReLU(0.01))
            curr_dim = curr_dim * 2

        kernel_size = int(image_size / np.power(2, repeat_num))
        self.main = nn.Sequential(*layers)
        self.conv1 = nn.Conv2d(curr_dim, 1, kernel_size=3, stride=1, padding=1, bias=False)
        self.conv2 = nn.Conv2d(curr_dim, c_dim, kernel_size=kernel_size, bias=False)

    def forward(self, x):
        h = self.main(x)
        out_src = self.conv1(h)
        out_cls = self.conv2(h)
        return out_src, out_cls.view(out_cls.size(0), out_cls.size(1))

这是错误信息。

TypeError: object of type 'torch._C.Value' has no len() (occurred when translating repeat)

有什么方法可以转换吗?帮帮我。

【问题讨论】:

    标签: python deep-learning pytorch caffe2 onnx


    【解决方案1】:

    我在尝试使用 TensorboardX 生成模型图表时遇到了同样的问题。

    我相信错误来自运营商torch.onnx 当前支持的内容。您可以查看此链接:
    https://pytorch.org/docs/stable/onnx.html
    在支持的运算符部分下,您会看到repeat 未列出。

    要回答您的问题,您目前似乎无法使用repeat 和torch.onnx 转换模型。

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2021-10-04
      • 2022-10-13
      • 2023-01-31
      • 2019-11-10
      • 2019-03-08
      • 2018-10-05
      • 1970-01-01
      • 2018-11-25
      相关资源
      最近更新 更多