# tensorflow和numpy库中tensordot详解

### tensordot函数的理解

tf.tensordot(
a,
b,
axes,
name=None
)
'''

axes:可以取值为整数N,代表的是a的倒数N个维度和b的正数N个维度相乘求和。



axes =0

## 一维变量的计算

x=np.array([1,2,3])
y=np.array([4,5,6])
z1=np.tensordot(x,y,axes=0)
print(z1)
// 输出结果为：
[[ 4  5  6]
[ 8 10 12]
[12 15 18]]


[En]

How did you get this result? Let’s take a look at the explanation of the official document:

[En]

It sounds very roundabout. We might as well try it for ourselves and see what’s going on.

integer_like If an int N, sum over the last N axes of a and the first N axes of b in order.

The sizes of the corresponding axes must match.

When axes is integer_like, the sequence for evaluation will be: first the -Nth axis in a and 0th axis in b, and the -1th axis in a and Nth axis in b last

## 二维变量的计算

x的倒数第0个轴代表的元素依旧是1个标量x(i,j),而y的第0个轴：其实是沿着行方向的。

x=np.array([[1,2,3],[4,5,6]])
y=np.array([[4,5,6],[7,8,9]])
z3=np.tensordot(x,y,axes=0)
print(z3)
print(z3.shape) (2,3,2,3)
// 输出结果为：
[[[[ 4  5  6]
[ 7  8  9]]

[[ 8 10 12]
[14 16 18]]

[[12 15 18]
[21 24 27]]]

[[[16 20 24]
[28 32 36]]

[[20 25 30]
[35 40 45]]

[[24 30 36]
[42 48 54]]]]


axes=1

## 一维向量的计算

x=np.array([1,2,3])
y=np.array([4,5,6])
z3=np.tensordot(x,y,axes=1)
print(z3)
//z3=32



## 二维向量的计算

x是一个二维变量：故它的倒数第1个轴就是沿着列方向的轴，对应的向量分别为( 1 , 2 , 3 ) , ( 4 , 5 , 6 ) (1,2,3),(4,5,6)(1 ,2 ,3 ),(4 ,5 ,6 ),而y的第0个轴就是沿着行方向的轴，对应的向量分别为( 4 , 7 ) , ( 5 , 8 ) , ( 6 , 9 ) (4,7),(5, 8),(6,9)(4 ,7 ),(5 ,8 ),(6 ,9 )。由于两个向量的长度一个是3，一个2，无法进行 对应元素相乘再sum的操作，故运行以下程序会报错。

x=np.array([[1,2,3],[4,5,6]])
print(x.shape)
y=np.array([[4,5,6],[7,8,9]])
print(y.shape)
z3=np.tensordot(x,y,axes=1)
print(z3.shape)
//ValueError: shape-mismatch for sum


x=np.array([[1,2,3],[4,5,6]])
print(x.shape)
y=np.array([[4,5,6],[7,8,9]])
print(y.shape)
z3=np.tensordot(x,y.transpose(),axes=1)
print(z3)
//z3=[[ 32  50]
[ 77 122]]


[En]

The calculation method is similar to that of a matrix: the corresponding elements are multiplied and then added.

1 ∗ 4 + 2 ∗ 5 + 3 ∗ 6 = 4 + 10 + 18 = 32 14+25+36=4+10+18=32 1 ∗4 +2 ∗5 +3 ∗6 =4 +1 0 +1 8 =3 2 1 ∗ 7 + 2 ∗ 8 + 3 ∗ 9 = 7 + 16 + 27 = 50 17+28+39=7+16+27=50 1 ∗7 +2 ∗8 +3 ∗9 =7 +1 6 +2 7 =5 0

## 三维向量的计算

x=np.array([[4,7],[5,8],[6,9]])  //(3,2)
y=np.array([[[1,2,3],[4,5,6]],[[4,5,6],[7,8,9]]]) //(2,2,3)
z3=np.tensordot(x,y,axes=1)
print(z3.shape) // (3,2,3)
print(z3)
//
[[[ 32  43  54]
[ 65  76  87]]

[[ 37  50  63]
[ 76  89 102]]

[[ 42  57  72]
[ 87 102 117]]]


axes=2

## 二维向量的计算

x=np.array([1,2,3])
y=np.array([4,5,6])
z1=np.tensordot(x,y,axes=2)
print(z1)
//tuple index out of range


x=np.array([[1,2,3],[4,5,6]])
print(x.shape)
y=np.array([[4,5,6],[7,8,9]])
print(y.shape)
z3=np.tensordot(x,y,axes=2)
print(z3)
// z3=154


[En]

The above calculation method is equivalent to the following figure: after flattening, the corresponding elements are multiplied and then added, and the code is as follows

x_1 = x.flatten() //x_1=[1,2,3,4,5,6]
y_1 = y.flatten() //y_1 =[4,5,6,7,8,9]
print(sum(x_1 *y_1)) //两个对应的元素相乘再相加。


## 三维向量的计算

[En]

After the two-dimensional vector is flattened, it becomes (4, 7, 5, 8, 6, 9).

[En]

As can be seen from the picture, the flattened vector can not be used for matrix operation.

x=np.array([[4,7],[5,8],[6,9]])  //(3,2)
y=np.array([[[1,2,3],[4,5,6]],[[4,5,6],[7,8,9]]]) //(2,2,3)
z3=np.tensordot(x,y.transpose(),axes=2)
print(z3)//ValueError: shape-mismatch for sum


x展平之后的大小为(6,)

y=y.transpose() //转置之后y的shape为(3,2,2)
y_flatten =y.reshape(6,2)
print(y)
[[[1 4]
[4 7]]

[[2 5]
[5 8]]

[[3 6]
[6 9]]]

print(y_)
[[1 4]
[4 7]
[2 5]
[5 8]
[3 6]
[6 9]]

z3=np.tensordot(x,y,axes=2)
print(z3)
[154 271]


axes取值为列表或者元组的形式

x=np.array([1,2,3])
y=np.array([4,5,6])
z1=np.tensordot(x,y,axes=[0,0]) //等价于axes=1
print(z1)
//结果仍然时32


x=np.array([[1,2,3],[4,5,6]])
print(x.shape) (2*3)
y=np.array([[4,5,6],[7,8,9]])
print(y.shape) (2*3)
z3=np.tensordot(x,y,axes=[0,0]) //等价于axes=1。
print(z3.shape)
[[32 37 42]
[43 50 57]
[54 63 72]]
z4=np.tensordot(x,y,axes=[1,1])
print(z4)
[[ 32  50]
[ 77 122]]


z3_=np.tensordot(x,y.transpose(),axes=[0,1])
z4=np.tensordot(x.transpose(),y,axes=[0,1])



[En]

Multi-dimensional tensor and the method of list representation

[En]

How is the dimension size calculated here?

x = np.array([[[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[3, 4, 5, 6, 7]],
[[4, 5, 6, 7, 8],
[5, 6, 7, 8, 9],
[6, 7, 8, 9, 1]]])
y = np.array([[[2, 3, 4, 5, 6],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 8]],
[[4, 5, 6, 7, 9],
[5, 6, 7, 8, 1],
[6, 7, 8, 9, 2]]])
z=np.tensordot(x,y, axes = ([2,1,0],[2,1,0])
print(z)
// z=895
//等价于
x1=x.flatten()
x2=y.flatten()
print(sum(x1*x2))


z=np.tensordot(x,y, axes = ([0],[0])).shape
print(z)
z=(3,5,3,5)


x3=np.arange(48).reshape(2,4,3,2,1)
x4=np.arange(32).reshape(2,2,4,2)
y=np.tensordot(x3,x4,axes=([1,3],[2,1]))
print(y.shape)
// y的大小为（2，3，1，2，2）


x=np.array([0,1,2,1,3,4,5,2,3,4,5,0]).reshape(2,1,3,2)
y=np.array([1,3,2,3,1,2]).reshape(3,2,1)
z=np.tensordot(x,y,axes=2)
[[[21]]

[[34]]]


(1).首先判断最后得到的z的形状大小为：（2，1，1）
(1).分别展平x的后两个维度和y的前两个维度
(3).展平之后再进行内积的运算

x1=x.reshape(2,1,6)
y1=y.reshape(6,1)
print(x1)
[[[0 1 2 1 3 4]]

[[5 2 3 4 5 0]]]

print(y1)
[[1]
[3]
[2]
[3]
[1]
[2]]
print(np.dot(x1,y1))
[[[21]]

[[34]]]


tensorflow.tensordot和numpy.tensordot中的不同

// tf的版本是tensorflow 2.4.0
import tensorflow as tf
import os
os.environ["CUDA_VISIBLE_DEVICES"]="0"
tf.compat.v1.disable_eager_execution()
config=tf.compat.v1.ConfigProto(allow_soft_placement=True)
config.gpu_options.per_process_gpu_memory_fraction = 0.8
sess=tf.compat.v1.Session(config=config)
x = tf.constant([0,1,2,1,3,4,5,2,3,4,5,0],shape=[2,1,3,2])
y =tf.constant([1,3,2,3,1,2],shape=[2,3,1])
z = tf.tensordot(x,y,axes=2)
z=[[21]
[34]]


Original: https://blog.csdn.net/tjh1998/article/details/123563159
Author: tjh1998
Title: tensorflow和numpy库中tensordot详解

(0)

### 大家都在看

• #### 图像质量评估(9) — 杂散光（炫光，Flare，Glare）

当环境中存在强光源时（比如太阳或大功率灯光），强光源的光线到达镜头的时候，发生反射，反射光线到达不同的镜头部件、光圈或传感器上，会在图像中产生出光斑或光晕等非预期的图案，造成图像质…

人工智能 2023年6月20日
0164
• #### 5.12语义网络表示法

啊哦~你想找的内容离你而去了哦 内容不存在，可能为如下原因导致： ① 内容还在审核中 ② 内容以前存在，但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

人工智能 2023年6月1日
0153
• #### Bert原理详解

Bert模型 Bert全称Bidrectional Encoder Representation fromTransformers，即双向Transformer的Encoder，因…

人工智能 2023年5月30日
0137
• #### dataframe 上下拼接_Pandas中DataFrame数据合并、连接（concat、merge、join）之join

Join columns with other DataFrame either on index or on a key column. Efficiently Join mul…

人工智能 2023年7月8日
0188
• #### 【已解决】安装opencv过程中sudo apt-get install libgtk2.0-dev -y安装失败解决

错误: ~ \$ sudo apt-get install libgtk2.0-dev -yReading package lists… DoneBuilding dep…

人工智能 2023年7月19日
0210
• #### 基于Python的网络爬虫开发与实现

目录1 绪论 11.1选题背景 11.1.1课题的国内外的研究现状 11.1.2课题研究的必要性 21.2课题研究的内容 22 开发软件平台介绍 42.1 软件开发平台 42.2 …

人工智能 2023年7月17日
0136
• #### 实用新型专利申请书——一种基于蓝牙定位的地摊打卡装置

本实用新型具体公开了一种基于蓝牙定位的地摊打卡装置，包括壳体，所述壳体内部设置有中央控制处理模块、蓝牙定位模块、电源模块、低电压报警模块和RFID读卡器，所述壳体内部还设置有多个容…

人工智能 2023年5月25日
0203
• #### 从特征融合的视角设计图神经网络的拓扑结构

©作者 |卫岚宁，赵欢，贺志强 论文标题： Designing the Topology of Graph Neural Networks: A Novel Feature Fus…

人工智能 2023年7月14日
0130
• #### 深入理解PSNR（峰值信噪比）(附matlab代码)

深入理解PSNR 作者：老李日期：2022-1-19 本文引入MSE、SNR、变异系数（Coefficient of Variation），并希望从统计学的角度上解释这个变量 这个…

人工智能 2023年6月16日
0202
• #### Anaconda下安装tensorflow深度学习框架安装教程

conda 下创建新环境：conda create -n (name )tensorflow(这个是环境名，可任意取) python=3.7.0 进入环境：activate ten…

人工智能 2023年5月25日
0138
• #### YOLO v2详细解读

啊哦~你想找的内容离你而去了哦 内容不存在，可能为如下原因导致： ① 内容还在审核中 ② 内容以前存在，但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

人工智能 2023年6月16日
0140
• #### Windows环境下tensorflow报错“Could not load library cudnn_cnn_infer64_8.dll. Error code 126”的解决方案

问题描述 Windows环境下tensorflow的报错信息为： Could not load library cudnn_cnn_infer64_8.dll. Error cod…

人工智能 2023年5月23日
0139

目 录 1 GoogLeNet网络 1.1 网络结构及参数 1.2 Inception结构 1.3 带降维功能的Inception结构 1.4 辅助分类器 2 利用Pytorch实…

人工智能 2023年7月22日
0111
• #### 基于移动边缘计算机对智慧商超的解决方案

随着国家城市化进程的加快，中小型超市/便利店成为了城市住宅小区、商业园区的基础配套设施，全国目前数量在500万家以上。超市人流量较大、人员复杂，管理起来较为困难，易发生盗窃、抢劫、…

人工智能 2023年6月4日
0131
• #### windows下载安装启动nexus

参考：https://blog.csdn.net/lovelife000/article/details/125880764https://blog.csdn.net/qq_362…

人工智能 2023年6月29日
0161
• #### 微软自动调参工具 NNI 使用事例教程

第一步：安装 nni的安装通过pip命令就可以安装了。并且提供了example供参考学习。 系统配置要求：tensorflow，python >= 3.5 python3 -…

人工智能 2023年7月1日
0183