# 比较与torch.svd的差异

[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.4.10/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/r2.4.10/docs/mindspore/source_zh_cn/note/api_mapping/pytorch_diff/svd.md)

以下映射关系均可参考本文。

|     PyTorch APIs      |      MindSpore APIs       |
| :-------------------: | :-----------------------: |
|   torch.svd    |   mindspore.ops.svd    |
|    torch.Tensor.svd   |  mindspore.Tensor.svd   |

## torch.svd

```python
torch.svd(input, some=True, compute_uv=True, *, out=None)
```

更多内容详见[torch.svd](https://pytorch.org/docs/1.8.1/generated/torch.svd.html)。

## mindspore.ops.svd

```python
mindspore.ops.svd(input, full_matrices=False, compute_uv=True)
```

更多内容详见[mindspore.ops.svd](https://www.mindspore.cn/docs/zh-CN/r2.4.10/api_python/ops/mindspore.ops.svd.html)。

## 差异对比

MindSpore此API功能与PyTorch不一致。

PyTorch:

- 如果参数 `some` 为True,该接口返回缩减后的奇异值分解结果。

- 始终有三个输出值,输出值的顺序是 u,s,v。

- 如果参数 `compute_uv` 为False,u 和 v 的值是全0的矩阵。

MindSpore:

- 如果参数 `full_matrices` 为False,该接口返回缩减后的奇异值分解结果。

- 如果参数 `compute_uv` 为False,只有一个输出值 s。

- 如果参数 `compute_uv` 为True,有三个输出值,顺序是 s,u,v。

> 自PyTorch 1.8.0及以后的版本中,已经弃用了接口 `torch.svd()` ,推荐使用的替换接口是 `torch.linalg.svd()` ,该接口和 `mindspore.ops.svd` 有相同的传参 `full_matrices` 。

功能上无差异。

| 分类       | 子类         | PyTorch      | MindSpore      | 差异          |
| ---------- | ------------ | ------------ | ---------      | ------------- |
| 参数       | 参数 1       | input         | input         | 一致           |
|            | 参数 2       | some          | full_matrices | 若要返回缩减后的奇异值分解结果,MindSpore配置 `full_matrices` 为False,PyTorch配置 `some` 为True |
|            | 参数 3       | compute_uv    | compute_uv    | 如果参数 `compute_uv` 为False,MindSpore只有一个输出值 s,PyTorch有三个输出值 u,s,v,其中 u 和 v 的值是全0的矩阵。如果 `compute_uv` 为True,MindSpore的输出值的顺序是 s,u,v,PyTorch的输出值的顺序是 u,s,v。 |
|            | 参数 4       | out           | -             | 详见[通用差异参数表](https://www.mindspore.cn/docs/zh-CN/r2.4.10/note/api_mapping/pytorch_api_mapping.html#通用差异参数表) |

## 代码示例 1

> `compute_uv` 为False时,PyTorch有三个输出值。

```python
# PyTorch
import torch
input = torch.tensor([[1, 2], [-4, -5], [2, 1]], dtype=torch.float32)
u, s, v = torch.svd(input, some=False, compute_uv=False)
print(s)
# tensor([7.0653, 1.0401])
print(u)
# tensor([[0., 0., 0.],
#         [0., 0., 0.],
#         [0., 0., 0.]])
print(v)
# tensor([[0., 0.],
#         [0., 0.]])

# MindSpore目前无法支持该功能
```

## 代码示例 2

> `compute_uv` 为True的时候,输出值顺序不一致。
> 奇异值分解的输出不是唯一的。

```python
# PyTorch
import torch
input = torch.tensor([[1, 2], [-4, -5], [2, 1]], dtype=torch.float32)
u, s, v = torch.svd(input, some=False, compute_uv=True)
print(s)
# tensor([7.0653, 1.0401])
print(u)
# tensor([[-0.3082, -0.4882,  0.8165],
#         [ 0.9061,  0.1107,  0.4082],
#         [-0.2897,  0.8657,  0.4082]])
print(v)
# tensor([[-0.6386,  0.7695],
#         [-0.7695, -0.6386]])

# MindSpore
import mindspore as ms
input = ms.Tensor([[1, 2], [-4, -5], [2, 1]], ms.float32)
s, u, v = ms.ops.svd(input, full_matrices=True, compute_uv=True)
print(s)
# [7.0652843 1.040081 ]
print(u)
# [[ 0.30821905 -0.48819482  0.81649697]
#  [-0.90613353  0.11070572  0.40824813]
#  [ 0.2896955   0.8656849   0.4082479 ]]
print(v)
# [[ 0.63863593  0.769509  ]
#  [ 0.769509   -0.63863593]]
```