【问题标题】:Error trying to convert simple convolutional model to CoreML尝试将简单卷积模型转换为 CoreML 时出错
【发布时间】:2020-07-10 01:05:43
【问题描述】:

我正在尝试转换一个简单的 GAN 生成器(来自 ClusterGAN):

self.name = 'generator'
self.latent_dim = latent_dim
self.n_c = n_c
self.x_shape = x_shape
self.ishape = (128, 7, 7)
self.iels = int(np.prod(self.ishape))
self.verbose = verbose

self.model = nn.Sequential(
    # Fully connected layers
    torch.nn.Linear(self.latent_dim + self.n_c, 1024),
    nn.BatchNorm1d(1024),
    nn.LeakyReLU(0.2, inplace=True),
    torch.nn.Linear(1024, self.iels),
    nn.BatchNorm1d(self.iels),
    nn.LeakyReLU(0.2, inplace=True),

    # Reshape to 128 x (7x7)
    Reshape(self.ishape),

    # Upconvolution layers
    nn.ConvTranspose2d(128, 64, 4, stride=2, padding=1, bias=True),
    nn.BatchNorm2d(64),
    nn.LeakyReLU(0.2, inplace=True),

    nn.ConvTranspose2d(64, 1, 4, stride=2, padding=1, bias=True),
    nn.Sigmoid()
)

但 onnx-coreml 失败并显示 Error while converting op of type: BatchNormalization. Error message: provided number axes 2 not supported

我以为是 BatchNorm2d,所以我尝试重塑和应用 BatchNorm1d,但我得到了同样的错误。有什么想法吗?我很惊讶我在转换如此简单的模型时遇到问题,所以我假设我一定遗漏了一些明显的东西。

我的目标是 iOS 13 并使用 Opset v10 进行 onnx 转换。

【问题讨论】:

    标签: pytorch coreml generative-adversarial-network


    【解决方案1】:

    Core ML 没有一维批量规范。张量必须至少具有 3 级。

    如果要转换此模型,则应将批范数权重折叠到前一层的权重中,并删除批范数层。 (我认为 PyTorch 没有办法自动为您执行此操作。)

    【讨论】:

    • 是的,通过更详细的步骤,我意识到BatchNorm1d 是最初发生错误的地方。从BatchNorm2d 中删除我得到axes -1 not supported 错误的那些。你的建议听起来很合理,但我不得不承认我不知道我会如何去做。您是指以某种方式编辑经过训练的模型,还是可以在 PyTorch 中完成?
    • BatchNorm 是一种线性变换,Linear 也是如此(显然)。如果你写出数学,你可以将来自 batchnorm 层的权重与线性层的权重和偏差结合起来。然后从 PyTorch 模型中移除 batchnorm 层。数学并不难,但我现在没有时间把它全部写出来。
    • 好的,谢谢。实际上,我已经使用 LibTorch 在 iOS 上很好地运行了该模型,所以我现在就使用它。
    猜你喜欢
    • 2018-07-05
    • 2018-06-14
    • 1970-01-01
    • 2021-07-17
    • 2017-11-23
    • 2017-12-09
    • 1970-01-01
    • 2019-06-29
    • 2017-12-10
    相关资源
    最近更新 更多