没有onnx,如何手动将pytorch模型转换为tensorflow模型?
Withou onnx, how to convert a pytorch model into a tensorflow model manually?
由于ONNX支持的模型有限,我尝试通过直接赋参的方式进行转换,但是得到的tensorflow模型未能达到预期的精度。详情如下:
- 源模型是在 MNIST 数据集上训练的 Lenet。
- 我首先通过model.named_parameters()提取了每个模块及其参数,并将它们保存到一个字典中,其中键是模块的名称,值是参数
- 然后,我构建并启动了一个具有相同架构的tensorflow模型
- 最后,我将pytroch模型的每一层参数赋值给tensorflow模型
然而,得到的tensorflow模型的准确率只有20%左右。因此,我的问题是,是否可以通过这种方法转换pytorch模型?。如果是,导致不良结果的可能问题是什么?如果没有,请说明原因。
PS: 假设赋值过程是正确的。
正如 jodag 的评论所述,Tensorflow 和 PyTorch 中的运算符表示之间存在许多差异,可能会导致您的工作流程出现差异。
我们建议使用以下方法:
- 使用ONNX exporter in PyTorch将模型导出为ONNX格式。
import torch.onnx
# Argument: model is the PyTorch model
# Argument: dummy_input is a torch tensor
torch.onnx.export(model, dummy_input, "LeNet_model.onnx")
- 使用 onnx-tensorflow backend 将 ONNX 模型转换为 Tensorflow。
import onnx
from onnx_tf.backend import prepare
onnx_model = onnx.load("LeNet_model.onnx") # load onnx model
tf_rep = prepare(onnx_model) # prepare tf representation
tf_rep.export_graph("LeNet_model.pb") # export the model
由于ONNX支持的模型有限,我尝试通过直接赋参的方式进行转换,但是得到的tensorflow模型未能达到预期的精度。详情如下:
- 源模型是在 MNIST 数据集上训练的 Lenet。
- 我首先通过model.named_parameters()提取了每个模块及其参数,并将它们保存到一个字典中,其中键是模块的名称,值是参数
- 然后,我构建并启动了一个具有相同架构的tensorflow模型
- 最后,我将pytroch模型的每一层参数赋值给tensorflow模型
然而,得到的tensorflow模型的准确率只有20%左右。因此,我的问题是,是否可以通过这种方法转换pytorch模型?。如果是,导致不良结果的可能问题是什么?如果没有,请说明原因。
PS: 假设赋值过程是正确的。
正如 jodag 的评论所述,Tensorflow 和 PyTorch 中的运算符表示之间存在许多差异,可能会导致您的工作流程出现差异。
我们建议使用以下方法:
- 使用ONNX exporter in PyTorch将模型导出为ONNX格式。
import torch.onnx
# Argument: model is the PyTorch model
# Argument: dummy_input is a torch tensor
torch.onnx.export(model, dummy_input, "LeNet_model.onnx")
- 使用 onnx-tensorflow backend 将 ONNX 模型转换为 Tensorflow。
import onnx
from onnx_tf.backend import prepare
onnx_model = onnx.load("LeNet_model.onnx") # load onnx model
tf_rep = prepare(onnx_model) # prepare tf representation
tf_rep.export_graph("LeNet_model.pb") # export the model