1. tf.multiply
2. tf.matmul
3. tf.tensordot
1. tf.multiply
tf.multiply 等同与 * ,用于计算矩阵之间的 element-wise 乘法,要求矩阵的形状必须一致(或者是其中一个维度为1),否则会报错。
import tensorflow as tf
a = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12], shape=[2, 3, 2])
b = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3, 1])
c = a * b
d = tf.multiply(a, a)
2. tf.matmul
tf.matmul 是 tensor 的矩阵乘法,参与运算的两个tensor维度、数据类型必须一致。
a = tf.constant(list(range(1, 13)), shape=[3, 4])
b = tf.constant(list(range(1, 13)), shape=[4, 3])
c = tf.matmul(a, b)
3. tf.tensordot
tensordot:矩阵乘法运算,参与运算的两个tensor的维度可以不一样。
a 和 b 沿特定轴的张量收缩。
Tensordot (也称为张量收缩) 对从 a 和 b 所指定的索引 a_axes 和 b_axes 的元素的乘积进行求和。
列表 a_axes 和 b_axes 指定沿其收缩张量的那些轴对。
对于所有 range(0, len(a_axes)) 中的 i,a 的轴 a_axes[i] 必须与 b 的轴 b_axes[i] 具有相同的维度。
列表 a_axes 和 b_axes 必须具有相同的长度,并由唯一的整数组成,用于为每个张量指定有效的坐标轴。
该操作对应于 numpy.tensordot(a, b, axes)
示例1:当 a 和 b 是矩阵(2阶)时,axes = 1 相当于矩阵乘法;
示例2:当 a 和 b 是矩阵(2阶)时,axes = [[1], [0]] 相当于矩阵乘法;
函数参数:
• a:float32 或 float64 类型的 Tensor;
• b:Tensor,与 a 具有相同的类型;
• axes:可以是标量 N,也可以是具有形状 [2, k] 的 int32 Tensor 的列表。如果轴是标量,则按顺序对 a 的最后 N 个轴和 b 的前 N 个轴进行求和。
如果轴是一个列表或 Tensor,则分别对于轴 a 和 b,在第一和第二行包含该组唯一整数指定沿该收缩被计算。a 和 b 的坐标轴数必须相等;
• name:操作的名称(可选);
函数返回值:
函数返回与 a 具有相同类型的 Tensor;
可能引发的异常:
• ValueError:如果 a, b 和 axes 的形状是不相容的;
• IndexError:如果轴上的值超过相应张量的等级;
a = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24], shape=[2, 3, 4])
b = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], shape=[4, 3])
c = tf.tensordot(a, b, axes=1)
# 同 tf.matmul,普通矩阵相乘
# shape: [2, 3, 4] x [4, 3] = [2, 3, 3]
d = tf.tensordot(a, b, axes=2)
# 对a的后2个轴的数据进行Flatten,即a的shape变成 [2, 3X4] = [2, 12];
# 对b的前2个轴的数据进行Flatten,即b的shape变成[12]
# shape: [2, 12] x [12] = [2,]
e = tf.tensordot(a, b, axes=([1,2], [0,1]))
# 分别指定两个轴,此结果同 tf.tensordot(a, b, axes=2)
# 对a的后2个轴(索引1,2)的数据进行Flatten,即a的shape变成 [2, 3X4] = [2, 12];
# 对b的前2个轴(索引0,1)的数据进行Flatten,即b的shape变成[12],展开结果[1,2,3,4,5,6,7,8,9,10,11,12]
# shape: [2, 12] x [12] = [2,]
f = tf.tensordot(a, b, axes=([1,2], [1,0]))
# 分别指定两个轴
# 对a的后2个轴(索引1,2)的数据进行Flatten,即a的shape变成 [2, 3X4] = [2, 12];
# 对b的前2个轴(索引1,0)的数据进行Flatten,即b的shape变成[12],轴的顺序不同,展开方式不同,展开结果[1,4,7,10,2,5,8,11,3,6,9,12]
# shape: [2, 12] x [12] = [2,]
g = tf.tensordot(a, b, axes=([1], [1]))
# 指定任何轴,指定的轴形状一致
# shape: [2, 3, 4] x [4, 3] = [2, 4, 4] (消去(3,3))