tensorflow中多维tensor运算(tf.multiply, tf.matmul, tf.tensordot)

1. tf.multiply

2. tf.matmul

3. tf.tensordot

1. tf.multiply

tf.multiply 等同与 * ,用于计算矩阵之间的 element-wise 乘法,要求矩阵的形状必须一致(或者是其中一个维度为1),否则会报错。

1
2
3
4
5
6
7
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维度、数据类型必须一致。

1
2
3
4
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:如果轴上的值超过相应张量的等级;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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))