diff --git a/README.md b/README.md index 854d79f9afdd32ca79389da3fbb3eeb510777ea4..a65620922a1ba5726dff4c56e54ce6b7a108ae7d 100644 --- a/README.md +++ b/README.md @@ -44,10 +44,7 @@ x2paddle --framework=caffe --prototxt=deploy.prototxt --weight=deploy.caffemodel ``` x2paddle --framework=onnx --model=onnx_model.onnx --save_dir=pd_model ``` -### PyTorch -``` -x2paddle --framework=pytorch --model=resnet50.pt --save_dir=pd_model --input_shapes [-1,3,224,224] -``` + ### Paddle2ONNX ``` # 注意:paddle_infer_model_dir下需包含__model__和__params__两个文件 @@ -56,7 +53,7 @@ x2paddle --framework=paddle2onnx --model=paddle_infer_model_dir --save_dir=onnx_ ### 参数选项 | 参数 | | |----------|--------------| -|--framework | 源模型类型 (tensorflow、caffe、onnx、pytorch、paddle2onnx) | +|--framework | 源模型类型 (tensorflow、caffe、onnx、paddle2onnx) | |--prototxt | 当framework为caffe时,该参数指定caffe模型的proto文件路径 | |--weight | 当framework为caffe时,该参数指定caffe模型的参数文件路径 | |--save_dir | 指定转换后的模型保存目录路径 | @@ -66,7 +63,6 @@ x2paddle --framework=paddle2onnx --model=paddle_infer_model_dir --save_dir=onnx_ |--define_input_shape | **[可选]** For TensorFlow, 当指定该参数时,强制用户输入每个Placeholder的shape,见[文档Q2](FAQ.md) | |--params_merge | **[可选]** 当指定该参数时,转换完成后,inference_model中的所有模型参数将合并保存为一个文件__params__ | |--onnx_opset | **[可选]** 当framework为paddle2onnx时,该参数可设置转换为ONNX的OpSet版本,目前支持9、10、11,默认为10 | -|--input_shapes |**[可选]** 当framework为pytorch时,该参数若设置,则根据输入的shape导出inference model(用于预测的静态模型)| diff --git a/pytorch_to_script.md b/pytorch_to_script.md deleted file mode 100644 index 229c916ad567f4aa76576ce667d711ab5eeb3bb1..0000000000000000000000000000000000000000 --- a/pytorch_to_script.md +++ /dev/null @@ -1,57 +0,0 @@ -## PyTorch模型导出为ONNX模型 - -目前pytorch2paddle主要支持pytorch ScriptModule。 用户可通过如下示例代码,将torchvison或者自己开发写的模型转换成ScriptModule model: -``` -#coding: utf-8 -import torch -import torch.nn as nn -from torchvision.models.utils import load_state_dict_from_url -# 定义模型 -class AlexNet(nn.Module): - def __init__(self, num_classes=1000): - super(AlexNet, self).__init__() - self.features = nn.Sequential( - nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2), - nn.ReLU(inplace=True), - nn.MaxPool2d(kernel_size=3, stride=2), - nn.Conv2d(64, 192, kernel_size=5, padding=2), - nn.ReLU(inplace=True), - nn.MaxPool2d(kernel_size=3, stride=2), - nn.Conv2d(192, 384, kernel_size=3, padding=1), - nn.ReLU(inplace=True), - nn.Conv2d(384, 256, kernel_size=3, padding=1), - nn.ReLU(inplace=True), - nn.Conv2d(256, 256, kernel_size=3, padding=1), - nn.ReLU(inplace=True), - nn.MaxPool2d(kernel_size=3, stride=2), - ) - self.avgpool = nn.AdaptiveAvgPool2d((6, 6)) - self.classifier = nn.Sequential( - nn.Dropout(0.0), - nn.Linear(256 * 6 * 6, 4096), - nn.ReLU(inplace=True), - nn.Dropout(0.0), - nn.Linear(4096, 4096), - nn.ReLU(inplace=True), - nn.Linear(4096, num_classes), - ) - - def forward(self, x): - x = self.features(x) - for i in range(1): - x = self.avgpool(x) - x = torch.flatten(x, 1) - x = self.classifier(x) - return x -# 初始化模型 -model = AlexNet() -# 加载参数 -state_dict = load_state_dict_from_url('https://download.pytorch.org/models/alexnet-owt-4df8aa71.pth', - progress=True) -model.load_state_dict(state_dict) -# 设置模式 -model.eval() -# 生成ScriptModule并保存 -script = torch.jit.script(model) -torch.jit.save(script, "alexnet.pt") -``` diff --git a/x2paddle/convert.py b/x2paddle/convert.py index 1a1baaba61cc4fde689fc900a972e1aa611d1868..769c07c08506de3b6a5d48cd5a366eb91d109bba 100644 --- a/x2paddle/convert.py +++ b/x2paddle/convert.py @@ -303,11 +303,7 @@ def main(): if args.params_merge: params_merge = True onnx2paddle(args.model, args.save_dir, params_merge) - - elif args.framework == "pytorch": - assert args.model is not None, "--model should be defined while translating pytorch model" - pytorch2paddle(args.model, args.save_dir, args.input_shapes) - + elif args.framework == "paddle2onnx": assert args.model is not None, "--model should be defined while translating paddle model to onnx" paddle2onnx(args.model, args.save_dir, opset_version=args.onnx_opset)