【问题标题】:Trouble converting pyTorch model to ONNX无法将 pyTorch 模型转换为 ONNX
【发布时间】:2019-11-10 17:02:18
【问题描述】:

我想将我的 pyTorch 模型转换为 ONNX。但是,我收到一条错误消息,说

RuntimeError: 提供的输入名称数量 (9) 超过了输入数量 (7) 但是,如果我从模型中取出两个 Dropout 层,我的代码会完美运行。

这是为什么?

这是我的代码:

# Define the model
model = torch.nn.Sequential(
    torch.nn.Linear(D_in, H),
    torch.nn.ReLU(),
    torch.nn.Dropout(0.2),  # problem with dropout layer
    torch.nn.Linear(H, H),
    torch.nn.LeakyReLU(),
    torch.nn.Dropout(0.2),  # problem with dropout layer
    torch.nn.Linear(H, D_out),
    torch.nn.Sigmoid()
)
checkpoint = torch.load("./saved_pytorch_model.pth")  # load pyTorch model
model.load_state_dict(checkpoint['state_dict'])
features = torch.Tensor(df_X.values[0])
# Convert pyTorch model to ONNX
input_names = ['input_1']
output_names = ['output_1']
for key, module in model._modules.items():
    input_names.append("l_{}_".format(key) + module._get_name())
torch_out = torch.onnx.export(model, 
                         features, 
                         "onnx_model.onnx", 
                         export_params = True, 
                         verbose = True, 
                         input_names = input_names, 
                         output_names = output_names,
                        )

如何将其导出到包含 Dropout 的 ONNX?

【问题讨论】:

  • 只需设置input_names = [] 或忽略该参数。
  • 如果我将 input_names 设置为 [],它并不能解决我的问题,因为输入名称和输入数量仍然不匹配。
  • 看我在写答案之前说过,如果你忽略那个参数会发生什么。

标签: python deep-learning pytorch onnx


【解决方案1】:

这对我来说似乎是一个错误。 您可以将输入名称参数注释掉。

# Convert pyTorch model to ONNX
input_names = ['input_1']
output_names = ['output_1']
for key, module in model._modules.items():
    input_names.append("l_{}_".format(key) + module._get_name())
torch_out = torch.onnx.export(model, 
                         features, 
                         "onnx_model.onnx", 
                         export_params = True, 
                         verbose = True, 
                         #input_names = input_names, 
                         output_names = output_names,
                        )

您将获得带有% 的输入名称,如下所示:

graph(%input.1 : Float(10, 3, 224, 10)
      %1 : Float(10, 10)
      %2 : Float(10)
      %3 : Float(10, 10)
      %4 : Float(10)
      %5 : Float(10, 10)
      %6 : Float(10)) {
  %7 : Float(10!, 10!) = onnx::Transpose[perm=[1, 0]](%1), scope: Sequential/Linear[0]
  %8 : Float(10, 3, 224, 10) = onnx::MatMul(%input.1, %7), scope: Sequential/Linear[0]
  %9 : Float(10, 3, 224, 10) = onnx::Add(%8, %2), scope: Sequential/Linear[0]
  %10 : Float(10, 3, 224, 10) = onnx::Relu(%9), scope: Sequential/ReLU[1]
  %11 : Float(10, 3, 224, 10), %12 : Tensor = onnx::Dropout[ratio=0.2](%10), scope: Sequential/Dropout[2]
  %13 : Float(10!, 10!) = onnx::Transpose[perm=[1, 0]](%3), scope: Sequential/Linear[3]
  %14 : Float(10, 3, 224, 10) = onnx::MatMul(%11, %13), scope: Sequential/Linear[3]
  %15 : Float(10, 3, 224, 10) = onnx::Add(%14, %4), scope: Sequential/Linear[3]
  %16 : Float(10, 3, 224, 10) = onnx::LeakyRelu[alpha=0.01](%15), scope: Sequential/LeakyReLU[4]
  %17 : Float(10, 3, 224, 10), %18 : Tensor = onnx::Dropout[ratio=0.2](%16), scope: Sequential/Dropout[5]
  %19 : Float(10!, 10!) = onnx::Transpose[perm=[1, 0]](%5), scope: Sequential/Linear[6]
  %20 : Float(10, 3, 224, 10) = onnx::MatMul(%17, %19), scope: Sequential/Linear[6]
  %21 : Float(10, 3, 224, 10) = onnx::Add(%20, %6), scope: Sequential/Linear[6]
  %output_1 : Float(10, 3, 224, 10) = onnx::Sigmoid(%21), scope: Sequential/Sigmoid[7]
  return (%output_1);
}

【讨论】:

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