您的位置:

Tensordot详解:从多个角度深入理解

一、tensordot概述

tensordot是一种numpy中的数学函数,它旨在实现高维张量的乘法操作。在实际深度学习的应用中,特别是卷积神经网络中,tensordot是一项核心技术,因此学习如何使用它是至关重要的。

tensordot最基本的使用形式为:np.tensordot(a, b, axes),其中a和b都是具有多个轴的张量。在这个基本形式中,tensordot将a和b中的轴进行匹配,然后对它们进行乘法操作,最终返回一个新的张量c。

import numpy as np

a = np.random.rand(3, 4, 5)
b = np.random.rand(4, 5, 6)

c = np.tensordot(a, b, axes=([1, 2], [0, 1]))
print(c.shape)  # 输出(3, 6)

在此示例中,我们定义了两个张量a和b,分别是shape为(3, 4, 5)和shape为(4, 5, 6)的张量。我们对a的最后两个维度(4和5)和b的第一二个维度(4和5)进行了匹配,然后执行了张量相乘,得到了一个新的张量c,它的shape为(3,6)。

二、理解tensordot的axes参数

tensordot的axes参数用于指定张量a和张量b的维度匹配方式。在基本形式中,它采用了默认值,即axes=2,它会从a和b中的最后两个维度开始匹配两个张量,并输出其他维度的乘积。实际上,axes接受一个元组(x,y),其中x和y都是张量的维度,表示我们要将a的第x个维度和b的第y个维度进行匹配。因此,当我们将axes设置为([1, 2], [0, 1])时,它将从a和b中的第1和第2个维度开始匹配,并输出其他维度的乘积。

下面通过一个更高级的例子,来进一步理解axes参数的作用。

import numpy as np

a = np.random.rand(3,4,5)
b = np.random.rand(4,5,6)

c = np.tensordot(a,b,axes=([1], [0]))
print(c.shape)  # 输出(3,6,6)

在此示例中,我们设置了axes=([1], [0]),这意味着我们要从a的第1个维度开始匹配,从b的第0个维度开始匹配。此时,a的第1个维度大小为4,b的第0个维度的大小也为4,因此,这种匹配方式是合法的。然后,我们执行[a[:,i,:] * b[i,:,:] for i in range(4)]操作,将这些张量相加,得到一个新的张量,它的shape为(3,6,6)。

三、tensordot的高级操作

在深度学习中,tensordot还有很多高级用法。

1. tensordot的broadcasting行为

tensordot类似于广播操作,它可以自动扩展输入张量的形状,以适应要执行的操作。因此,我们可以使用不同形状的张量来执行tensordot操作,根据axes参数的设置,可以自动调整张量的形状,以执行正确的操作。

import numpy as np

x = np.random.rand(2, 3)
y = np.random.rand(3, 4, 5)

z = np.tensordot(x, y, axes=(1, 0))
print(z.shape)  # 输出(2,4,5)

在本例中,我们定义了一个形状为(2,3)的张量x,和一个形状为(3,4,5)的张量y。我们设置axes=(1,0),这意味着通过将x的第1个维度与y的第0个维度相匹配并相乘来计算tensordot。x的第1个维度大小为3,与y的第0个维度的大小相同,因此它们能正确匹配。我们得到的新张量的形状是(2,4,5)。

2. tensordot的reshape操作

在某些情况下,我们需要将张量的维度进行重新排列,以使它们可以在tensordot操作中正确匹配。这个过程在numpy中的实现非常简单,我们可以使用reshape函数来轻松地重塑张量的形状。

import numpy as np

a = np.random.rand(3, 4, 5)
b = np.random.rand(4, 5, 6)

a = np.reshape(a, (3, 20))
b = np.reshape(b, (20, 6))

c = np.tensordot(a, b, axes=1)
print(c.shape)  # 输出(3,6)

在此示例中,我们定义了两个张量a和b,分别是形状为(3, 4, 5)和(4, 5, 6)的张量。然后,我们使用reshape函数将张量a和b的形状分别改变为(3,20)和(20,6),这使它们可以正确匹配,进行tensordot操作。我们得到的新张量的形状是(3,6)。

3. tensordot的内积实现

tensordot还可以用于计算内积。对于两个形状都为(N,)的张量,它们的内积可以通过tensordot来计算。

import numpy as np

x = np.random.rand(3)
y = np.random.rand(3)

ip = np.tensordot(x,y,axes=0)
print(ip)  # 输出单个实数

在此示例中,我们定义了两个为(3,)形张量x和y。我们将axes设置为0,这意味着我们要计算两个张量的内积,即[sum(x[i]*y[i])],得到的结果是一个单个的实数。

四、总结

tensordot是numpy中的一种高级操作,可用于计算张量的乘法。在深度学习中,tensordot是卷积神经网络的核心技术之一。通过本文,我们深入理解了numpy中tensordot的基本用法和高级用法。可以根据具体的需求来选择合适的axes参数,轻松实现高维张量的乘法操作。