将PyTorch模型转换为Keras模型使用ONNX。

5
我希望将一个PyTorch模型转换为Keras模型,使用ONNX基于这篇Medium文章:https://medium.com/analytics-vidhya/pytorch-to-keras-using-onnx-71d98258ad76。我复制了和这篇文章一样的代码,但是在我想将ONNX模型转换为Keras时,遇到了这个错误:ValueError: 'onnx::Add_6_reshape/' is not a valid root scope name. A root scope name has to match the following pattern: ^[A-Za-z0-9.][A-Za-z0-9_.\/>-]*$。有人知道怎么解决吗?
1个回答

0

取决于您要转换的模型,但您可以尝试以下操作:

  1. 安装pt2keras:https://github.com/JWLee89/pt2keras
pip install -U pt2keras
  1. 使用下面的脚本转换模型(已测试)

import tensorflow as tf

from pt2keras import Pt2Keras
from pt2keras import converter

import torch.nn.functional as F
import torch.nn as nn


class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.hidden = nn.Linear(784, 128)
        self.output = nn.Linear(128, 10)

    def forward(self, x):
        x = self.hidden(x)
        x = F.sigmoid(x)
        x = self.output(x)
        return x


if __name__ == '__main__':
    input_shape = (1, 784)

    # Grab model
    model = Model()

    # Create pt2keras object
    converter = Pt2Keras()

    # convert model
    # model can be both pytorch nn.Module or 
    # string path to .onnx file. E.g. 'model.onnx'
    keras_model: tf.keras.Model = converter.convert(model, input_shape)

    # Save the model
    keras_model.save('output_model.h5')

我是这个软件包的作者,这主要是在我的空闲时间内快速完成的,但希望它能对你有用。

我在我的本地环境中测试了上面的代码,它对我有效。


你好!我想使用你的代码,但是似乎不能与conv2d层一起使用。 我尝试了一个超级简单的网络,有一个1维大小为3的过滤器的conv2d层,后面跟着一个relu层。我得到以下错误“无法转换模型。当前不支持以下操作:- ConstantOfShape”。我试着看了一下你的github页面,但是有关relu层的示例并没有帮助。 - Eddymage
从错误信息来看,我认为这是因为onnx的ConstantOfShape转换器还没有被添加到主要的转换器存储库中。我还没有添加ConstantOfShape转换器,因为当前的运算符已经支持了我特定的转换用例。你能把简单的模型架构发给我吗?然后我会编写一个转换器并更新存储库。或者,您可以使用@converter('ConstantOfShape')装饰器编写自己的转换器。 - J. Lee
是的,它就是在这个问题中所描述的那个(没有批量归一化层)。我尝试按照您的建议去做,但由于我不知道如何进行转换,因为我对Python编程并不是很熟悉,所以我停止了。 - Eddymage
1
谢谢提供链接。我会查看并回复您。 - J. Lee
好的,暂时如果您想看到成功的转换,可以尝试从示例代码中删除 track_running_stats=False 这一部分。在我的端上,删除此部分后转换工作正常。我需要在闲暇时间深入研究这个问题。 - J. Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接