Onnx-to-keras 和 Keras2onnx 将 ONNX 模型输入层更改为 Nx1x200x200 而不是原来的 1x1x200x200
Onnx-to-keras and Keras2onnx alter ONNX model input layers to Nx1x200x200 instead of the original 1x1x200x200
目前,我正在尝试将 ONNX model
导入 Keras,以便 运行 在大小为 1x1x200x200 的灰度图像数据集上进行训练。
但是,当我使用
将我的 onnx 模型转换为 Keras 时
onnx-to-keras()
模型的输入层更改为 ?x1x200x200 作为 .h5 model
.
并且当转换回 .onnx 文件时,输入层已更改为 Nx1x200x200。
这在尝试训练模型时有效,但在使用 ONNX Runtime 将经过训练的神经网络部署到 C Plus Plus 代码时,更改的输入层会导致错误。
这是因为 N
被读取为导致溢出的 -1 维层。
C++ 代码适用于原始模型,其中输入层预计接收 1x1x200x200 图像。
我已经尝试在 numpy 数组张量上使用 reshape() 更改张量输入,但这对更改后的模型没有影响。
只是想知道这是否可以修复,我们将不胜感激。谢谢!
回答我自己的问题,
从 ONNX 到 Keras 的转换器目前不是 1-1。因此,为了实现完整性,keras 转换器似乎在输入时更改 ONNX 模型以接收任意输入值(N 维)。要解决此问题,我只需训练网络、编辑输入和输出层,然后重新导出模型以使 C Plus Plus 代码正常工作。
k_model.summary()
k_model._layers.pop(-1)
k_model._layers.pop(-1)
k_model.summary()
newInput = Input(batch_shape=(1,1,200,200))
newOutputs = k_model(newInput)
newModel = Model(newInput,newOutputs)
newModel.summary()
我目前正在尝试弄清楚这是否会保留原始模型的权重。但目前看来,“新模式”中似乎已经有了权重,这是一个好兆头。
目前,我正在尝试将 ONNX model
导入 Keras,以便 运行 在大小为 1x1x200x200 的灰度图像数据集上进行训练。
但是,当我使用
将我的 onnx 模型转换为 Keras 时onnx-to-keras()
模型的输入层更改为 ?x1x200x200 作为 .h5 model
.
并且当转换回 .onnx 文件时,输入层已更改为 Nx1x200x200。
这在尝试训练模型时有效,但在使用 ONNX Runtime 将经过训练的神经网络部署到 C Plus Plus 代码时,更改的输入层会导致错误。
这是因为 N
被读取为导致溢出的 -1 维层。
C++ 代码适用于原始模型,其中输入层预计接收 1x1x200x200 图像。
我已经尝试在 numpy 数组张量上使用 reshape() 更改张量输入,但这对更改后的模型没有影响。
只是想知道这是否可以修复,我们将不胜感激。谢谢!
回答我自己的问题,
从 ONNX 到 Keras 的转换器目前不是 1-1。因此,为了实现完整性,keras 转换器似乎在输入时更改 ONNX 模型以接收任意输入值(N 维)。要解决此问题,我只需训练网络、编辑输入和输出层,然后重新导出模型以使 C Plus Plus 代码正常工作。
k_model.summary()
k_model._layers.pop(-1)
k_model._layers.pop(-1)
k_model.summary()
newInput = Input(batch_shape=(1,1,200,200))
newOutputs = k_model(newInput)
newModel = Model(newInput,newOutputs)
newModel.summary()
我目前正在尝试弄清楚这是否会保留原始模型的权重。但目前看来,“新模式”中似乎已经有了权重,这是一个好兆头。