将矩阵 a
乘以矩阵 b
,产生 a
* b
。
用法
tf.linalg.matmul(
a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False,
a_is_sparse=False, b_is_sparse=False, output_type=None, name=None
)
参数
-
a
tf.Tensor
类型为float16
,float32
,float64
,int32
,complex64
,complex128
且等级 > 1。 -
b
tf.Tensor
与a
具有相同的类型和等级。 -
transpose_a
如果True
,a
在乘法之前被转置。 -
transpose_b
如果True
,b
在乘法之前被转置。 -
adjoint_a
如果True
,a
在乘法之前被共轭和转置。 -
adjoint_b
如果True
,b
在乘法之前被共轭和转置。 -
a_is_sparse
如果True
,a
被视为稀疏矩阵。注意,这不支持tf.sparse.SparseTensor
, 它只是进行假设大多数值的优化a
为零。看tf.sparse.sparse_dense_matmul一些支持tf.sparse.SparseTensor乘法。 -
b_is_sparse
如果True
,b
被视为稀疏矩阵。注意,这不支持tf.sparse.SparseTensor
, 它只是进行假设大多数值的优化a
为零。看tf.sparse.sparse_dense_matmul一些支持tf.sparse.SparseTensor乘法。 -
output_type
如果需要,输出数据类型。默认为 None 在这种情况下 output_type 与输入类型相同。目前仅在输入张量为 (u)int8 类型且 output_type 可以为 int32 时有效。 -
name
操作的名称(可选)。
返回
-
A tf.Tensor同类型的
a
和b
其中每个inner-most矩阵是对应矩阵的乘积a
和b
,例如如果所有转置或伴随属性都是False
:output[..., i, j] = sum_k (a[..., i, k] * b[..., k, j])
,对于所有索引i
,j
。 -
Note
这是矩阵产品,而不是元素产品。
抛出
-
ValueError
如果transpose_a
和adjoint_a
,或transpose_b
和adjoint_b
都设置为True
。 -
TypeError
如果指定了output_type,但a
,b
和output_type
的类型不是(u)int8、(u)int8和int32。
在任何转置之后,输入必须是秩 >= 2 的张量,其中内部 2 维指定有效的矩阵乘法维度,任何进一步的外部维度指定匹配的批量大小。
两个矩阵必须属于同一类型。支持的类型是:bfloat16
, float16
, float32
, float64
, int32
, int64
, complex64
, complex128
。
通过将相应标志之一设置为 True
,可以即时转置或连接(共轭和转置)矩阵。默认情况下,这些是False
。
如果一个或两个矩阵包含很多零,则可以通过将相应的 a_is_sparse
或 b_is_sparse
标志设置为 True
来使用更有效的乘法算法。默认情况下,这些是False
。此优化仅适用于数据类型为 bfloat16
或 float32
的普通矩阵(rank-2 张量)。
一个简单的二维张量矩阵乘法:
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
a # 2-D tensor
<tf.Tensor:shape=(2, 3), dtype=int32, numpy=
array([[1, 2, 3],
[4, 5, 6]], dtype=int32)>
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2])
b # 2-D tensor
<tf.Tensor:shape=(3, 2), dtype=int32, numpy=
array([[ 7, 8],
[ 9, 10],
[11, 12]], dtype=int32)>
c = tf.matmul(a, b)
c # `a` * `b`
<tf.Tensor:shape=(2, 2), dtype=int32, numpy=
array([[ 58, 64],
[139, 154]], dtype=int32)>
具有批次形状的批次矩阵乘法 [2]:
a = tf.constant(np.arange(1, 13, dtype=np.int32), shape=[2, 2, 3])
a # 3-D tensor
<tf.Tensor:shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]], dtype=int32)>
b = tf.constant(np.arange(13, 25, dtype=np.int32), shape=[2, 3, 2])
b # 3-D tensor
<tf.Tensor:shape=(2, 3, 2), dtype=int32, numpy=
array([[[13, 14],
[15, 16],
[17, 18]],
[[19, 20],
[21, 22],
[23, 24]]], dtype=int32)>
c = tf.matmul(a, b)
c # `a` * `b`
<tf.Tensor:shape=(2, 2, 2), dtype=int32, numpy=
array([[[ 94, 100],
[229, 244]],
[[508, 532],
[697, 730]]], dtype=int32)>
由于 python >= 3.5,支持 @ 运算符(参见 PEP 465)。在 TensorFlow 中,它只是调用 tf.matmul() 函数,因此以下几行是等价的:
d = a @ b @ [[10], [11]]
d = tf.matmul(tf.matmul(a, b), [[10], [11]])
相关用法
- Python tf.linalg.matvec用法及代码示例
- Python tf.linalg.matrix_transpose用法及代码示例
- Python tf.linalg.LinearOperatorFullMatrix.matvec用法及代码示例
- Python tf.linalg.LinearOperatorToeplitz.solve用法及代码示例
- Python tf.linalg.LinearOperatorIdentity.solvevec用法及代码示例
- Python tf.linalg.LinearOperatorPermutation.solve用法及代码示例
- Python tf.linalg.band_part用法及代码示例
- Python tf.linalg.LinearOperatorKronecker.diag_part用法及代码示例
- Python tf.linalg.lu_matrix_inverse用法及代码示例
- Python tf.linalg.LinearOperatorToeplitz.matvec用法及代码示例
- Python tf.linalg.LinearOperatorBlockLowerTriangular.solvevec用法及代码示例
- Python tf.linalg.LinearOperatorLowerTriangular.matvec用法及代码示例
- Python tf.linalg.LinearOperatorCirculant2D.solve用法及代码示例
- Python tf.linalg.LinearOperatorCirculant3D.diag_part用法及代码示例
- Python tf.linalg.LinearOperatorToeplitz.solvevec用法及代码示例
- Python tf.linalg.LinearOperatorCirculant2D.assert_non_singular用法及代码示例
- Python tf.linalg.LinearOperatorPermutation.diag_part用法及代码示例
- Python tf.linalg.LinearOperatorToeplitz用法及代码示例
- Python tf.linalg.LinearOperatorCirculant2D.matvec用法及代码示例
- Python tf.linalg.LinearOperatorTridiag.solvevec用法及代码示例
注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.linalg.matmul。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。