TensorFlow 中矩阵奇异值分解(Singular Value Decomposition,SVD) tf.linalg.svd 使用实例

本文详细介绍了在TensorFlow r1.14环境下使用SVD(奇异值分解)的方法,包括参数解析、返回值说明及代码实例。展示了如何通过tf.linalg.svd函数进行矩阵分解,并解释了如何设置full_matrices和compute_uv参数来控制计算过程。
部署运行你感兴趣的模型镜像

一、环境

TensorFlow API r1.14

CUDA 9.0 V9.0.176

Python 3.7.3

二、官方说明

一个或多个矩阵的奇异值分解

https://tensorflow.google.cn/api_docs/python/tf/linalg/svd

tf.linalg.svd(
    tensor,
    full_matrices=False,
    compute_uv=True,
    name=None
)

参数:
tensor:形状为 […, M, N] 的张量。设 P 为 M 和 N 的最小值
full_matrices:布尔型参数,True 表示计算全尺寸的 u 和 v;默认为 False 表示仅计算前导 P 个奇异向量。如果 compute_uv 是 False,则忽略。
compute_uv:布尔型参数,默认为 True 表示计算左、右奇异向量并分别返回到 u、v 中,False 表示计算奇异值,会大幅度提高速度。
name:字符型参数,可选参数,设置操作的名称。

返回:
s:奇异值,形状为 […, P],数值会倒序排列,所以 s[…, 0] 是最大值,s[…, 1] 是次大值。
u:左奇异向量,如果参数 full_matrix 为默认值 False,则 u 的形状为 […, M, P];如果参数 full_matrix 为True,则 u 的形状为 […, M, M]。如果 compute_uv 为 False,则不返回 u 值;
v:右奇异向量,如果参数 full_matrix 为默认值 True,则 v 的形状为 […, N, P]。如果参数 full_matrix 为True,则 u 的形状为 […, N, N]。如果 compute_uv 为 False,则不返回 v 值;

三、实例

>>> matrix = tf.constant([1,2,3,4,5,6,7,8,9], shape=[3,3])
>>> matrix_float = tf.dtypes.cast(matrix, tf.float32) # 将矩阵的类型转换为 tensorflow 支持的 float32 形式,否则会报错
>>> s, u, v = tf.linalg.svd(matrix_float)
>>> s
<tf.Tensor: id=7, shape=(3,), dtype=float32, numpy=array([1.6848103e+01, 1.0683696e+00, 2.8763120e-07], dtype=float32)>
>>> u
<tf.Tensor: id=8, shape=(3, 3), dtype=float32, numpy=
array([[ 0.21483716,  0.8872305 , -0.40824857],
       [ 0.5205872 ,  0.24964423,  0.8164965 ],
       [ 0.8263376 , -0.3879429 , -0.4082481 ]], dtype=float32)>
>>> v
<tf.Tensor: id=9, shape=(3, 3), dtype=float32, numpy=
array([[ 0.47967106, -0.77669096,  0.40824836],
       [ 0.5723676 , -0.07568647, -0.81649655],
       [ 0.6650643 ,  0.62531805,  0.40824822]], dtype=float32)>

需要注意的是必须将矩阵的数据类型设为浮点类型,否则会报错:

>>> s, u, v = tf.linalg.svd(matrix)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/******/Anaconda/anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/linalg_ops.py", line 418, in svd
    tensor, compute_uv=compute_uv, full_matrices=full_matrices, name=name)
  File "/******/Anaconda/anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/gen_linalg_ops.py", line 2265, in svd
    _six.raise_from(_core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InternalError: Could not find valid device for node.
Node: {{node Svd}}
All kernels registered for op Svd :
  device='CPU'; T in [DT_COMPLEX128]
  device='CPU'; T in [DT_COMPLEX64]
  device='CPU'; T in [DT_DOUBLE]
  device='CPU'; T in [DT_FLOAT]
 [Op:Svd]

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### PyTorch 中 `torch.linalg.svd` 和 `torch.svd` 的区别 #### 定义与功能 PyTorch 提供了两种实现奇异值分解SVD, Singular Value Decomposition)的方法:`torch.linalg.svd` 和 `torch.svd`。两者都用于计算矩阵SVD,但它们的设计目标和行为存在显著差异。 - **`torch.svd`**: 这是一个较早引入的功能,在旧版本的 PyTorch 中被广泛使用。它主要用于数值线性代数操作中的基本需求[^1]。然而,它的接口设计较为简单,缺乏一些现代优化特性。 - **`torch.linalg.svd`**: 作为更现代化的替代方案,`torch.linalg.svd` 是基于 `torch.linalg` 模块的一部分,该模块旨在提供更加一致、稳定以及符合 NumPy 风格 API 的函数集合。此方法提供了更高的灵活性和更好的性能支持。 #### 参数与返回值 两者的参数设置略有不同: - 对于 `torch.svd(input, some=True, compute_uv=True)`: - 输入张量应为二维浮点型数据。 - 可选参数 `some` 控制是否只计算部分奇异向量,默认为 True 表示仅当输入方阵时才有效果;对于非方形矩阵,则总是执行完整的 U 或 V 计算。 - 如果设定了 `compute_uv=False`, 则只会得到奇异值而不会给出左/右奇异向量. - 而在调用 `torch.linalg.svd(A, full_matrices=True, *, out=None)` 时候, - 默认情况下会生成全尺寸的U,V^H(即V转置后的共轭),除非指定 `full_matrices=False`. - 支持通过关键字参数传递额外选项给底层库以调整精度或者硬件加速等配置项. #### 性能表现 由于 `torch.linalg.svd` 更新并集成了最新的算法改进和技术进步,因此通常能够带来更快的速度和更低内存消耗的表现,特别是在处理大规模稀疏矩阵或是利用 GPU 加速运算的时候. 另外需要注意的是错误管理方面也有提升;例如上述提到 cusolver 错误可能发生在早期版本或其他特定条件下使用老式的 svd 函数上而不是新的 linalg 版本里. #### 使用建议 鉴于以上分析可以得出结论如下: - 当项目依赖最新特性和最佳实践时推荐选用 `torch.linalg.svd`; - 若兼容性考虑需维持原有代码结构不变则继续沿用 `torch.svd`. ```python import torch A = torch.randn(9, 6) # Using torch.svd U_svd, S_svd, Vh_svd = torch.svd(A) # Using torch.linalg.svd with reduced matrices U_linalg, S_linalg, Vh_linalg = torch.linalg.svd(A, full_matrices=False) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn-WJW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值