1.pytorch保存模型形式onnx

# model是加在权重后的pytorch模型,model.proto是生成的onnx模型
input = Variable(torch.randn(1, 3, 64, 64))
torch.onnx.export(model, input, 'model.proto', verbose=True)

2.onnx模型转成paddle
https://github.com/PaddlePaddle/X2Paddle/tree/master/onnx2fluid

# 终端运行 -o export 输出的paddle模型文件夹,model.proto是onnx模型
onnx2fluid_convert -o export model.proto

注意pytorch是动态图,部分操作转换过程中会出错,如模型之前用了.size()操作,在onnx模型中就会出现Tensor = onnx::Shape(%55)操作,进而在转换过程中出现[‘var_55’] -> ::Shape -> [‘var_79’]的错误。
3.测试

# 终端运行 -t data.npz 测试数据
onnx2fluid_validate -t data.npz export/__model__

重点在于准备测试数据,这里的npz文件需要两步操作
第一步自己生成

# 以输入是图片,输出是两个值为例
np.savez('data.npz', inputs = img.numpy(), outputs1 = oup1.numpy(), outputs2 = oup2.numpy())

第二步需要转换成validate需要的npz形式
validate需要的npz形式是一共两个key,‘inputs’和’outputs’,两个key对应的value都是字典的形式,也就是{‘input1’: , ‘input2’: ,},这里的’input1’必须要是paddle网络图中的节点名(可以通过export/model.py查看)。
这里的转换参考了onnx2fluid中的examples/convert_data_npz.py

fn = sys.argv[1]
input_names = sys.argv[2].split(',')
output_names = sys.argv[3].split(',')
squeeze_data = len(sys.argv) > 4

data = np.load(fn, encoding='bytes',allow_pickle=True)
input_data = data['inputs']
output1_data = data['outputs1']
output2_data = data['outputs2']

while squeeze_data and input_data.ndim > 4 and input_data.shape[0] == 1:
    input_data = input_data.squeeze(0)
while squeeze_data and output1_data.ndim > 2 and output1_data.shape[0] == 1:
    output1_data = output1_data.squeeze(0)
while squeeze_data and output2_data.ndim > 3 and output2_data.shape[0] == 1:
    output2_data = output2_data.squeeze(0)

inputs = Dict(zip(map(make_var_name, input_names), [input_data]))
outputs = Dict(zip(map(make_var_name, output_names), [output1_data]+[output2_data]))
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐