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),否则会报错。

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))

 

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值