diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.Tensor.bernoulli.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.bernoulli.md similarity index 50% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.Tensor.bernoulli.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.bernoulli.md index 75547c5ed61..f9f3f118fbc 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.Tensor.bernoulli.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.bernoulli.md @@ -1,16 +1,18 @@ -## [ torch 参数更多 ]torch.Tensor.bernoulli -### [torch.Tensor.bernoulli](https://pytorch.org/docs/stable/generated/torch.Tensor.bernoulli.html#torch.Tensor.bernoulli) +## [ 仅参数名不一致 ]torch.Tensor.bernoulli + +### [torch.Tensor.bernoulli](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.bernoulli) + ```python -torch.Tensor.bernoulli(p=None, *, generator=None) +torch.Tensor.bernoulli(*, generator=None) ``` -### [paddle.bernoulli](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/bernoulli_cn.html#bernoulli) +### [paddle.bernoulli](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/bernoulli_cn.html#paddle/bernoulli_cn#cn-api-paddle-bernoulli) + ```python -paddle.bernoulli(x, p=None, name=None) +paddle.bernoulli(x, name=None) ``` -Pytorch 为 Tensor 类方法,Paddle 为普通函数,另外 PyTorch 相比 Paddle 支持更多其他参数。具体如下: - +两者功能一致且参数用法一致,仅参数名不一致,具体如下: ### 参数映射 @@ -19,14 +21,3 @@ Pytorch 为 Tensor 类方法,Paddle 为普通函数,另外 PyTorch 相比 Pa | self | x | 伯努利参数 Tensor,将调用 torch.Tensor 类方法的 self Tensor 传入。 | | p | p | 可选,伯努利参数 p。 | | generator | - | 用于采样的伪随机数生成器, Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | - - -### 转写示例 -#### self:调用类方法的 Tensor -```python -# PyTorch 写法 -x.bernoulli() - -# Paddle 写法 -paddle.bernoulli(x) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.hardshrink.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.hardshrink.md index 1ade21729ae..c232c047eeb 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.hardshrink.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.hardshrink.md @@ -1,18 +1,21 @@ ## [ 仅参数名不一致 ]torch.Tensor.hardshrink -### [torch.Tensor.hardshrink](https://pytorch.org/docs/stable/generated/torch.Tensor.hardshrink.html?highlight=torch+tensor+hardshrink#torch.Tensor.hardshrink) + +### [torch.Tensor.hardshrink](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.hardshrink) + ```python torch.Tensor.hardshrink(lambd=0.5) ``` -### [paddle.nn.functional.hardshrink](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/hardshrink_cn.html#hardshrink) +### [paddle.nn.functional.hardshrink](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/hardshrink_cn.html#paddle/nn/functional/hardshrink_cn#cn-api-paddle-nn-functional-hardshrink) + ```python paddle.nn.functional.hardshrink(x, threshold=0.5, name=None) ``` -仅参数名不一致,具体如下。 +两者功能一致,仅参数名不一致,具体如下: ### 参数映射 -| PyTorch | PaddlePaddle | 备注 | -|-----------------------------------|------------------------------| ------------------------------------------------------ | -| lambd | threshold | Hardshrink 阈值,仅参数名不一致。 | +| PyTorch | PaddlePaddle | 备注 | +| ------- | ------------ | ----------------------------- | +| lambd | threshold | 阈值,仅参数名不一致,功能一致 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.ormqr.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.ormqr.md deleted file mode 100644 index 4f95e7df0f9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.Tensor.ormqr.md +++ /dev/null @@ -1,21 +0,0 @@ -## [ 仅参数名不一致 ]torch.Tensor.ormqr -### [torch.Tensor.ormqr](https://pytorch.org/docs/stable/generated/torch.Tensor.orgqr.html#torch.Tensor.orgqr) -```python -torch.Tensor.ormqr(input2, input3, left=True, transpose=False) -``` - -### [paddle.linalg.ormqr](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/linalg/ormqr_cn.html#ormqr) -```python -paddle.linalg.ormqr(x, tau, y, left=True, transpose=False) -``` - -两者功能一致且参数用法一致,仅参数名不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| --------- | ------------ | ---------------------------------- | -| input2 | tau | Householder 反射系数,仅参数名不同 | -| input3 | y | 用于矩阵乘积,仅参数名不同 | -| left | left | 决定了矩阵乘积运算的顺序 | -| transpose | transpose | 决定矩阵 Q 是否共轭转置变换 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomAffine.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomAffine.md deleted file mode 100644 index ae88388597e..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomAffine.md +++ /dev/null @@ -1,55 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.RandomAffine -### [torchvision.transforms.RandomAffine](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomAffine.html) -```python -torchvision.transforms.RandomAffine( - degrees: Union[List[float], Tuple[float, ...], float], - translate: Optional[Tuple[float, float]] = None, - scale: Optional[Tuple[float, float]] = None, - shear: Union[List[float], Tuple[float, ...], float] = None, - interpolation: InterpolationMode = InterpolationMode.NEAREST, - fill: Union[int, float, List[float], Tuple[float, ...]] = 0, - center: Optional[Union[List[int], Tuple[int, ...]]] = None -) -``` - -### [paddle.vision.transforms.RandomAffine](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomAffine_cn.html) -```python -paddle.vision.transforms.RandomAffine( - degrees: Union[Tuple[float, float], float, int], - translate: Optional[Union[Sequence[float], float, int]] = None, - scale: Optional[Tuple[float, float]] = None, - shear: Optional[Union[Sequence[float], float, int]] = None, - interpolation: Union[str, int] = 'nearest', - fill: Union[int, List[int], Tuple[int, ...]] = 0, - center: Optional[Tuple[int, int]] = None, - keys: Optional[Union[List[str], Tuple[str, ...]]] = None -) -``` - -两者功能一致但参数类型不一致,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------------ | ---------------- | ------------------------ | -| degrees | degrees | 随机旋转变换的角度大小。 | -| translate | translate | 随机水平平移和垂直平移变化的位移大小。 | -| scale | scale | 随机伸缩变换的比例大小。 | -| shear | shear | 随机剪切角度的大小范围。 | -| interpolation | interpolation | 插值的方法,PyTorch 参数为 InterpolationMode 枚举类, Paddle 参数为 int 或 string,需要转写。 | -| fill | fill | 对图像扩展时填充的像素值。 | -| center | center | 仿射变换的中心点坐标。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | - - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -transform = torchvision.transforms.RandomAffine(degrees=30, translate=(0.1, 0.2), scale=(0.8, 1.2), shear=10, interpolation=torchvision.transforms.InterpolationMode.BILINEAR, fill=0, center=(100, 100)) -transformed_img = transform(img) - -# Paddle 写法 -transform = paddle.vision.transforms.RandomAffine(degrees=30, translate=(0.1, 0.2), scale=(0.8, 1.2), shear=10, interpolation='bilinear', fill=0, center=(100, 100)) -transformed_img = transform(img) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomRotation.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomRotation.md deleted file mode 100644 index 2e0e568f556..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomRotation.md +++ /dev/null @@ -1,48 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.RandomRotation -### [torchvision.transforms.RandomRotation](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomRotation.html) -```python -torchvision.transforms.RandomRotation( - degrees: Union[int, List[float], Tuple[float, ...]], - interpolation: InterpolationMode = InterpolationMode.NEAREST, - expand: bool = False, - center: Optional[Union[List[float], Tuple[float, ...]]] = None, - fill: Union[int, float, Tuple[int, ...]] = 0 -) -``` - -### [paddle.vision.transforms.RandomRotation](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomRotation_cn.html) -```python -paddle.vision.transforms.RandomRotation( - degrees: Union[int, List[float], Tuple[float, ...]], - interpolation: Union[str, int] = 'nearest', - expand: bool = False, - center: Optional[Tuple[int, int]] = None, - fill: int = 0, - keys: Optional[Union[List[str], Tuple[str, ...]]] = None -) -``` - -两者功能一致,但输入参数类型不一致。 - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------------- | ------------------ | ----------------------------------------------- | -| degrees | degrees | 旋转角度范围。 | -| interpolation | interpolation | 插值的方法,两者类型不一致,PyTorch 为 InterpolationMode 枚举类, Paddle 为 int 或 string,需要转写。 | -| expand | expand | 是否扩展图像尺寸。 | -| center | center | 旋转的中心点坐标。 | -| fill | fill | 对图像扩展时填充的值。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -transform = torchvision.transforms.RandomRotation(degrees=45, interpolation=torchvision.transforms.InterpolationMode.BILINEAR, expand=True, center=(100, 100), fill=(255, 0, 0)) -rotated_img = transform(img) - -# Paddle 写法 -transform = paddle.vision.transforms.RandomRotation(degrees=45, interpolation='bilinear', expand=True, center=(100, 100), fill=(255, 0, 0)) -rotated_img = transform(img) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.affine.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.affine.md deleted file mode 100644 index 54764e9ab5a..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.affine.md +++ /dev/null @@ -1,51 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.functional.affine -### [torchvision.transforms.functional.affine](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.affine.html) -```python -torchvision.transforms.functional.affine(img: Tensor, - angle: float, - translate: List[int], - scale: float, - shear: List[float], - interpolation: InterpolationMode = InterpolationMode.NEAREST, - fill: Optional[List[float]] = None, - center: Optional[List[int]] = None) -``` - -### [paddle.vision.transforms.affine](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/affine_cn.html) -```python -paddle.vision.transforms.affine( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - angle: Union[float, int], - translate: List[float], - scale: float, - shear: Union[List[float], Tuple[float, ...]], - interpolation: Union[str, int] = 'nearest', - fill: Union[int, List[int], Tuple[int, ...]] = 0, - center: Optional[Tuple[int, int]] = None -) -``` - -两者功能一致,但输入参数类型不一致,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ----------- | ------------ | ------------------------------------------------------------ | -| img | img | 输入图片。 | -| angle | angle | 旋转角度。 | -| translate | translate | 随机水平平移和垂直平移变化的位移大小。 | -| scale | scale | 控制缩放比例。 | -| shear | shear | 剪切角度值。 | -| interpolation | interpolation | 插值的方法,两者类型不一致,PyTorch 为 InterpolationMode 枚举类, Paddle 为 int 或 string,需要转写。 | -| fill | fill | 对图像扩展时填充的像素值。 | -| center | center | 仿射变换的中心点坐标 。 | - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -rotated_img = torchvision.transforms.functional.affine(img, angle=30.0, translate=[10, 20], scale=1.2, shear=[10.0, 5.0], interpolation=torchvision.transforms.InterpolationMode.BILINEAR, fill=[0, 0, 0], center=[100, 100]) - -# Paddle 写法 -rotated_img = paddle.vision.transforms.affine(img=img, angle=30.0, translate=[10, 20], scale=1.2, shear=[10.0, 5.0], interpolation='bilinear', fill=[0, 0, 0], center=[100, 100]) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.perspective.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.perspective.md deleted file mode 100644 index 086695af1b1..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.perspective.md +++ /dev/null @@ -1,45 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.functional.perspective -### [torchvision.transforms.functional.perspective](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.perspective.html#perspective) -```python -torchvision.transforms.functional.perspective( - img: Tensor, - startpoints: List[List[int]], - endpoints: List[List[int]], - interpolation: InterpolationMode = InterpolationMode.BILINEAR, - fill: Optional[List[float]] = None -) -``` - -### [paddle.vision.transforms.perspective](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/vision/transforms/perspective_cn.html#cn-api-paddle-vision-transforms-perspective) -```python -paddle.vision.transforms.perspective( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - startpoints: List[List[float]], - endpoints: List[List[float]], - interpolation: Union[str, int] = 'nearest', - fill: Union[int, List[int], Tuple[int, ...]] = 0 -) -``` - -两者功能一致,但参数类型不一致。 - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ----------------- | ----------------- | ------------ | -| img | img | 输入图片。 | -| startpoints | startpoints | 在原图上的四个角(左上、右上、右下、左下)的坐标。 | -| endpoints | endpoints | 在原图上的四个角(左上、右上、右下、左下)的坐标。 | -| interpolation | interpolation | 插值的方法,两者类型不一致,PyTorch 为 InterpolationMode 枚举类, Paddle 为 int 或 string,需要转写。 | -| fill | fill | 对图像扩展时填充的像素值。 | - - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -processed_img = torchvision.transforms.functional.perspective(img, startpoints, endpoints, interpolation=torchvision.transforms.InterpolationMode.BILINEAR, fill=[0, 0, 0]) - -# Paddle 写法 -processed_img = paddle.vision.transforms.perspective(img=img, startpoints=startpoints, endpoints=endpoints, interpolation='bilinear', fill=[0, 0, 0]) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.rotate.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.rotate.md deleted file mode 100644 index 63af0e66d10..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.rotate.md +++ /dev/null @@ -1,34 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.functional.rotate -### [torchvision.transforms.functional.rotate](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.rotate.html) -```python -torchvision.transforms.functional.rotate(img: Tensor, angle: float, interpolation: InterpolationMode = InterpolationMode.NEAREST, expand: bool = False, center: Optional[List[int]] = None, fill: Optional[List[float]] = None) -``` - -### [paddle.vision.transforms.rotate](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/vision/transforms/rotate_cn.html#cn-api-paddle-vision-transforms-rotate) -```python -paddle.vision.transforms.rotate(img, angle, interpolation='nearest', expand=False, center=None, fill=0) -``` - -两者功能一致,但输入参数类型不一致。 - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------------------------------- | ------------------ | -------- | -| img | img | 输入图片。| -| angle | angle | 旋转角度。| -| interpolation | interpolation | 插值的方法,两者类型不一致,PyTorch 为 InterpolationMode 枚举类, Paddle 为 int 或 string,需要转写。 | -| expand | expand | 是否要对旋转后的图片进行大小扩展。| -| center | center | 旋转中心。| -| fill | fill | 旋转图像外部区域的 RGB 像素填充值。| - - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -torchvision.transforms.functional.rotate(img, angle=90, interpolation=torchvision.transforms.InterpolationMode.BILINEAR) - -# Paddle 写法 -paddle.vision.transforms.rotate(img=img, angle=90, interpolation='bilinear') -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.rand.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.rand.md deleted file mode 100644 index f5a85a60955..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.rand.md +++ /dev/null @@ -1,83 +0,0 @@ -## [ 输入参数用法不一致 ]torch.rand -### [torch.rand](https://pytorch.org/docs/stable/generated/torch.rand.html?highlight=rand#torch.rand) -```python -torch.rand(*size, - *, - generator=None, - out=None, - dtype=None, - layout=torch.strided, - device=None, - requires_grad=False, - pin_memory=False) -``` - -### [paddle.rand](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/rand_cn.html#rand) -```python -paddle.rand(shape, - dtype=None, - name=None) -``` - -其中 torch 的 `size` 和 paddle 的 `shape` 用法不一致,torch 还支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| *size | shape | 表示输出形状大小,PyTorch 以可变参数方式传入,Paddle 以 list 或 tuple 的方式传入。 | -| generator | - | 用于采样的伪随机数生成器, Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | -| out | - | 表示输出的 Tensor,Paddle 无此参数。 | -| dtype | dtype | 表示数据类型。 | -| layout | - | 表示布局方式,Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | -| device | - | 表示 Tensor 存放位置,Paddle 无此参数,需要转写。 | -| requires_grad | - | 表示是否不阻断梯度传导,Paddle 无此参数,需要转写。 | -| pin_memory | - | 表示是否使用锁页内存, Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### *size:输出形状大小 -```python -# PyTorch 写法 -torch.rand(3, 5) - -# Paddle 写法 -paddle.rand([3, 5]) -``` - -#### out:指定输出 -```python -# PyTorch 写法 -torch.rand([3, 5], out=y) - -# Paddle 写法 -paddle.assign(paddle.rand([3, 5]), y) -``` - -#### device: Tensor 的设备 -```python -# PyTorch 写法 -torch.rand(3, 5, device=torch.device('cpu')) - -# Paddle 写法 -y = paddle.rand([3, 5]) -y.cpu() -``` - -#### requires_grad:是否需要求反向梯度,需要修改该 Tensor 的 stop_gradient 属性 -```python -# PyTorch 写法 -x = torch.rand([3, 5], requires_grad=True) - -# Paddle 写法 -x = paddle.rand([3, 5]) -x.stop_gradient = False -``` - -#### pin_memory:是否分配到固定内存上 -```python -# PyTorch 写法 -torch.rand(3, 5, pin_memory=True) - -# Paddle 写法 -paddle.rand([3, 5]).pin_memory() -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.split.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.split.md deleted file mode 100644 index a757f119d4c..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.split.md +++ /dev/null @@ -1,38 +0,0 @@ -## [ 输入参数用法不一致 ]torch.split -### [torch.split](https://pytorch.org/docs/stable/generated/torch.split.html?highlight=torch%20split#torch.split) -```python -torch.split(tensor, - split_size_or_sections, - dim=0) -``` - -### [paddle.split](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/split_cn.html#split) -```python -paddle.split(x, - num_or_sections, - axis=0, - name=None) -``` - -其中 PyTorch 的 `split_size_or_sections` 与 Paddle 的 `num_or_sections` 用法不一致,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| tensor | x | 表示输入 Tensor ,仅参数名不一致。 | -| split_size_or_sections | num_or_sections | 当类型为 int 时,torch 表示单个块大小,paddle 表示结果有多少个块,需要转写。 | -| dim | axis | 表示需要分割的维度,仅参数名不一致。 | - - -### 转写示例 -#### split_size_or_sections:单个块大小 -```python -split_size = 2 -dim = 1 -# PyTorch 写法 -torch.split(a, split_size, dim) -# 在输入 dim 时,返回 (values, indices) - -# Paddle 写法 -paddle.split(a, a.shape[dims]/split_size, dim) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.argwhere.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.argwhere.md similarity index 50% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.argwhere.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.argwhere.md index 19c478d1a0e..197f35a9745 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.argwhere.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.argwhere.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torch.Tensor.argwhere +## [ 仅 API 调用方式不一致 ]torch.Tensor.argwhere ### [torch.Tensor.argwhere](https://pytorch.org/docs/stable/generated/torch.Tensor.argwhere.html#torch.Tensor.argwhere) ```python torch.Tensor.argwhere() @@ -10,9 +10,3 @@ paddle.Tensor.nonzero(as_tuple=False) ``` 其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| - | as_tuple | 返回格式。是否以 1-D Tensor 构成的元组格式返回。 PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.pinverse.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.pinverse.md new file mode 100644 index 00000000000..40be585f195 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.pinverse.md @@ -0,0 +1,15 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.pinverse + +### [torch.Tensor.pinverse](https://pytorch.org/docs/stable/generated/torch.Tensor.pinverse.html#torch.Tensor.pinverse) +```python +torch.Tensor.pinverse() +``` + +### [paddle.Tensor.pinv]() +```python +paddle.Tensor.pinv(rcond=1e-15, + hermitian=False, + name=None) +``` + +其中 Paddle 相比 PyTorch 支持更多参数,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.mark_non_differentiable.md similarity index 62% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.mark_non_differentiable.md index 4b534c6392b..74f6fec3ba8 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.mark_non_differentiable.md @@ -1,4 +1,4 @@ -## [ 仅参数名不一致 ]torch.autograd.function.FunctionCtx.mark_non_differentiable +## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx.mark_non_differentiable ### [torch.autograd.function.FunctionCtx.mark_non_differentiable](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.mark_non_differentiable.html#torch.autograd.function.FunctionCtx.mark_non_differentiable) ```python torch.autograd.function.FunctionCtx.mark_non_differentiable(*args) @@ -9,10 +9,4 @@ torch.autograd.function.FunctionCtx.mark_non_differentiable(*args) paddle.autograd.PyLayerContext.mark_non_differentiable(*tensors) ``` -两者功能一致,仅参数名不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------- | ------------ | ----------------------------- | -| args | tensors | 需要标记不需要反向的 Tensor。 | +两者功能一致,仅调用方式不一致。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.get_rng_state_all.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.get_rng_state_all.md new file mode 100644 index 00000000000..6ee887d3937 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.get_rng_state_all.md @@ -0,0 +1,22 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.get_rng_state_all +### [torch.cuda.get_rng_state_all](https://pytorch.org/docs/stable/generated/torch.cuda.get_rng_state_all.html#torch.cuda.get_rng_state_all) +```python +torch.cuda.get_rng_state_all() +``` + +### [paddle.get_rng_state]() +```python +paddle.get_rng_state(device='gpu') +``` + +paddle 参数更多,并且 torch 与 paddle 的返回参数类型不一致,具体如下: + +### 转写示例 +#### 返回参数类型不同 +```python +# PyTorch 写法,返回 torch.ByteTensor +x = torch.cuda.get_rng_state_all() + +# Paddle 写法,返回 GeneratorState 对象 +x = paddle.get_rng_state(device='gpu') +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.manual_seed.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.manual_seed.md new file mode 100644 index 00000000000..5bde777d7f0 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.manual_seed.md @@ -0,0 +1,12 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.manual_seed +### [torch.cuda.manual_seed](https://pytorch.org/docs/stable/generated/torch.cuda.manual_seed.html#torch.cuda.manual_seed) +```python +torch.cuda.manual_seed(seed) +``` + +### [paddle.seed](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/seed_cn.html) +```python +paddle.seed(seed) +``` + +功能一致,返回类型不一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.distributed.ReduceOp.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.ReduceOp.md similarity index 55% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.distributed.ReduceOp.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.ReduceOp.md index 2d7a675e375..0bea0dc3bbc 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.distributed.ReduceOp.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.ReduceOp.md @@ -1,4 +1,4 @@ -## [ torch 参数更多 ]torch.distributed.ReduceOp +## [ 仅 API 调用方式不一致 ]torch.distributed.ReduceOp ### [torch.distributed.ReduceOp](https://pytorch.org/docs/stable/distributed.html?highlight=torch+distributed+reduceop#torch.distributed.ReduceOp) ```python torch.distributed.ReduceOp @@ -10,18 +10,3 @@ paddle.distributed.ReduceOp ``` 两者功能一致。 - -其中,规约操作对应如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ---- | ---- | --- | -| SUM | SUM | | -| PRODUCT | PROD | | -| MIN | MIN | | -| MAX | MAX | | -| BAND | - | | -| BOR | - | | -| BXOR | - | | -| PREMUL_SUM | - | | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.max.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.max.md new file mode 100644 index 00000000000..3893c2e48ad --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.max.md @@ -0,0 +1,23 @@ +## [ 仅 API 调用方式不一致 ]torch.max +输入一个 Tensor 对应 paddle.max,输入两个 Tensor 对应 paddle.maximum,因此有两组差异分析,分别如下: + +------------------------------------------------------------------------------------------------- + +### [torch.max](https://pytorch.org/docs/stable/generated/torch.max.html?highlight=max#torch.max) +```python +torch.max(input, + dim=None, + keepdim=False, + *, + out=None) +``` + +### [paddle.max](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/max_cn.html#max) +```python +paddle.max(x, + axis=None, + keepdim=False, + name=None) +``` + +其中 PyTorch 与 Paddle 指定 `dim` 后返回值不一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.median.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.median.md new file mode 100644 index 00000000000..5a1d9d58f4a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.median.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.median +### [torch.median](https://pytorch.org/docs/stable/generated/torch.median.html?highlight=median#torch.median) +```python +torch.median(input, + dim=-1, + keepdim=False, + *, + out=None) +``` + +### [paddle.median](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/median_cn.html#median) +```python +paddle.median(x, axis=None, keepdim=False, mode='avg', name=None) +``` + +PyTorch 相比 Paddle 支持更多其他参数,具体如下: + +### 转写示例 +#### out:指定输出 +```python +# PyTorch 写法 +torch.median([3, 5], out=y) + +# Paddle 写法 +paddle.assign(paddle.median([3, 5], mode='min'), y) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.min.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.min.md similarity index 50% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.min.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.min.md index ee100fb0838..6abca13a1f5 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.min.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.min.md @@ -1,4 +1,4 @@ -## [ 返回参数类型不一致 ]torch.min +## [ 仅 API 调用方式不一致 ]torch.min 输入一个 Tensor 对应 paddle.min,输入两个 Tensor 对应 paddle.minimum,因此有两组差异分析,分别如下: -------------------------------------------------------------------------------------------------- @@ -20,15 +20,6 @@ paddle.min(x, ``` 其中 PyTorch 与 Paddle 指定 `dim` 后返回值不一致,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 求最小值运算的维度, 仅参数名不一致。 | -| keepdim | keepdim | 是否在输出 Tensor 中保留减小的维度。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | -| 返回值 | 返回值 | 表示返回结果,当指定 dim 后,PyTorch 会返回比较结果和元素索引, Paddle 不会返回元素索引,需要转写。 | ### 转写示例 #### out:指定输出 @@ -69,24 +60,3 @@ paddle.minimum(x, ``` PyTorch 相比 Paddle 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor。 | -| other | y | 输入的 Tensor。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# 逐元素对比输入的两个 Tensor - -# PyTorch 写法 -torch.min(a, b, out=y) -# 在输入 other 时,比较 input 和 other 返回较大值 - -# Paddle 写法 -paddle.assign(paddle.minimum(a, b), y) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nanmedian.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nanmedian.md new file mode 100644 index 00000000000..5ff35c66280 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nanmedian.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.nanmedian +### [torch.nanmedian](https://pytorch.org/docs/stable/generated/torch.nanmedian.html?highlight=nanmedian#torch.nanmedian) +```python +torch.nanmedian(input, + dim=-1, + keepdim=False, + *, + out=None) +``` + +### [paddle.nanmedian](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nanmedian_cn.html#nanmedian) +```python +paddle.nanmedian(x, axis=None, keepdim=False, mode='avg', name=None) +``` + +PyTorch 相比 Paddle 支持更多其他参数,具体如下: + +### 转写示例 +#### out:指定输出 +```python +# PyTorch 写法 +torch.nanmedian(a, -1, out=y) + +# Paddle 写法 +paddle.assign(paddle.nanmedian(a, -1, mode='min'), y) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool1d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool1d.md index c5e144950c6..84e1585d9d8 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool1d.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool1d.md @@ -1,12 +1,25 @@ ## [ 仅 API 调用方式不一致 ]torch.nn.AdaptiveAvgPool1d -### [torch.nn.AdaptiveAvgPool1d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool1d.html) + +### [torch.nn.AdaptiveAvgPool1d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool1d.html#torch.nn.AdaptiveAvgPool1d) + ```python torch.nn.AdaptiveAvgPool1d(output_size) ``` -### [paddle.nn.AdaptiveAvgPool1D](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/AdaptiveAvgPool1D_cn.html#adaptiveavgpool1d) +### [paddle.nn.AdaptiveAvgPool1D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/AdaptiveAvgPool1D_cn.html#paddle/nn/AdaptiveAvgPool1D_cn#cn-api-paddle-nn-AdaptiveAvgPool1D) + ```python -paddle.nn.AdaptiveAvgPool1D(output_size, name=None) +paddle.nn.AdaptiveAvgPool1D(output_size, name) ``` -两者功能一致,参数完全一致。 +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.AdaptiveAvgPool1d(5) + +# Paddle 写法 +model = paddle.nn.AdaptiveAvgPool1D(5) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool2d.md new file mode 100644 index 00000000000..5c29fa5bf2d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool2d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.AdaptiveAvgPool2d + +### [torch.nn.AdaptiveAvgPool2d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool2d.html#torch.nn.AdaptiveAvgPool2d) + +```python +torch.nn.AdaptiveAvgPool2d(output_size) +``` + +### [paddle.nn.AdaptiveAvgPool2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/AdaptiveAvgPool2D_cn.html#paddle/nn/AdaptiveAvgPool2D_cn#cn-api-paddle-nn-AdaptiveAvgPool2D) + +```python +paddle.nn.AdaptiveAvgPool2D(output_size, data_format, name) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.AdaptiveAvgPool2d(5) + +# Paddle 写法 +model = paddle.nn.AdaptiveAvgPool2D(5) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool3d.md new file mode 100644 index 00000000000..35eba56538f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool3d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.AdaptiveAvgPool3d + +### [torch.nn.AdaptiveAvgPool3d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool3d.html#torch.nn.AdaptiveAvgPool3d) + +```python +torch.nn.AdaptiveAvgPool3d(output_size) +``` + +### [paddle.nn.AdaptiveAvgPool3D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/AdaptiveAvgPool3D_cn.html#paddle/nn/AdaptiveAvgPool3D_cn#cn-api-paddle-nn-AdaptiveAvgPool3D) + +```python +paddle.nn.AdaptiveAvgPool3D(output_size, data_format, name) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.AdaptiveAvgPool3d(1) + +# Paddle 写法 +model = paddle.nn.AdaptiveAvgPool3D(1) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool1d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool1d.md new file mode 100644 index 00000000000..b4eac7ec74e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool1d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.MaxUnpool1d + +### [torch.nn.MaxUnpool1d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool1d.html#torch.nn.MaxUnpool1d) + +```python +torch.nn.MaxUnpool1d(kernel_size, stride, padding) +``` + +### [paddle.nn.MaxUnPool1D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool1D_cn.html#paddle/nn/MaxUnPool1D_cn#cn-api-paddle-nn-MaxUnPool1D) + +```python +paddle.nn.MaxUnPool1D(kernel_size, stride, padding, data_format, output_size, name) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +unpool = torch.nn.MaxUnpool1d(2, 2) + +# Paddle 写法 +unpool = paddle.nn.MaxUnPool1D(2, 2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool2d.md new file mode 100644 index 00000000000..dccae85a08d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool2d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.MaxUnpool2d + +### [torch.nn.MaxUnpool2d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool2d.html#torch.nn.MaxUnpool2d) + +```python +torch.nn.MaxUnpool2d(kernel_size, stride, padding) +``` + +### [paddle.nn.MaxUnPool2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool2D_cn.html#paddle/nn/MaxUnPool2D_cn#cn-api-paddle-nn-MaxUnPool2D) + +```python +paddle.nn.MaxUnPool2D(kernel_size, stride, padding, data_format, output_size, name) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +unpool = torch.nn.MaxUnpool2d(2, stride=2) + +# Paddle 写法 +unpool = paddle.nn.MaxUnPool2D(2, stride=2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool3d.md new file mode 100644 index 00000000000..eaa5f14fcaa --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.MaxUnpool3d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.MaxUnpool3d + +### [torch.nn.MaxUnpool3d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool3d.html#torch.nn.MaxUnpool3d) + +```python +torch.nn.MaxUnpool3d(kernel_size, stride, padding) +``` + +### [paddle.nn.MaxUnPool3D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool3D_cn.html#paddle/nn/MaxUnPool3D_cn#cn-api-paddle-nn-MaxUnPool3D) + +```python +paddle.nn.MaxUnPool3D(kernel_size, stride, padding, data_format, output_size, name) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +unpool = torch.nn.MaxUnpool3d(3, stride=2) + +# Paddle 写法 +unpool = paddle.nn.MaxUnPool3D(3, stride=2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.md similarity index 54% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.md index a24fc14503e..232aa977696 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torch.nn.Module +## [ 仅 API 调用方式不一致 ]torch.nn.Module ### [torch.nn.Module](https://pytorch.org/docs/stable/generated/torch.nn.Module.html?highlight=torch+nn+module#torch.nn.Module) ```python @@ -11,10 +11,3 @@ paddle.nn.Layer(name_scope=None, dtype='float32') ``` 其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ----- | ---------- | ------------------------------------ | -| - | name_scope | PyTorch 无此参数,Paddle 保持默认即可。 | -| - | dtype | PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.modules.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.modules.md similarity index 64% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.modules.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.modules.md index 8054091e7ca..93059504d3c 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.modules.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.modules.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torch.nn.Module.modules +## [ 仅 API 调用方式不一致 ]torch.nn.Module.modules ### [torch.nn.Module.modules](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.modules) ```python torch.nn.Module.modules() @@ -10,9 +10,3 @@ paddle.nn.Layer.sublayers(include_self=False) ``` 其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------- | ------------ | -- | -| - | include_self | 是否包含本层。PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.Unfold.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Unfold.md similarity index 51% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.Unfold.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Unfold.md index 899dec470f1..4c86cd43fd1 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.Unfold.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Unfold.md @@ -1,4 +1,4 @@ -## [ 仅参数名不一致 ]torch.nn.Unfold +## [ 仅 API 调用方式不一致 ]torch.nn.Unfold ### [torch.nn.Unfold](https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html?highlight=nn+unfold#torch.nn.Unfold) ```python torch.nn.Unfold(kernel_size, @@ -17,12 +17,3 @@ paddle.nn.Unfold(kernel_sizes=[3, 3], ``` 其中功能一致, 仅参数名不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| kernel_size | kernel_sizes | 卷积核的尺寸。 | -| dilation | dilations | 卷积膨胀。 | -| padding | paddings | 每个维度的扩展,仅参数名不一致。 | -| stride | strides | 卷积步长,仅参数名不一致。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.UpsamplingBilinear2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.UpsamplingBilinear2d.md new file mode 100644 index 00000000000..3703d44e354 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.UpsamplingBilinear2d.md @@ -0,0 +1,12 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.UpsamplingBilinear2d +### [torch.nn.UpsamplingBilinear2d](https://pytorch.org/docs/stable/generated/torch.nn.UpsamplingBilinear2d.html?highlight=upsamplingbilinear2d#torch.nn.UpsamplingBilinear2d) +```python +torch.nn.UpsamplingBilinear2d(size=None, scale_factor=None) +``` + +### [paddle.nn.UpsamplingBilinear2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/UpsamplingBilinear2D_cn.html) +```python +paddle.nn.UpsamplingBilinear2D(size=None,scale_factor=None, data_format='NCHW',name=None) +``` + +其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.UpsamplingNearest2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.UpsamplingNearest2d.md new file mode 100644 index 00000000000..f09d5bd3729 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.UpsamplingNearest2d.md @@ -0,0 +1,12 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.UpsamplingNearest2d +### [torch.nn.UpsamplingNearest2d](https://pytorch.org/docs/stable/generated/torch.nn.UpsamplingNearest2d.html?highlight=upsampl#torch.nn.UpsamplingNearest2d) +```python +torch.nn.UpsamplingNearest2d(size=None, scale_factor=None) +``` + +### [paddle.nn.UpsamplingNearest2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/UpsamplingNearest2D_cn.html) +```python +paddle.nn.UpsamplingNearest2D(size=None, scale_factor=None, data_format='NCHW',name=None) +``` + +其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.ZeroPad2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.ZeroPad2d.md similarity index 52% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.ZeroPad2d.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.ZeroPad2d.md index 8367e4f43b0..6b659bef151 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.ZeroPad2d.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.ZeroPad2d.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torch.nn.ZeroPad2d +## [ 仅 API 调用方式不一致 ]torch.nn.ZeroPad2d ### [torch.nn.ZeroPad2d](https://pytorch.org/docs/stable/generated/torch.nn.ZeroPad2d.html?highlight=zeropad#torch.nn.ZeroPad2d) ```python @@ -13,9 +13,3 @@ paddle.nn.ZeroPad2D(padding, ``` 其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| padding | padding | 表示填充大小。 | -| - | data_format | 指定输入的 format, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.functional.pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.functional.pad.md new file mode 100644 index 00000000000..f65acf1297c --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.functional.pad.md @@ -0,0 +1,21 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.functional.pad +### [torch.nn.functional.pad](https://pytorch.org/docs/stable/generated/torch.nn.functional.pad.html) +```python +torch.nn.functional.pad(input, + pad, + mode='constant', + value=None) +``` + +### [paddle.nn.functional.pad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/pad_cn.html#pad) +```python +paddle.nn.functional.pad(x, + pad, + mode='constant', + value=0.0, + data_format=None, + pad_from_left_axis=True, + name=None) +``` + +两者功能一致,仅调用方式不一致。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.functional.softmax.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.functional.softmax.md new file mode 100644 index 00000000000..62bd4931b4c --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.functional.softmax.md @@ -0,0 +1,12 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.functional.softmax +### [torch.nn.functional.softmax](https://pytorch.org/docs/stable/generated/torch.nn.functional.softmax.html#torch.nn.functional.softmax) +```python +torch.nn.functional.softmax(input, dim=None, _stacklevel=3, dtype=None) +``` + +### [paddle.nn.functional.softmax](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/softmax_cn.html#softmax) +```python +paddle.nn.functional.softmax(x, axis=-1, dtype=None, name=None) +``` + +两者功能一致,仅 API 调用方式不同。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.optim.Optimizer.step.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.step.md similarity index 61% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.optim.Optimizer.step.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.step.md index d56ee5207fa..50eda605dd5 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.optim.Optimizer.step.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.step.md @@ -1,4 +1,4 @@ -## [ torch 参数更多 ]torch.optim.Optimizer.step +## [ 仅 API 调用方式不一致 ]torch.optim.Optimizer.step ### [torch.optim.Optimizer.step](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.step.html#torch-optim-optimizer-step) ```python torch.optim.Optimizer.step(closure) @@ -10,9 +10,3 @@ paddle.optimizer.Optimizer.step() ``` PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| -------- | ---------- | ---------------- | -| closure | - | 重新评估模型并返回损失的闭包, Paddle 无此参数,暂无转写方式。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.sort.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.sort.md new file mode 100644 index 00000000000..25671308f63 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.sort.md @@ -0,0 +1,21 @@ +## [ 仅 API 调用方式不一致 ]torch.sort +### [torch.sort](https://pytorch.org/docs/stable/generated/torch.sort.html?highlight=sort#torch.sort) +```python +torch.sort(input, + dim=-1, + descending=False, + stable=False, + *, + out=None) +``` + +### [paddle.sort](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/sort_cn.html#paddle.sort) +```python +paddle.sort(x, + axis=-1, + descending=False, + stable=False, + name=None) +``` + +PyTorch 相比 Paddle 支持更多其他参数,同时两个 api 的返回参数类型不同,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.split.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.split.md new file mode 100644 index 00000000000..b3011c12efe --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.split.md @@ -0,0 +1,17 @@ +## [ 仅 API 调用方式不一致 ]torch.split +### [torch.split](https://pytorch.org/docs/stable/generated/torch.split.html?highlight=torch%20split#torch.split) +```python +torch.split(tensor, + split_size_or_sections, + dim=0) +``` + +### [paddle.split](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/split_cn.html#split) +```python +paddle.split(x, + num_or_sections, + axis=0, + name=None) +``` + +其中 PyTorch 的 `split_size_or_sections` 与 Paddle 的 `num_or_sections` 用法不一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.default_collate.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.default_collate.md new file mode 100644 index 00000000000..ebfe87d7fa6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.default_collate.md @@ -0,0 +1,12 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.default_collate +### [torch.utils.data.default_collate](https://pytorch.org/docs/stable/data.html?highlight=default_collate#torch.utils.data.default_collate) +```python +torch.utils.data.default_collate(batch) +``` + +### [paddle.io.dataloader.collate.default_collate_fn]() +```python +paddle.io.dataloader.collate.default_collate_fn(batch) +``` + +返回参数类型不一致,需要转写。具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.CenterCrop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.CenterCrop.md similarity index 62% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.CenterCrop.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.CenterCrop.md index 9a2d06182e3..86c2967df7b 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.CenterCrop.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.CenterCrop.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torchvision.transforms.CenterCrop +## [ 仅 API 调用方式不一致 ]torchvision.transforms.CenterCrop ### [torchvision.transforms.CenterCrop](https://pytorch.org/vision/main/generated/torchvision.transforms.CenterCrop.html) ```python torchvision.transforms.CenterCrop( @@ -15,10 +15,3 @@ paddle.vision.transforms.CenterCrop( ``` 两者功能一致,但 Paddle 相比 torchvision 支持更多参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------ | ------------ | ---------------------- | -| size | size | 输出图像的形状大小。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ColorJitter.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.ColorJitter.md similarity index 53% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ColorJitter.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.ColorJitter.md index e8b48417e18..8ba7d26a3a3 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ColorJitter.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.ColorJitter.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torchvision.transforms.ColorJitter +## [ 仅 API 调用方式不一致 ]torchvision.transforms.ColorJitter ### [torchvision.transforms.ColorJitter](https://pytorch.org/vision/main/generated/torchvision.transforms.ColorJitter.html) ```python torchvision.transforms.ColorJitter(brightness: Union[float, Tuple[float, float]] = 0, contrast: Union[float, Tuple[float, float]] = 0, saturation: Union[float, Tuple[float, float]] = 0, hue: Union[float, Tuple[float, float]] = 0) @@ -10,13 +10,3 @@ paddle.vision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue ``` 其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| --------------------------- | ------------------------------ | --------------------- | -| brightness | brightness | 亮度调整范围大小。 | -| contrast | contrast | 对比度调整范围大小。 | -| saturation | saturation | 饱和度调整范围大小。 | -| hue | hue | 色调调整范围大小。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Grayscale.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Grayscale.md similarity index 55% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Grayscale.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Grayscale.md index 75cda0d305a..cb81f93f8f7 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Grayscale.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Grayscale.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torchvision.transforms.Grayscale +## [ 仅 API 调用方式不一致 ]torchvision.transforms.Grayscale ### [torchvision.transforms.Grayscale](https://pytorch.org/vision/main/generated/torchvision.transforms.Grayscale.html) ```python @@ -14,10 +14,3 @@ paddle.vision.transforms.Grayscale( ``` 其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| --------------------------- | ------------------------------ | --------------------- | -| num_output_channels | num_output_channels | 输出图像的通道数。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Pad.md similarity index 59% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Pad.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Pad.md index b3a484fa6a7..815e82f4371 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Pad.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Pad.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torchvision.transforms.Pad +## [ 仅 API 调用方式不一致 ]torchvision.transforms.Pad ### [torchvision.transforms.Pad](https://pytorch.org/vision/main/generated/torchvision.transforms.Pad.html) @@ -21,12 +21,3 @@ paddle.vision.transforms.Pad( ``` 两者功能一致,但 Paddle 相比 torchvision 支持更多参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------- | ------------- | ----------------------------- | -| padding | padding | 在图像边界上进行填充的范围。 | -| fill | fill | 多通道图像填充。 | -| padding_mode | padding_mode | 填充模式。| -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomAffine.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomAffine.md new file mode 100644 index 00000000000..885373db76d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomAffine.md @@ -0,0 +1,29 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.RandomAffine +### [torchvision.transforms.RandomAffine](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomAffine.html) +```python +torchvision.transforms.RandomAffine( + degrees: Union[List[float], Tuple[float, ...], float], + translate: Optional[Tuple[float, float]] = None, + scale: Optional[Tuple[float, float]] = None, + shear: Union[List[float], Tuple[float, ...], float] = None, + interpolation: InterpolationMode = InterpolationMode.NEAREST, + fill: Union[int, float, List[float], Tuple[float, ...]] = 0, + center: Optional[Union[List[int], Tuple[int, ...]]] = None +) +``` + +### [paddle.vision.transforms.RandomAffine](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomAffine_cn.html) +```python +paddle.vision.transforms.RandomAffine( + degrees: Union[Tuple[float, float], float, int], + translate: Optional[Union[Sequence[float], float, int]] = None, + scale: Optional[Tuple[float, float]] = None, + shear: Optional[Union[Sequence[float], float, int]] = None, + interpolation: Union[str, int] = 'nearest', + fill: Union[int, List[int], Tuple[int, ...]] = 0, + center: Optional[Tuple[int, int]] = None, + keys: Optional[Union[List[str], Tuple[str, ...]]] = None +) +``` + +两者功能一致但参数类型不一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.RandomCrop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomCrop.md similarity index 53% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.RandomCrop.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomCrop.md index fea93a59d71..d1fcb0bd2db 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.RandomCrop.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomCrop.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torchvision.transforms.RandomCrop +## [ 仅 API 调用方式不一致 ]torchvision.transforms.RandomCrop ### [torchvision.transforms.RandomCrop](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomCrop.html) ```python torchvision.transforms.RandomCrop( @@ -23,14 +23,3 @@ paddle.vision.transforms.RandomCrop( ``` 两者功能一致,但 Paddle 相比 torchvision 支持更多参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------- | -------------- | -------------------------------------------------------- | -| size | size | 裁剪后的图片大小。 | -| padding | padding | 对图像四周外边进行填充。 | -| pad_if_needed | pad_if_needed | 是否在裁剪前进行填充以满足大小要求。 | -| fill | fill | 用于填充的像素值。 | -| padding_mode | padding_mode | 填充模式。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomRotation.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomRotation.md new file mode 100644 index 00000000000..20879798090 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.RandomRotation.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.RandomRotation +### [torchvision.transforms.RandomRotation](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomRotation.html) +```python +torchvision.transforms.RandomRotation( + degrees: Union[int, List[float], Tuple[float, ...]], + interpolation: InterpolationMode = InterpolationMode.NEAREST, + expand: bool = False, + center: Optional[Union[List[float], Tuple[float, ...]]] = None, + fill: Union[int, float, Tuple[int, ...]] = 0 +) +``` + +### [paddle.vision.transforms.RandomRotation](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomRotation_cn.html) +```python +paddle.vision.transforms.RandomRotation( + degrees: Union[int, List[float], Tuple[float, ...]], + interpolation: Union[str, int] = 'nearest', + expand: bool = False, + center: Optional[Tuple[int, int]] = None, + fill: int = 0, + keys: Optional[Union[List[str], Tuple[str, ...]]] = None +) +``` + +两者功能一致,但输入参数类型不一致。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ToTensor.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.ToTensor.md similarity index 55% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ToTensor.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.ToTensor.md index e4486c9d788..4512c7570fa 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ToTensor.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.ToTensor.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torchvision.transforms.ToTensor +## [ 仅 API 调用方式不一致 ]torchvision.transforms.ToTensor ### [torchvision.transforms.ToTensor](https://pytorch.org/vision/main/generated/torchvision.transforms.ToTensor.html?highlight=totensor#torchvision.transforms.ToTensor) ```python torchvision.transforms.ToTensor() @@ -10,10 +10,3 @@ paddle.vision.transforms.ToTensor(data_format: str = 'CHW', keys: List[str] | Tu ``` 两者功能基本一致,但 Paddle 相比 torchvision 支持更多参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -|-------------- |-------------------- |----------------------------------- | -| - | data_format | 返回 Tensor 的格式,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.affine.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.affine.md new file mode 100644 index 00000000000..cec123f8ce6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.affine.md @@ -0,0 +1,28 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.affine +### [torchvision.transforms.functional.affine](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.affine.html) +```python +torchvision.transforms.functional.affine(img: Tensor, + angle: float, + translate: List[int], + scale: float, + shear: List[float], + interpolation: InterpolationMode = InterpolationMode.NEAREST, + fill: Optional[List[float]] = None, + center: Optional[List[int]] = None) +``` + +### [paddle.vision.transforms.affine](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/affine_cn.html) +```python +paddle.vision.transforms.affine( + img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], + angle: Union[float, int], + translate: List[float], + scale: float, + shear: Union[List[float], Tuple[float, ...]], + interpolation: Union[str, int] = 'nearest', + fill: Union[int, List[int], Tuple[int, ...]] = 0, + center: Optional[Tuple[int, int]] = None +) +``` + +两者功能一致,但输入参数类型不一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.perspective.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.perspective.md new file mode 100644 index 00000000000..29e83f1e5f8 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.perspective.md @@ -0,0 +1,24 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.perspective +### [torchvision.transforms.functional.perspective](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.perspective.html#perspective) +```python +torchvision.transforms.functional.perspective( + img: Tensor, + startpoints: List[List[int]], + endpoints: List[List[int]], + interpolation: InterpolationMode = InterpolationMode.BILINEAR, + fill: Optional[List[float]] = None +) +``` + +### [paddle.vision.transforms.perspective](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/vision/transforms/perspective_cn.html#cn-api-paddle-vision-transforms-perspective) +```python +paddle.vision.transforms.perspective( + img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], + startpoints: List[List[float]], + endpoints: List[List[float]], + interpolation: Union[str, int] = 'nearest', + fill: Union[int, List[int], Tuple[int, ...]] = 0 +) +``` + +两者功能一致,但参数类型不一致。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.rotate.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.rotate.md new file mode 100644 index 00000000000..1e7ff2ebf4f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.rotate.md @@ -0,0 +1,12 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.rotate +### [torchvision.transforms.functional.rotate](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.rotate.html) +```python +torchvision.transforms.functional.rotate(img: Tensor, angle: float, interpolation: InterpolationMode = InterpolationMode.NEAREST, expand: bool = False, center: Optional[List[int]] = None, fill: Optional[List[float]] = None) +``` + +### [paddle.vision.transforms.rotate](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/vision/transforms/rotate_cn.html#cn-api-paddle-vision-transforms-rotate) +```python +paddle.vision.transforms.rotate(img, angle, interpolation='nearest', expand=False, center=None, fill=0) +``` + +两者功能一致,但输入参数类型不一致。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.functional.to_tensor.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.to_tensor.md similarity index 59% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.functional.to_tensor.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.to_tensor.md index 03c0eeeeae6..bf7f15e4d82 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.functional.to_tensor.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.to_tensor.md @@ -1,4 +1,4 @@ -## [ paddle 参数更多 ]torchvision.transforms.functional.to_tensor +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.to_tensor ### [torchvision.transforms.functional.to_tensor](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.to_tensor.html) ```python torchvision.transforms.functional.to_tensor(pic: Union[PIL.Image.Image, numpy.ndarray]) @@ -13,10 +13,3 @@ paddle.vision.transforms.to_tensor( ``` 其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| --------- | ------------- | ------------------------------ | -| pic | pic | 输入图像。 | -| - | data_format | 返回的 Tensor 的格式,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/transformers.StoppingCriteriaList.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.StoppingCriteriaList.md similarity index 60% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/transformers.StoppingCriteriaList.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.StoppingCriteriaList.md index 330c2787468..dfa2a146a22 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/transformers.StoppingCriteriaList.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.StoppingCriteriaList.md @@ -1,4 +1,4 @@ -## [ 仅参数名不一致 ]transformers.StoppingCriteriaList +## [ 仅 API 调用方式不一致 ]transformers.StoppingCriteriaList ### [transformers.StoppingCriteriaList](https://github.com/huggingface/transformers/blob/d625294d79341662784495551abdf45e6cb9372f/src/transformers/generation/stopping_criteria.py#L503) ```python transformers.StoppingCriteriaList(input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) @@ -10,10 +10,3 @@ paddlenlp.generation.StoppingCriteriaList(input_ids: paddle.Tensor, scores: padd ``` 两者功能一致,仅参数名不一致,具体如下: - -### 参数映射 - -| transformers | PaddlePaddle | 备注 | -| ----------------- | ----------------- | --------------------------------------- | -| input_ids | input_ids | 输入(tokens) 的 id 组成的 Tensor。 | -| scores | scores | 得分组成的 Tensor,仅参数名不一致。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.get_rng_state_all.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.get_rng_state_all.md deleted file mode 100644 index c92088d86b5..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.get_rng_state_all.md +++ /dev/null @@ -1,29 +0,0 @@ -## [ 返回参数类型不一致 ]torch.cuda.get_rng_state_all -### [torch.cuda.get_rng_state_all](https://pytorch.org/docs/stable/generated/torch.cuda.get_rng_state_all.html#torch.cuda.get_rng_state_all) -```python -torch.cuda.get_rng_state_all() -``` - -### [paddle.get_rng_state]() -```python -paddle.get_rng_state(device='gpu') -``` - -paddle 参数更多,并且 torch 与 paddle 的返回参数类型不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------- | ------------ | -------------------------------------------------------------------------------------------------- | -| - | device | 返回随机数生成器状态的设备,PyTorch 无此参数,Paddle 需设置为'gpu' 。 | -| 返回值 | 返回值 | 返回参数类型不一致, PyTorch 返回 torch.ByteTensor,Paddle 返回 GeneratorState 对象。 | - -### 转写示例 -#### 返回参数类型不同 -```python -# PyTorch 写法,返回 torch.ByteTensor -x = torch.cuda.get_rng_state_all() - -# Paddle 写法,返回 GeneratorState 对象 -x = paddle.get_rng_state(device='gpu') -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.manual_seed.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.manual_seed.md deleted file mode 100644 index 896d5c484a2..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.manual_seed.md +++ /dev/null @@ -1,29 +0,0 @@ -## [ 返回参数类型不一致 ]torch.cuda.manual_seed -### [torch.cuda.manual_seed](https://pytorch.org/docs/stable/generated/torch.cuda.manual_seed.html#torch.cuda.manual_seed) -```python -torch.cuda.manual_seed(seed) -``` - -### [paddle.seed](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/seed_cn.html) -```python -paddle.seed(seed) -``` - -功能一致,返回类型不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -|---------|--------------|----------------------------------------------------| -| seed | seed | 表示设置的的随机种子(int)。 | -| - | 返回值 | PyTorch 无返回值,Paddle 返回 Generator(全局默认 generator 对象)。 | - -### 转写示例 -#### 返回值 -```python -# torch 写法 -torch.cuda.manual_seed(100) - -# paddle 写法 -gen = paddle.seed(100) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.max.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.max.md deleted file mode 100644 index ec41a35a49b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.max.md +++ /dev/null @@ -1,94 +0,0 @@ -## [ 返回参数类型不一致 ]torch.max -输入一个 Tensor 对应 paddle.max,输入两个 Tensor 对应 paddle.maximum,因此有两组差异分析,分别如下: - -------------------------------------------------------------------------------------------------- - -### [torch.max](https://pytorch.org/docs/stable/generated/torch.max.html?highlight=max#torch.max) -```python -torch.max(input, - dim=None, - keepdim=False, - *, - out=None) -``` - -### [paddle.max](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/max_cn.html#max) -```python -paddle.max(x, - axis=None, - keepdim=False, - name=None) -``` - -其中 PyTorch 与 Paddle 指定 `dim` 后返回值不一致,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 求最大值运算的维度, 仅参数名不一致。 | -| keepdim | keepdim | 是否在输出 Tensor 中保留减小的维度。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | -| 返回值 | 返回值 | 表示返回结果,当指定 dim 后,PyTorch 会返回比较结果和元素索引, Paddle 不会返回元素索引,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# 对指定维度上的 Tensor 元素求最大值运算 - -# PyTorch 写法 -torch.max(a, out=y) -# torch 在输入 dim 时,返回 (values, indices),返回参数类型不一致 - -# Paddle 写法 -paddle.assign(paddle.max(a), y) -``` -#### 指定 dim 后的返回值 -```python -# PyTorch 写法 -result = torch.max(a, dim=1) - -# Paddle 写法 -result = paddle.max(a, axis=1), paddle.argmax(a, axis=1) -``` - --------------------------------------------------------------------------------------------------- - -### [torch.max](https://pytorch.org/docs/stable/generated/torch.max.html?highlight=max#torch.max) -```python -torch.max(input, - other, - *, - out=None) -``` - -### [paddle.maximum](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/minimum_cn.html#minimum) -```python -paddle.maximum(x, - y, - name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor ,仅参数名不一致。 | -| other | y | 输入的 Tensor , 仅参数名不一致。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# 逐元素对比输入的两个 Tensor - -# PyTorch 写法 -torch.max(a, b, out=y) -# 在输入 other 时,比较 input 和 other 返回较大值 - -# Paddle 写法 -paddle.assign(paddle.maximum(a, b), y) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.sort.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.sort.md deleted file mode 100644 index 31e14ce6669..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.sort.md +++ /dev/null @@ -1,45 +0,0 @@ -## [ 返回参数类型不一致 ]torch.sort -### [torch.sort](https://pytorch.org/docs/stable/generated/torch.sort.html?highlight=sort#torch.sort) -```python -torch.sort(input, - dim=-1, - descending=False, - stable=False, - *, - out=None) -``` - -### [paddle.sort](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/sort_cn.html#paddle.sort) -```python -paddle.sort(x, - axis=-1, - descending=False, - stable=False, - name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,同时两个 api 的返回参数类型不同,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 指定对输入 Tensor 进行运算的轴。默认值为-1, 仅参数名不一致。 | -| descending |descending | 指定算法排序的方向。如果设置为 True,算法按照降序排序。如果设置为 False 或者不设置,按照升序排序。默认值为 False,参数名相同。 | -| stable | stable | 使排序程序更稳定,保证等价元素的顺序得以保留。 | -| out | - | 表示以(Tensor, LongTensor)输出的元组,含义是排序后的返回值和对应元素索引。Paddle 无此参数,若返回排序后的元素,需要转写;若需要返回元素和元素索引,需要结合 argsort 进行转写。 | - -注:PyTorch 返回 (Tensor, LongTensor),Paddle 返回 Tensor 。 - -### 转写示例 -#### out:指定输出 -```python -# 若要返回排序后的元素和元素索引,需要结合 argsort 进行转写 -# PyTorch 写法 -torch.sort(input, -1, True, out = (y, indices)) - -# Paddle 写法 -paddle.assign(paddle.sort(input, -1, True), y) -paddle.assign(paddle.argsort(input, -1, True), indices) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.utils.data.default_collate.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.utils.data.default_collate.md deleted file mode 100644 index 37964d72f29..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.utils.data.default_collate.md +++ /dev/null @@ -1,40 +0,0 @@ -## [ 返回参数类型不一致 ]torch.utils.data.default_collate -### [torch.utils.data.default_collate](https://pytorch.org/docs/stable/data.html?highlight=default_collate#torch.utils.data.default_collate) -```python -torch.utils.data.default_collate(batch) -``` - -### [paddle.io.dataloader.collate.default_collate_fn]() -```python -paddle.io.dataloader.collate.default_collate_fn(batch) -``` - -返回参数类型不一致,需要转写。具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| batch | batch | 输入的用于组 batch 的数据。 | -| 返回值 | 返回值 | 返回参数类型不一致,当 batch 的元素为 numpy.ndarray 或 number 时, PyTorch 默认返回 torch.tensor, Paddle 默认返回 numpy.ndarray。 | - - -### 转写示例 -#### 当 batch 的元素为 numpy.ndarray 或 number 时 -```python -# PyTorch 写法 -y = torch.utils.data.default_collate(batch) - -# Paddle 写法 -y = paddle.to_tensor(paddle.io.dataloader.collate.default_collate_fn(batch)) -``` - -#### 当 batch 的元素为字典且字典的 value 为 numpy.ndarray 或 number 时 -```python -# PyTorch 写法 -y = torch.utils.data.default_collate(batch) - -# Paddle 写法 -y = paddle.io.dataloader.collate.default_collate_fn(batch) -for k, v in y.items(): - y[k] = paddle.to_tensor(v) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.lu_solve.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.lu_solve.md deleted file mode 100644 index 60ac6c0c513..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.lu_solve.md +++ /dev/null @@ -1,21 +0,0 @@ -## [ paddle 参数更多 ]torch.Tensor.lu_solve -### [torch.Tensor.lu_solve](https://pytorch.org/docs/stable/generated/torch.Tensor.lu_solve.html#torch-tensor-lu-solve) -```python -torch.Tensor.lu_solve(LU_data, LU_pivots) -``` - -### [paddle.linalg.lu_solve](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/linalg/lu_solve_cn.html) -```python -paddle.linalg.lu_solve(b, lu, pivots, trans="N", name=None) -``` - -Pytorch 为 Tensor 类方法,Paddle 为普通函数,另外 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| self | b | 表示欲进行线性方程组求解的右值 Tensor ,调用 torch.Tensor 类方法的 self Tensor 传入。 | -| LU_data | lu | 表示 LU 分解结果矩阵,由 L、U 拼接组成,仅参数名不一致。 | -| LU_pivots | pivots | 表示 LU 分解结果的主元信息 Tensor ,仅参数名不一致。 | -| - | trans | 是否对 A 进行转置 ,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.pinverse.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.pinverse.md deleted file mode 100644 index 5bd373210cf..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.pinverse.md +++ /dev/null @@ -1,22 +0,0 @@ -## [ paddle 参数更多 ]torch.Tensor.pinverse - -### [torch.Tensor.pinverse](https://pytorch.org/docs/stable/generated/torch.Tensor.pinverse.html#torch.Tensor.pinverse) -```python -torch.Tensor.pinverse() -``` - -### [paddle.Tensor.pinv]() -```python -paddle.Tensor.pinv(rcond=1e-15, - hermitian=False, - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| - | rcond | 奇异值(特征值)被截断的阈值,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | hermitian | 是否为 hermitian 矩阵或者实对称矩阵,PyTorch 无此参数,Paddle 保持默认即可。| diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool2d.md deleted file mode 100644 index 40cd9cca297..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool2d.md +++ /dev/null @@ -1,18 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.AdaptiveAvgPool2d -### [torch.nn.AdaptiveAvgPool2d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool2d.html) -```python -torch.nn.AdaptiveAvgPool2d(output_size) -``` - -### [paddle.nn.AdaptiveAvgPool2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/AdaptiveAvgPool2D_cn.html#adaptiveavgpool2d) -```python -paddle.nn.AdaptiveAvgPool2D(output_size, data_format='NCHW', name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| output_size | output_size | 表示输出 Tensor 的 size 。 | -| - | data_format | 表示输入 Tensor 的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool3d.md deleted file mode 100644 index 6a9f4e31acf..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool3d.md +++ /dev/null @@ -1,18 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.AdaptiveAvgPool3d -### [torch.nn.AdaptiveAvgPool3d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool3d.html) -```python -torch.nn.AdaptiveAvgPool3d(output_size) -``` - -### [paddle.nn.AdaptiveAvgPool3D](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/AdaptiveAvgPool3D_cn.html#adaptiveavgpool3d) -```python -paddle.nn.AdaptiveAvgPool3D(output_size, data_format='NCDHW', name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| output_size | output_size | 表示输出 Tensor 的 size 。 | -| - | data_format | 表示输入 Tensor 的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool1d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool1d.md deleted file mode 100644 index af8892885d9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool1d.md +++ /dev/null @@ -1,28 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.MaxUnpool1d -### [torch.nn.MaxUnpool1d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool1d.html?highlight=maxunpool1d#torch.nn.MaxUnpool1d) -```python -torch.nn.MaxUnpool1d(kernel_size, - stride=None, - padding=0) -``` - -### [paddle.nn.MaxUnPool1D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool1D_cn.html) -```python -paddle.nn.MaxUnPool1D(kernel_size, - stride=None, - padding=0, - data_format='NCL', - output_size=None, - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| kernel_size | kernel_size | 表示反池化核大小。 | -| stride | stride | 表示反池化核步长。 | -| padding | padding | 表示填充大小。 | -| - | data_format | 输入和输出的数据格式,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | output_size | 目标输出尺寸,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool2d.md deleted file mode 100644 index b01d53b1cca..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool2d.md +++ /dev/null @@ -1,28 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.MaxUnpool2d -### [torch.nn.MaxUnpool2d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool2d.html?highlight=maxunpool2d#torch.nn.MaxUnpool2d) -```python -torch.nn.MaxUnpool2d(kernel_size, - stride=None, - padding=0) -``` - -### [paddle.nn.MaxUnPool2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool2D_cn.html) -```python -paddle.nn.MaxUnPool2D(kernel_size, - stride=None, - padding=0, - data_format='NCHW', - output_size=None, - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| kernel_size | kernel_size | 表示反池化核大小。 | -| stride | stride | 表示反池化核步长。 | -| padding | padding | 表示填充大小。 | -| - | data_format | 输入和输出的数据格式,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | output_size | 目标输出尺寸,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool3d.md deleted file mode 100644 index 1ec4ca953e5..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool3d.md +++ /dev/null @@ -1,28 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.MaxUnpool3d -### [torch.nn.MaxUnpool3d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool3d.html?highlight=maxunpool3d#torch.nn.MaxUnpool3d) -```python -torch.nn.MaxUnpool3d(kernel_size, - stride=None, - padding=0) -``` - -### [paddle.nn.MaxUnPool3D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool3D_cn.html) -```python -paddle.nn.MaxUnPool3D(kernel_size, - stride=None, - padding=0, - data_format='NCDHW', - output_size=None, - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| kernel_size | kernel_size | 表示反池化核大小。 | -| stride | stride | 表示反池化核步长。 | -| padding | padding | 表示填充大小。 | -| - | data_format | 输入和输出的数据格式,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | output_size | 目标输出尺寸,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingBilinear2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingBilinear2d.md deleted file mode 100644 index fcdf6ba071b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingBilinear2d.md +++ /dev/null @@ -1,19 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.UpsamplingBilinear2d -### [torch.nn.UpsamplingBilinear2d](https://pytorch.org/docs/stable/generated/torch.nn.UpsamplingBilinear2d.html?highlight=upsamplingbilinear2d#torch.nn.UpsamplingBilinear2d) -```python -torch.nn.UpsamplingBilinear2d(size=None, scale_factor=None) -``` - -### [paddle.nn.UpsamplingBilinear2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/UpsamplingBilinear2D_cn.html) -```python -paddle.nn.UpsamplingBilinear2D(size=None,scale_factor=None, data_format='NCHW',name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| size | size | 表示输出 Tensor 的 size 。 | -| scale_factor | scale_factor | 表示输入 Tensor 的高度或宽度的乘数因子。 | -| - | data_format | 表示输入 Tensor 的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingNearest2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingNearest2d.md deleted file mode 100644 index f262c3f9c77..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingNearest2d.md +++ /dev/null @@ -1,19 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.UpsamplingNearest2d -### [torch.nn.UpsamplingNearest2d](https://pytorch.org/docs/stable/generated/torch.nn.UpsamplingNearest2d.html?highlight=upsampl#torch.nn.UpsamplingNearest2d) -```python -torch.nn.UpsamplingNearest2d(size=None, scale_factor=None) -``` - -### [paddle.nn.UpsamplingNearest2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/UpsamplingNearest2D_cn.html) -```python -paddle.nn.UpsamplingNearest2D(size=None, scale_factor=None, data_format='NCHW',name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| size | size | 表示输出 Tensor 的 size 。 | -| scale_factor | scale_factor | 表示输入 Tensor 的高度或宽度的乘数因子。 | -| - | data_format | 表示输入 Tensor 的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.functional.pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.functional.pad.md deleted file mode 100644 index 79c7ff869e9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.functional.pad.md +++ /dev/null @@ -1,34 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.functional.pad -### [torch.nn.functional.pad](https://pytorch.org/docs/stable/generated/torch.nn.functional.pad.html) -```python -torch.nn.functional.pad(input, - pad, - mode='constant', - value=None) -``` - -### [paddle.nn.functional.pad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/pad_cn.html#pad) -```python -paddle.nn.functional.pad(x, - pad, - mode='constant', - value=0.0, - data_format=None, - pad_from_left_axis=True, - name=None) -``` - -两者功能一致,其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 表示输入的 Tensor,仅参数名不一致。 | -| pad | pad | 表示一个 one-hot 向量的长度 。 | -| mode | mode | 表示填充的模式。 | -| value | value | 表示填充的值,mode 为'constant'时有效 。 | -| - | data_format | 指定输入的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | -| - | pad_from_left_axis | 只有当 mode 为 'constant' ,且 pad 是长度为 2N 的列表时有效,设置 pad 与 x 的轴左对齐或右对齐, PyTorch 无此参数, Paddle 需设置为 False 结果才与 PyTorch 一致。 | - -在实际使用过程中,`data_format` 参数需要根据输入参数进行指定 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.median.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.median.md deleted file mode 100644 index 35e6f3ed736..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.median.md +++ /dev/null @@ -1,37 +0,0 @@ -## [ torch 参数更多 ]torch.median -### [torch.median](https://pytorch.org/docs/stable/generated/torch.median.html?highlight=median#torch.median) -```python -torch.median(input, - dim=-1, - keepdim=False, - *, - out=None) -``` - -### [paddle.median](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/median_cn.html#median) -```python -paddle.median(x, axis=None, keepdim=False, mode='avg', name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 表示输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 表示进行运算的轴,仅参数名不一致。 | -| keepdim | keepdim | 是否在输出 Tensor 中保留减小的维度。 | -| - | mode | 当 x 在所需要计算的轴上有偶数个非 NaN 元素时,选择使用平均值或最小值确定非 NaN 中位数的值, PyTorch 无此参数,Paddle 需设置为 'min'。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# PyTorch 写法 -torch.median([3, 5], out=y) - -# Paddle 写法 -paddle.assign(paddle.median([3, 5], mode='min'), y) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nanmedian.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nanmedian.md deleted file mode 100644 index 28203bf6177..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nanmedian.md +++ /dev/null @@ -1,37 +0,0 @@ -## [ torch 参数更多 ]torch.nanmedian -### [torch.nanmedian](https://pytorch.org/docs/stable/generated/torch.nanmedian.html?highlight=nanmedian#torch.nanmedian) -```python -torch.nanmedian(input, - dim=-1, - keepdim=False, - *, - out=None) -``` - -### [paddle.nanmedian](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nanmedian_cn.html#nanmedian) -```python -paddle.nanmedian(x, axis=None, keepdim=False, mode='avg', name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 表示输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 表示进行运算的轴,仅参数名不一致。 | -| keepdim | keepdim | 表示是否在输出 Tensor 中保留减小的维度。 | -| - | mode | 当 x 在所需要计算的轴上有偶数个非 NaN 元素时,选择使用平均值或最小值确定非 NaN 中位数的值, PyTorch 无此参数,Paddle 需设置为 'min'。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# PyTorch 写法 -torch.nanmedian(a, -1, out=y) - -# Paddle 写法 -paddle.assign(paddle.nanmedian(a, -1, mode='min'), y) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.softmax.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.softmax.md deleted file mode 100644 index 0287897cb35..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.softmax.md +++ /dev/null @@ -1,21 +0,0 @@ -## [ torch 参数更多 ]torch.nn.functional.softmax -### [torch.nn.functional.softmax](https://pytorch.org/docs/stable/generated/torch.nn.functional.softmax.html#torch.nn.functional.softmax) -```python -torch.nn.functional.softmax(input, dim=None, _stacklevel=3, dtype=None) -``` - -### [paddle.nn.functional.softmax](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/softmax_cn.html#softmax) -```python -paddle.nn.functional.softmax(x, axis=-1, dtype=None, name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| --------- | -------------- | ----------------------------------------------------- | -| input | x | 表示输入张量,仅参数名不一致。 | -| dim | axis | 表示对输入 Tensor 进行运算的轴,仅参数名不一致。 | -| dtype | dtype | 表示返回张量所需的数据类型。 | -| _stacklevel | - | Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/.gitignore b/docs/guides/model_convert/convert_from_pytorch/tools/.gitignore index 4204846c164..2f364e7e673 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/.gitignore +++ b/docs/guides/model_convert/convert_from_pytorch/tools/.gitignore @@ -6,6 +6,8 @@ no_implement.md download_files_from_paconvert.sh test tmp_* +generate_api_mapping.err +generate_api_mapping.log # files will be used in PaConvert docs_mappings.json diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/generate_api_difference.py b/docs/guides/model_convert/convert_from_pytorch/tools/generate_api_difference.py index bc2897d96c2..7ae34217bf7 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/generate_api_difference.py +++ b/docs/guides/model_convert/convert_from_pytorch/tools/generate_api_difference.py @@ -68,7 +68,7 @@ def get_function_signature(api_name: str, framework: str) -> str: module = flash_attn else: - raise ValueError("Invalid framework.") + raise ValueError(f"Invalid framework: {framework}") # 解析API路径 parts = api_name.split(".")[1:] @@ -87,19 +87,19 @@ def get_function_signature(api_name: str, framework: str) -> str: sig = inspect.signature(api_obj.__init__) # 移除self参数 params = [] - first_param = True for name, param in sig.parameters.items(): - if first_param and name == "self": - first_param = False + if name == "self" or param.name == "self": continue - first_param = False params.append(format_param(param)) - return f"{api_name}({', '.join(params)})" # 处理普通函数和方法 sig = inspect.signature(api_obj) - params = [format_param(param) for param in sig.parameters.values()] + params = [] + for name, param in sig.parameters.values(): + if name == "self" or param.name == "self": + continue + params.append(format_param(param)) return f"{api_name}({', '.join(params)})" except (ValueError, TypeError): @@ -119,18 +119,19 @@ def format_param(param: inspect.Parameter) -> str: def parse_signature_from_help(api_obj, api_name: str) -> str: """从help信息中解析函数签名""" - - # 捕获help输出 help_output = get_help_output(api_obj, api_name) if not help_output: - return f"{api_name}(...)" + raise APIConversionError(f"Failed to get help output for {api_name}") - # 解析函数签名行 + # 尝试从help输出中提取签名行 signature_line = extract_signature_line(help_output, api_name) - if signature_line: - return normalize_signature(signature_line, api_name) - - return f"{api_name}(...)" + if not signature_line: + raise APIConversionError( + f"Failed to extract signature line for {api_name}" + ) + signature = normalize_signature(signature_line, api_name) + print("LOGGING:", api_name, help_output[:5], signature) + return signature def get_help_output(api_obj, api_name: str) -> str | None: @@ -140,18 +141,21 @@ def get_help_output(api_obj, api_name: str) -> str | None: with contextlib.redirect_stdout(buffer): help(api_obj) return buffer.getvalue() - except: - raise APIConversionError(f"Failed to get help output for {api_name}") + except Exception as e: + raise APIConversionError( + f"Failed to get help output for {api_name}: {e!s}" + ) def extract_signature_line(help_text: str, api_name: str) -> str | None: """从help文本中提取签名行""" lines = help_text.split("\n") base_name = api_name.split(".")[-1] + signature_line = None # 匹配模式:函数名后跟括号 patterns = [ - # 匹配: numel(...) 或 forward(*args: Any, **kwargs: Any) -> Any + # 匹配: numel(input: Tensor) -> int rf"^{re.escape(base_name)}\s*\([^)]*\)", # 匹配: | ZeroPad2d(padding: Union[int, tuple[int, int, int, int]]) -> None rf"^\s*[\| ]*\w+\s+{re.escape(base_name)}\s*\([^)]*\)", @@ -162,7 +166,20 @@ def extract_signature_line(help_text: str, api_name: str) -> str | None: for i, line in enumerate(lines): for pattern in patterns: if re.search(pattern, line.strip()): - # 对于多行签名,合并后续行直到遇到空行或缩进减少 + # 提取括号内的内容 + match = re.search(r"\(([^)]*)\)", line.strip()) + if not match: + continue + params_str = match.group(1) + + # 跳过无效的签名(如numel(...)) + if ( + params_str.strip() == "..." + or params_str.strip() == "..." * 2 + ): + continue + + # 处理多行签名 signature = line.strip() j = i + 1 while ( @@ -174,104 +191,108 @@ def extract_signature_line(help_text: str, api_name: str) -> str | None: j += 1 return signature - raise APIConversionError(f"Failed to extract signature line for {api_name}") + # 如果未找到有效签名,尝试匹配包含"->"的行 + for i, line in enumerate(lines): + if " -> " in line and base_name in line: + # 提取完整签名行 + signature = line.strip() + j = i + 1 + while ( + j < len(lines) + and lines[j].strip() + and not lines[j].strip().startswith(("def ", "class ")) + ): + signature += " " + lines[j].strip() + j += 1 + return signature + + raise APIConversionError( + f"Failed to extract signature line for {api_name} from help" + ) def normalize_signature(signature_line: str, api_name: str) -> str: - """规范化签名格式""" + """规范化签名格式,正确处理嵌套括号""" # 提取括号内的内容 match = re.search(r"\(([^)]*)\)", signature_line) if not match: return f"{api_name}()" params_str = match.group(1) - - # 处理不同的参数格式 - if params_str == "...": # 如: numel(...) - return f"{api_name}()" - - # 解析参数,移除类型注解和默认值 params = [] - current_param = [] - depth = 0 # 处理嵌套括号 - for char in params_str + ",": # 添加逗号确保处理最后一个参数 - if char == "," and depth == 0: + # 处理参数列表(支持逗号分隔,正确处理嵌套括号) + current_param = [] + stack = [] # 用于跟踪括号嵌套 + + # 添加逗号确保处理最后一个参数 + for char in params_str + ",": + # 处理左括号:圆括号、方括号、尖括号 + if char in "([{<": + stack.append(char) + # 处理右括号:匹配对应的左括号 + elif char in ")]}>": + if stack: + # 检查是否匹配(简化处理,不检查具体类型) + stack.pop() + + # 当栈为空时,遇到逗号才分割参数 + if char == "," and not stack: param = "".join(current_param).strip() if param: - # 提取参数名(移除类型注解) - param_name = extract_param_name(param) - if param_name: - params.append(param_name) + params.append(extract_param_name(param)) current_param = [] else: - if char == "(": - depth += 1 - elif char == ")": - depth -= 1 current_param.append(char) - # 处理特殊参数格式 - final_params = [] - for param in params: - if param.startswith("*") and param.endswith(": Any"): - # 处理 *args: Any, **kwargs: Any - param = param.replace(": Any", "") - elif "=" in param and not param.startswith("*"): - # 移除默认值,保留参数名 - param = param.split("=")[0].strip() + # 移除无效参数 + params = [p for p in params if p] - final_params.append(param) - - return f"{api_name}({', '.join(final_params)})" + return f"{api_name}({', '.join(params)})" def extract_param_name(param_str: str) -> str | None: - """从参数字符串中提取参数名""" + """从参数字符串中提取参数名(移除类型注解和默认值)""" param_str = param_str.strip() if not param_str: return None - + if "self" == param_str: + return None # 处理可变参数 *args, **kwargs - if param_str.startswith("*") and param_str.endswith(": Any"): - return param_str.replace(": Any", "") + if param_str.startswith("*") or param_str.startswith("**"): + # 移除类型注解(如 *args: Any) + if ": " in param_str: + param_name = param_str.split(":")[0].strip() + if "self" == param_name: + return None + return param_name + return param_str - # 移除类型注解 + # 移除类型注解(如 input: Tensor) if ":" in param_str: - # 找到第一个冒号(类型注解开始) - colon_pos = param_str.find(":") - param_name = param_str[:colon_pos].strip() - - # 检查是否是可变参数 - if param_name.startswith("*"): - return param_name - else: - return param_name - else: - # 没有类型注解,直接返回 - return ( - param_str.split("=")[0].strip() if "=" in param_str else param_str - ) + param_name = param_str.split(":")[0].strip() + # # 移除默认值(如 input=None) + # if "=" in param_name: + # param_name = param_name.split("=")[0].strip() + # if "self" == param_name: + # return None + # return param_name + if "self" == param_name.split("=")[0].strip(): + return None + return param_name + # 移除默认值(如 input=None) + # if "=" in param_str: + # return param_str.split("=")[0].strip() -def find_test_file(torch_api: str, paconvert_dir: str) -> str: - """ - 在paconvert的tests目录中递归查找测试文件 + return param_str - Args: - torch_api: Torch API名称 - paconvert_dir: paconvert目录路径 - Returns: - 测试文件路径 - """ +def find_test_file(torch_api: str, paconvert_dir: str) -> str: + """在paconvert的tests目录中递归查找测试文件""" # 生成测试文件名(如:test_nn_functional_elu.py) - head = torch_api.split(".")[0] - if head == "flash_attn": - parts = torch_api.split(".") - else: - parts = torch_api.split(".")[1:] + parts = torch_api.split(".")[1:] file_name = "test_" + "_".join(parts) + ".py" # 在tests目录中递归查找 @@ -284,15 +305,7 @@ def find_test_file(torch_api: str, paconvert_dir: str) -> str: def extract_test_case_code(test_file: str) -> str: - """ - 从测试文件中提取第一个测试用例的pytorch代码 - - Args: - test_file: 测试文件路径 - - Returns: - 提取的pytorch代码字符串 - """ + """从测试文件中提取第一个测试用例的pytorch代码""" with open(test_file, "r", encoding="utf-8") as f: content = f.read() @@ -309,25 +322,19 @@ def extract_test_case_code(test_file: str) -> str: isinstance(target, ast.Name) and target.id == "pytorch_code" ): - # 检查赋值语句的值是否是函数调用 + # 处理textwrap.dedent调用 if isinstance(item.value, ast.Call): - call_func = item.value.func - # 检查是否是textwrap.dedent调用 if ( - isinstance(call_func, ast.Attribute) - and isinstance(call_func.value, ast.Name) - and call_func.value.id == "textwrap" - and call_func.attr == "dedent" + isinstance(item.value.func, ast.Attribute) + and item.value.func.value.id == "textwrap" + and item.value.func.attr == "dedent" ): - # 获取dedent的第一个参数(应该是字符串) if item.value.args and isinstance( item.value.args[0], ast.Str ): - # 返回字符串内容,去除首尾的三引号 - code_str = item.value.args[0].s - return textwrap.dedent(code_str) - - # 处理Python 3.8+的ast.Constant节点 + return textwrap.dedent( + item.value.args[0].s + ) elif ( item.value.args and isinstance( @@ -337,23 +344,15 @@ def extract_test_case_code(test_file: str) -> str: item.value.args[0].value, str ) ): - code_str = item.value.args[0].value - return textwrap.dedent(code_str) + return textwrap.dedent( + item.value.args[0].value + ) raise APIConversionError(f"Test case not found in {test_file}", test_file) def get_torch_example(torch_api: str, paconvert_dir: str) -> str: - """ - 获取Torch API的示例代码 - - Args: - torch_api: Torch API名称 - paconvert_dir: paconvert目录路径 - - Returns: - Torch API调用代码 - """ + """获取Torch API的示例代码""" # 1. 查找测试文件 test_file = find_test_file(torch_api, paconvert_dir) @@ -361,19 +360,20 @@ def get_torch_example(torch_api: str, paconvert_dir: str) -> str: test_code = extract_test_case_code(test_file) # 3. 写入临时文件 - torch_temp_file = f"temp_generate_api_difference_{torch_api.replace('.', '_')}_torch_code.py" - with open(torch_temp_file, "w") as f: + base_name = torch_api.replace(".", "_") + temp_file = f"temp_{base_name}_torch_code.py" + with open(temp_file, "w") as f: f.write(test_code) # 4. 使用paconvert补全代码 - complete_file = f"temp_generate_api_difference_{torch_api.replace('.', '_')}_torch_code_complete.py" + complete_file = f"temp_{base_name}_torch_code_complete.py" try: subprocess.run( [ "python3.10", os.path.join(paconvert_dir, "paconvert", "main.py"), "-i", - torch_temp_file, + temp_file, "-o", complete_file, "--only_complete", @@ -386,17 +386,20 @@ def get_torch_example(torch_api: str, paconvert_dir: str) -> str: with open(complete_file, "r") as f: lines = f.readlines() - if lines and "import paddle" in lines[0]: - lines[0] = "import torch\n" + for i, line in enumerate(lines): + if "import paddle" in line: + lines[i] = "import torch\n" with open(complete_file, "w") as f: f.writelines(lines) - # 6. 查找包含API调用的行 + # 6. 使用AST提取包含API调用的代码块 with open(complete_file, "r") as f: - for line in f: - if torch_api.split(".")[-1] in line: - return line.strip() + complete_code = f.read() + + example_code = extract_api_code_block(complete_code, torch_api) + if example_code: + return example_code.strip() except subprocess.CalledProcessError as e: raise APIConversionError( @@ -412,32 +415,18 @@ def get_torch_example(torch_api: str, paconvert_dir: str) -> str: def get_conversion_example( torch_code: str, torch_api: str, paddle_api: str, paconvert_dir: str ) -> str: - """ - 使用paconvert转换Torch代码为Paddle代码 - - Args: - torch_code: Torch代码 - torch_api: Torch API名称(用于临时文件命名) - paddle_api: Paddle API名称 - paconvert_dir: paconvert目录路径 - - Returns: - Paddle API调用代码 - """ - # 1. 创建临时文件 - temp_file = f"temp_generate_api_difference_{torch_api.replace('.', '_')}_torch_code_complete.py" - # with open(temp_file, "w") as f: - # f.write(torch_code) - + """使用paconvert转换Torch代码为Paddle代码""" + # 1. 创建临时文件(已由调用方创建,这里直接使用) # 2. 运行paconvert转换 - paddle_file = f"temp_generate_api_difference_{torch_api.replace('.', '_')}_paddle_code.py" + base_name = torch_api.replace(".", "_") + paddle_file = f"temp_{base_name}_paddle_code.py" try: subprocess.run( [ "python3.10", os.path.join(paconvert_dir, "paconvert", "main.py"), "-i", - temp_file, + "temp_" + base_name + "_torch_code_complete.py", "-o", paddle_file, ], @@ -445,11 +434,13 @@ def get_conversion_example( capture_output=True, ) - # 3. 查找包含API调用的行 + # 3. 使用AST提取包含API调用的代码块 with open(paddle_file, "r") as f: - for line in f: - if paddle_api.split(".")[-1] in line: - return line.strip() + paddle_code = f.read() + + example_code = extract_api_code_block(paddle_code, paddle_api) + if example_code: + return example_code.strip() except subprocess.CalledProcessError as e: raise APIConversionError( @@ -464,17 +455,452 @@ def get_conversion_example( ) -def generate_invok_diff_only_docs( - output_dir: str, paconvert_dir: str, overwrite: bool = False -): +def extract_api_code_block(code: str, api: str) -> str | None: """ - 生成"仅 API 调用方式不一致"类别的API差异文档 + 使用AST提取包含API调用的完整代码块 Args: - output_dir: 输出目录 - paconvert_dir: PaConvert目录路径 - overwrite: 是否覆盖已有文件 + code: 完整的Python代码字符串 + api: 要查找的API名称(如"torch.nn.AdaptiveAvgPool2d") + + Returns: + 包含API调用的完整代码块,如果没有找到则返回None """ + try: + tree = ast.parse(code) + add_parent_links(tree) # 添加父节点链接 + except SyntaxError: + # 如果代码有语法错误,回退到简单匹配 + return find_api_line_fallback(code, api) + + api_base_name = api.split(".")[-1] + + # 首先检查完整API是否出现在一个完整的语句中 + full_api_statement = find_full_api_statement(tree, code, api) + if full_api_statement: + return full_api_statement + + # 如果完整API不在完整语句内,查找包含基础名称的代码块 + api_nodes = find_api_nodes(tree, api, api_base_name) + + if not api_nodes: + return None + + # 选择最合适的节点 + target_node = select_best_node(api_nodes, api) + + # 提取包含该节点的代码块 + code_block = extract_node_code_block(code, target_node, api) + + return code_block + + +def find_full_api_statement(tree: ast.AST, code: str, api: str) -> str | None: + """ + 检查完整API是否出现在一个完整的语句中 + + Args: + tree: AST树 + code: 完整的代码字符串 + api: 要查找的API + + Returns: + 如果完整API出现在一个完整语句中,返回该语句;否则返回None + """ + # 查找包含完整API的节点 + api_nodes = [] + + class FullApiVisitor(ast.NodeVisitor): + def visit_Call(self, node: ast.Call) -> None: + # 检查函数调用 + if is_full_api_in_call(node, api): + api_nodes.append(node) + self.generic_visit(node) + + def visit_Attribute(self, node: ast.Attribute) -> None: + # 检查属性访问 + if is_full_api_in_attribute(node, api): + api_nodes.append(node) + self.generic_visit(node) + + def visit_ClassDef(self, node: ast.ClassDef) -> None: + # 检查类定义 + if any(api in base for base in get_base_classes(node)): + api_nodes.append(node) + self.generic_visit(node) + + visitor = FullApiVisitor() + visitor.visit(tree) + + if not api_nodes: + return None + + # 选择最合适的节点 + target_node = select_best_node(api_nodes, api) + + # 提取包含该节点的完整语句 + statement_node = find_complete_statement(target_node) + if statement_node: + return extract_source_segment(code, statement_node) + + return None + + +def is_full_api_in_call(node: ast.Call, full_api: str) -> bool: + """检查函数调用节点是否包含完整的目标API""" + if isinstance(node.func, ast.Attribute): + # 构建完整的调用路径 + call_path = get_attribute_path(node.func) + return call_path == full_api + return False + + +def is_full_api_in_attribute(node: ast.Attribute, full_api: str) -> bool: + """检查属性访问节点是否包含完整的目标API""" + attr_path = get_attribute_path(node) + return attr_path == full_api + + +def find_complete_statement(node: ast.AST) -> ast.AST | None: + """查找包含当前节点的完整语句""" + # 向上遍历,直到找到语句级别的节点 + current = node + while current and not is_statement_node(current): + if hasattr(current, "parent"): + current = current.parent + else: + break + + return current if is_statement_node(current) else None + + +def is_statement_node(node: ast.AST) -> bool: + """检查节点是否是语句级别的节点""" + return isinstance( + node, + ( + ast.Assign, + ast.Expr, + ast.Return, + ast.AugAssign, + ast.Call, + ast.ClassDef, + ast.FunctionDef, + ast.Import, + ast.ImportFrom, + ), + ) + + +def find_api_nodes( + tree: ast.AST, full_api: str, base_name: str +) -> list[ast.AST]: + """ + 在AST中查找包含API的所有相关节点 + + Returns: + 包含API的节点列表,按相关性排序 + """ + nodes = [] + + class ApiVisitor(ast.NodeVisitor): + def visit_Call(self, node: ast.Call) -> None: + # 检查函数调用 + if is_api_in_call(node, full_api, base_name): + nodes.append(node) + self.generic_visit(node) + + def visit_Attribute(self, node: ast.Attribute) -> None: + # 检查属性访问(如torch.nn.AdaptiveAvgPool2d) + if is_api_in_attribute(node, full_api, base_name): + nodes.append(node) + self.generic_visit(node) + + def visit_ClassDef(self, node: ast.ClassDef) -> None: + # 检查类定义 + if base_name in node.name or any( + full_api in base for base in get_base_classes(node) + ): + nodes.append(node) + self.generic_visit(node) + + def visit_FunctionDef(self, node: ast.FunctionDef) -> None: + # 检查函数定义 + if base_name in node.name: + nodes.append(node) + self.generic_visit(node) + + def visit_ImportFrom(self, node: ast.ImportFrom) -> None: + # 检查import语句 + for alias in node.names: + if base_name in alias.name or full_api.endswith(alias.name): + nodes.append(node) + self.generic_visit(node) + + visitor = ApiVisitor() + visitor.visit(tree) + return nodes + + +def is_api_in_call(node: ast.Call, full_api: str, base_name: str) -> bool: + """检查函数调用节点是否包含目标API""" + if isinstance(node.func, ast.Name): + return node.func.id == base_name + elif isinstance(node.func, ast.Attribute): + # 构建完整的调用路径 + call_path = get_attribute_path(node.func) + return full_api in call_path or base_name in call_path + return False + + +def is_api_in_attribute( + node: ast.Attribute, full_api: str, base_name: str +) -> bool: + """检查属性访问节点是否包含目标API""" + attr_path = get_attribute_path(node) + return full_api in attr_path or base_name in attr_path + + +def get_attribute_path(node: ast.AST) -> str: + """获取属性访问的完整路径""" + if isinstance(node, ast.Name): + return node.id + elif isinstance(node, ast.Attribute): + return f"{get_attribute_path(node.value)}.{node.attr}" + return "" + + +def get_base_classes(node: ast.ClassDef) -> list[str]: + """获取类的基类列表""" + bases = [] + for base in node.bases: + if isinstance(base, ast.Name): + bases.append(base.id) + elif isinstance(base, ast.Attribute): + bases.append(get_attribute_path(base)) + return bases + + +def select_best_node(nodes: list[ast.AST], api: str) -> ast.AST: + """从多个节点中选择最合适的一个""" + if len(nodes) == 1: + return nodes[0] + + # 优先选择包含完整API的节点 + for node in nodes: + if hasattr(node, "func") and isinstance(node.func, ast.Attribute): + if api in get_attribute_path(node.func): + return node + + # 否则返回第一个节点 + return nodes[0] + + +def extract_node_code_block(code: str, node: ast.AST, api: str) -> str: + """ + 提取包含节点的完整代码块 + + 根据节点类型提取不同范围的代码: + - 类定义:提取整个类 + - 函数定义:提取整个函数 + - 调用/赋值:提取所在语句块 + """ + # 如果节点是类或函数定义,直接提取整个定义 + if isinstance(node, (ast.ClassDef, ast.FunctionDef)): + return extract_source_segment(code, node) + + # 对于其他节点,找到包含API路径的最近容器 + container = find_api_container_node(node, api) + if container: + return extract_source_segment(code, container) + else: + # 如果没有找到特定容器,提取单个语句 + statement = find_complete_statement(node) + return ( + extract_source_segment(code, statement) + if statement + else extract_source_segment(code, node) + ) + + +def find_api_container_node(node: ast.AST, api: str) -> ast.AST | None: + """ + 查找包含API路径的最近容器节点 + + 例如,对于api="torch.autograd.Function",查找包含该路径的类定义 + """ + # 获取API的父路径(去掉最后一部分) + api_parts = api.split(".") + if len(api_parts) > 1: + parent_api = ".".join(api_parts[:-1]) + else: + parent_api = None + + # 向上遍历父节点,查找包含父API的容器 + current = node + while hasattr(current, "parent") and current.parent: + if isinstance(current.parent, (ast.ClassDef, ast.FunctionDef)): + # 检查类或函数名是否包含父API + if parent_api and ( + parent_api in current.parent.name + or any( + parent_api in base + for base in get_base_classes(current.parent) + if isinstance(current.parent, ast.ClassDef) + ) + ): + return current.parent + # 如果没有匹配的父API,返回最近的类或函数 + return current.parent + current = current.parent + + return None + + +def extract_source_segment(code: str, node: ast.AST) -> str: + """提取节点的源代码段""" + if not hasattr(node, "lineno") or not hasattr(node, "end_lineno"): + # 如果没有行号信息,尝试获取单行 + if hasattr(node, "lineno"): + lines = code.split("\n") + return lines[node.lineno - 1] + return "" + + lines = code.split("\n") + start_line = node.lineno - 1 + end_line = node.end_lineno + return "\n".join(lines[start_line:end_line]) + + +def find_api_line_fallback(code: str, api: str) -> str | None: + """ + 回退方法:当AST解析失败时使用简单的行匹配 + """ + api_base_name = api.split(".")[-1] + lines = code.split("\n") + + # 首先尝试完整API匹配 + for i, line in enumerate(lines): + if api in line and is_valid_api_occurrence(line, api): + # 尝试获取完整的语句(可能跨越多行) + statement_lines = get_complete_statement_lines(lines, i) + return "\n".join(statement_lines) + + # 然后尝试基础名称匹配 + for i, line in enumerate(lines): + if api_base_name in line: + # 尝试获取完整的语句(可能跨越多行) + statement_lines = get_complete_statement_lines(lines, i) + return "\n".join(statement_lines) + + return None + + +def is_valid_api_occurrence(line: str, api: str) -> bool: + """ + 检查API在行中的出现是否是有效的(不是注释或字符串的一部分) + + Args: + line: 代码行 + api: API名称 + + Returns: + 如果是有效的API出现返回True,否则返回False + """ + # 简单的检查:确保API前后不是字母数字或下划线(避免部分匹配) + index = line.find(api) + if index == -1: + return False + + # 检查前一个字符 + if index > 0 and line[index - 1].isalnum(): + return False + + # 检查后一个字符 + end_index = index + len(api) + if end_index < len(line) and line[end_index].isalnum(): + return False + + # 检查是否在注释中 + comment_index = line.find("#") + if comment_index != -1 and index > comment_index: + return False + + return True + + +def get_complete_statement_lines( + lines: list[str], start_line: int +) -> list[str]: + """ + 尝试获取完整的语句(可能跨越多行) + + Args: + lines: 所有代码行的列表 + start_line: 起始行索引 + + Returns: + 完整语句的行列表 + """ + # 简单的括号匹配算法来找到语句的结束 + open_brackets = 0 + open_parens = 0 + open_braces = 0 + + result_lines = [] + + for i in range(start_line, len(lines)): + line = lines[i] + result_lines.append(line) + + # 统计括号数量 + for char in line: + if char == "[": + open_brackets += 1 + elif char == "]": + open_brackets -= 1 + elif char == "(": + open_parens += 1 + elif char == ")": + open_parens -= 1 + elif char == "{": + open_braces += 1 + elif char == "}": + open_braces -= 1 + + # 检查是否所有括号都已关闭,并且行以语句结束符结尾 + if ( + open_brackets == 0 + and open_parens == 0 + and open_braces == 0 + and ( + line.endswith(":") + or any( + line.rstrip().endswith(end) + for end in [",", "\\", "(", "[", "{"] + ) + is False + ) + ): + break + + return result_lines + + +def add_parent_links(tree: ast.AST) -> None: + """为AST节点添加父节点链接""" + for node in ast.walk(tree): + for child in ast.iter_child_nodes(node): + child.parent = node + + +def generate_invok_diff_only_docs( + output_dir: str, + paconvert_dir: str, + delete_temp_file: bool = False, + overwrite: bool = False, +): + """生成"仅 API 调用方式不一致"类别的API差异文档""" script_dir = os.path.dirname(os.path.abspath(__file__)) api_mapping_path = os.path.join(script_dir, "api_mapping.json") @@ -493,7 +919,7 @@ def generate_invok_diff_only_docs( # 读取API映射 api_mapping = load_mapping_json(api_mapping_path) attribute_mapping = load_mapping_json(attribute_mapping_path) - api_mapping = api_mapping | attribute_mapping + api_mapping = {**api_mapping, **attribute_mapping} # 定义属于invok_diff_only类别的Matcher invok_diff_matchers = [ @@ -512,66 +938,130 @@ def generate_invok_diff_only_docs( ) os.makedirs(test_output_dir, exist_ok=True) - # 生成文档 + # 记录所有临时文件路径 + temp_files = [] + + # 定义三类需要特殊处理的 Matcher + special_matchers = { + "TensorFunc2PaddleFunc", + "Func2Attribute", + "Attribute2Func", + } + for torch_api, mapping in api_mapping.items(): - if ( - mapping.get("Matcher") in invok_diff_matchers - and torch_api not in whitelist_api - and torch_api not in no_need_list - ): - paddle_api = mapping["paddle_api"] - print(f"Processing: {torch_api} -> {paddle_api}") - # 生成文件名 - file_name = f"{torch_api}.md" - file_path = os.path.join(test_output_dir, file_name) - if overwrite: - file_path = os.path.join(actually_output_dir, file_name) - - try: - # 获取URL - torch_url = get_pytorch_url(torch_api) - paddle_url = get_paddle_url(paddle_api) - - # 获取函数签名 - module = torch_api.split(".")[0] - torch_signature = get_function_signature(torch_api, module) - paddle_signature = get_function_signature(paddle_api, "paddle") - - # 生成转写示例 - torch_example = get_torch_example(torch_api, paconvert_dir) - paddle_example = get_conversion_example( - torch_example, torch_api, paddle_api, paconvert_dir + matcher = mapping.get("Matcher") + + # 判断是否属于目标 Matcher 集合 + if matcher not in invok_diff_matchers: + continue + if torch_api in whitelist_api or torch_api in no_need_list: + continue + + # 如果是特殊三类 Matcher,需要进一步分类 + if matcher in special_matchers: + has_unsupport_args = "unsupport_args" in mapping + has_kwargs_change = "kwargs_change" in mapping + has_paddle_default_kwargs = "paddle_default_kwargs" in mapping + + if has_unsupport_args: + print( + f"type error: [torch_more_args] {torch_api} -> {mapping.get('paddle_api', 'N/A')}" ) - - # 生成文档内容 - content = f"## [ 仅 API 调用方式不一致 ]{torch_api}\n\n" - content += f"### [{torch_api}]({torch_url})\n\n" - content += "```python\n" - content += f"{torch_signature}\n" - content += "```\n\n" - content += f"### [{paddle_api}]({paddle_url})\n\n" - content += "```python\n" - content += f"{paddle_signature}\n" - content += "```\n\n" - content += "两者功能一致,但调用方式不一致,具体如下:\n\n" - content += "### 转写示例\n\n" - content += "```python\n" - content += f"# PyTorch 写法\n{torch_example}\n\n" - content += f"# Paddle 写法\n{paddle_example}\n" - content += "```\n" - - # 保存文件 - with open(file_path, "w", encoding="utf-8") as f: - f.write(content) - - print(f"Generated: {file_path}") - - except APIConversionError as e: - print(f"ERROR: {e}", file=sys.stderr) continue - except Exception as e: - print(f"UNEXPECTED ERROR: {e} for {torch_api}", file=sys.stderr) + elif has_kwargs_change: + print( + f"type error: [args_name_diff] {torch_api} -> {mapping.get('paddle_api', 'N/A')}" + ) continue + elif has_paddle_default_kwargs: + print( + f"type error: [paddle_more_args_or_default_diff] {torch_api} -> {mapping.get('paddle_api', 'N/A')}" + ) + continue + else: + # 属于 invok_diff_only,继续后续处理 + pass # 继续执行下面的文档生成逻辑 + else: + # 非特殊三类 Matcher(如 NumelMatcher、Is_InferenceMatcher 等),按原逻辑处理 + pass + + # === 以下为原逻辑:仅处理 invok_diff_only 情况 === + paddle_api = mapping["paddle_api"] + print(f"Processing: {torch_api} -> {paddle_api}") + + # 生成文件名 + base_name = torch_api.replace(".", "_") + file_name = f"{torch_api}.md" + file_path = os.path.join(test_output_dir, file_name) + if overwrite: + file_path = os.path.join(actually_output_dir, file_name) + try: + # 获取URL + torch_url = get_pytorch_url(torch_api) + paddle_url = get_paddle_url(paddle_api) + + # 获取函数签名 + torch_signature = get_function_signature( + torch_api, torch_api.split(".")[0] + ) + paddle_signature = get_function_signature(paddle_api, "paddle") + + # 生成转写示例 + torch_example = get_torch_example(torch_api, paconvert_dir) + paddle_example = get_conversion_example( + torch_example, torch_api, paddle_api, paconvert_dir + ) + + # 生成文档内容 + content = f"## [ 仅 API 调用方式不一致 ]{torch_api}\n\n" + content += f"### [{torch_api}]({torch_url})\n\n" + content += "```python\n" + content += f"{torch_signature}\n" + content += "```\n\n" + content += f"### [{paddle_api}]({paddle_url})\n\n" + content += "```python\n" + content += f"{paddle_signature}\n" + content += "```\n\n" + content += "两者功能一致,但调用方式不一致,具体如下:\n\n" + content += "### 转写示例\n\n" + content += "```python\n" + content += f"# PyTorch 写法\n{torch_example}\n\n" + content += f"# Paddle 写法\n{paddle_example}\n" + content += "```\n" + + # 保存文件 + with open(file_path, "w", encoding="utf-8") as f: + f.write(content) + + print(f"Generated: {file_path}") + + # 记录临时文件 + temp_files.append(f"temp_{base_name}_torch_code.py") + temp_files.append(f"temp_{base_name}_torch_code_complete.py") + temp_files.append(f"temp_{base_name}_paddle_code.py") + + except APIConversionError as e: + print(f"ERROR: {e}", file=sys.stderr) + temp_files.append(f"temp_{base_name}_torch_code.py") + temp_files.append(f"temp_{base_name}_torch_code_complete.py") + temp_files.append(f"temp_{base_name}_paddle_code.py") + continue + except Exception as e: + print(f"UNEXPECTED ERROR: {e} for {torch_api}", file=sys.stderr) + temp_files.append(f"temp_{base_name}_torch_code.py") + temp_files.append(f"temp_{base_name}_torch_code_complete.py") + temp_files.append(f"temp_{base_name}_paddle_code.py") + continue + + # 删除临时文件(如果需要) + if delete_temp_file: + for file in temp_files: + if os.path.exists(file): + try: + os.remove(file) + print(f"Deleted temporary file: {file}") + except Exception as e: + print(f"Failed to delete {file}: {e}", file=sys.stderr) def main(): @@ -593,13 +1083,21 @@ def main(): parser.add_argument( "--overwrite", action="store_true", help="Overwrite existing files" ) + parser.add_argument( + "--delete_temp_file", + action="store_true", + help="Delete temporary files after generation", + ) args = parser.parse_args() + print(args.delete_temp_file) + # 生成文档 generate_invok_diff_only_docs( output_dir=args.output_dir, paconvert_dir=args.paconvert_dir, + delete_temp_file=args.delete_temp_file, overwrite=args.overwrite, ) diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/generate_pytorch_api_mapping.py b/docs/guides/model_convert/convert_from_pytorch/tools/generate_pytorch_api_mapping.py index c4af7f44da1..34d47a52718 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/generate_pytorch_api_mapping.py +++ b/docs/guides/model_convert/convert_from_pytorch/tools/generate_pytorch_api_mapping.py @@ -181,6 +181,40 @@ def generate_category2_table( "NumelMatcher", "Is_InferenceMatcher", ]: + special_matchers = { + "TensorFunc2PaddleFunc", + "Func2Attribute", + "Attribute2Func", + } + if matcher in special_matchers: + has_unsupport_args = "unsupport_args" in mapping_info + has_kwargs_change = "kwargs_change" in mapping_info + has_paddle_default_kwargs = ( + "paddle_default_kwargs" in mapping_info + ) + + if has_unsupport_args: + print( + f"[torch_more_args] {src_api} -> {mapping_info.get('paddle_api', 'N/A')}" + ) + continue + elif has_kwargs_change: + print( + f"[args_name_diff] {src_api} -> {mapping_info.get('paddle_api', 'N/A')}" + ) + continue + elif has_paddle_default_kwargs: + print( + f"[paddle_more_args_or_default_diff] {src_api} -> {mapping_info.get('paddle_api', 'N/A')}" + ) + continue + else: + # 属于 invok_diff_only,继续后续处理 + pass # 继续执行下面的文档生成逻辑 + else: + # 非特殊三类 Matcher(如 NumelMatcher、Is_InferenceMatcher 等),按原逻辑处理 + pass + # 在docs_mapping中查找当前src_api对应的信息 docs_mapping_info = docs_mapping.get(src_api, {}) src_url = docs_mapping_info.get("src_api_url") diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/utils.py b/docs/guides/model_convert/convert_from_pytorch/tools/utils.py index a54de7bcc04..f346514fab5 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/utils.py +++ b/docs/guides/model_convert/convert_from_pytorch/tools/utils.py @@ -299,7 +299,6 @@ def get_paddle_url(paddle_api: str) -> str: 对应API的官方文档URL字符串 """ # 将API名称转换为URL格式 - # 例如: paddle.distributed.reduce_scatter -> paddle/distributed/reduce_scatter url_path = paddle_api.replace(".", "/") + "_cn.html" # 构建URL @@ -309,15 +308,12 @@ def get_paddle_url(paddle_api: str) -> str: url = base_url + url_path # 检查RST文件是否存在 - root_dir = "." # 默认根目录 - rst_path = os.path.join( - root_dir, "api", url_path.replace("_cn.html", ".rst") - ) + root_dir = "./docs/" # 默认根目录 + rst_path = os.path.join(root_dir, "api", url_path.replace(".html", ".rst")) + # 如果RST文件不存在,尝试查找同名文件并移动 if not os.path.exists(rst_path): - print( - f"Warning: RST file for {paddle_api} does not exist at {rst_path}" - ) + print(f"Warning: RST file '{url_path}' not found.") # 添加锚点 anchor = url_path.replace(