详解Pytorch中的tensor数据结构

1. Pytorch中的tensor数据结构概述

Tensor是Pytorch最基本、最重要的数据结构,是多维数组。它类似于Numpy的ndarray,但比它更灵活、更快。Pytorch中的Tensor没有维数的限制,可以是1、2、3、4、5或更多维的数组。Tensor不仅支持数学运算、逻辑运算、位运算等常见操作,还支持GPU加速、自动求导等高级功能,是实现深度学习算法的基础。

1.1 Tensor的创建

我们可以使用Python的列表、元组、Numpy的ndarray等Python的数据结构来创建Tensor。以下是几种创建方式:

使用Python列表创建Tensor

import torch

lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

t = torch.tensor(lst)

print(t)

输出结果:

tensor([[1, 2, 3],

[4, 5, 6],

[7, 8, 9]])

使用Numpy ndarray创建Tensor

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

t = torch.from_numpy(arr)

print(t)

输出结果:

tensor([[1, 2, 3],

[4, 5, 6],

[7, 8, 9]])

1.2 Tensor的数据类型

Tensor有多种数据类型,可以通过Tensor的dtype属性查看或修改Tensor的数据类型。以下是Tensor数据类型的一些示例:

float32:浮点数(32位)

float64:浮点数(64位)

int8:整数(8位)

int16:整数(16位)

int32:整数(32位)

int64:整数(64位)

bool:布尔值

以下是一些使用Tensor时经常用到的数据类型:

torch.float:等价于torch.float32

torch.double:等价于torch.float64

torch.int:等价于torch.int32

torch.long:等价于torch.int64

torch.bool:等价于torch.uint8

以下是如何修改Tensor的数据类型的示例:

t = torch.tensor([1, 2, 3], dtype=torch.float)

print(t.dtype)

t = t.type(torch.int)

print(t.dtype)

输出结果:

torch.float32

torch.int32

1.3 Tensor的维度操作

Pytorch中可以通过Tensor的view()方法来改变Tensor的维度,不过要保证Tensor的元素数量不变。我们还可以使用Tensor的transpose()方法和permute()方法来交换Tensor的维度。

使用view()方法改变Tensor的维度

t = torch.tensor([[1, 2, 3], [4, 5, 6]])

t = t.view(3, 2)

print(t)

输出结果:

tensor([[1, 2],

[3, 4],

[5, 6]])

使用transpose()方法交换Tensor的维度

t = torch.tensor([[1, 2, 3], [4, 5, 6]])

t = t.transpose(0, 1)

print(t)

输出结果:

tensor([[1, 4],

[2, 5],

[3, 6]])

使用permute()方法交换Tensor的维度

t = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

t = t.permute(1, 2, 0)

print(t)

输出结果:

tensor([[[1, 5],

[2, 6]],

[[3, 7],

[4, 8]]])

2. Tensor的常见操作

2.1 Tensor的数学运算

Pytorch中可以通过Tensor的加、减、乘、除等方法来进行数学运算,也可以通过torch中的函数来进行计算。以下是几种常见运算的示例:

加法

t1 = torch.tensor([[1, 2], [3, 4]])

t2 = torch.tensor([[5, 6], [7, 8]])

t3 = t1 + t2

print(t3)

t3 = torch.add(t1, t2)

print(t3)

输出结果:

tensor([[ 6,  8],

[10, 12]])

tensor([[ 6, 8],

[10, 12]])

点乘

t1 = torch.tensor([[1, 2], [3, 4]])

t2 = torch.tensor([[5, 6], [7, 8]])

t3 = t1 * t2

print(t3)

t3 = torch.mul(t1, t2)

print(t3)

输出结果:

tensor([[ 5, 12],

[21, 32]])

tensor([[ 5, 12],

[21, 32]])

矩阵乘法

t1 = torch.tensor([[1, 2], [3, 4]])

t2 = torch.tensor([[5, 6], [7, 8]])

t3 = t1 @ t2

print(t3)

t3 = torch.matmul(t1, t2)

print(t3)

输出结果:

tensor([[19, 22],

[43, 50]])

tensor([[19, 22],

[43, 50]])

2.2 Tensor的逻辑运算、位运算和数学函数

除了加、减、乘、除等数学运算,Tensor还支持逻辑运算、位运算和数学函数等操作。以下是一些常见操作的示例:

比较运算

t1 = torch.tensor([1, 2, 3])

t2 = torch.tensor([2, 2, 2])

t3 = t1 >= t2

print(t3)

t3 = torch.ge(t1, t2)

print(t3)

输出结果:

tensor([False, False,  True])

tensor([False, False, True])

逻辑运算

t1 = torch.tensor([True, False, True, False])

t2 = torch.tensor([True, True, False, False])

t3 = t1 & t2

print(t3)

t3 = torch.logical_and(t1, t2)

print(t3)

输出结果:

tensor([ True, False, False, False])

tensor([ True, False, False, False])

位运算

t1 = torch.tensor([1, 2, 3])

t2 = torch.tensor([2, 2, 2])

t3 = t1 & t2

print(t3)

t3 = torch.bitwise_and(t1, t2)

print(t3)

输出结果:

tensor([0, 2, 2])

tensor([0, 2, 2])

数学函数

t = torch.tensor([1.0, 2.0, 3.0])

t = torch.exp(t)

print(t)

t = torch.log(t)

print(t)

t = torch.sin(t)

print(t)

t = torch.cos(t)

print(t)

t = torch.tan(t)

print(t)

输出结果:

tensor([ 2.7183,  7.3891, 20.0855])

tensor([1.0000, 2.0000, 3.0000])

tensor([ 0.8415, 0.9093, -0.7568])

tensor([ 0.5403, -0.4161, -0.6536])

tensor([ 1.5574, -2.1850, 1.1578])

2.3 Tensor的剪切、拼接和分割

我们可以使用Tensor的类似于Python中切片的方式来对Tensor进行剪切操作,也可以使用Tensor的cat()方法和stack()方法来对多个Tensor进行拼接,还可以使用Tensor的split()方法和chunk()方法将一个Tensor分成多个小的Tensor。

剪切操作

t = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

t1 = t[1:, :]

print(t1)

t2 = torch.narrow(t, 1, 1, 2)

print(t2)

输出结果:

tensor([[4, 5, 6],

[7, 8, 9]])

tensor([[2, 3],

[5, 6],

[8, 9]])

拼接操作

t1 = torch.tensor([[1, 2], [3, 4]])

t2 = torch.tensor([[5, 6], [7, 8]])

t3 = torch.cat((t1, t2), 0)

print(t3)

t3 = torch.stack((t1, t2), 0)

print(t3)

输出结果:

tensor([[1, 2],

[3, 4],

[5, 6],

[7, 8]])

tensor([[[1, 2],

[3, 4]],

[[5, 6],

[7, 8]]])

分割操作

t = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

t1, t2 = torch.split(t, 2, 0)

print(t1)

print(t2)

t1, t2 = torch.chunk(t, 2, 0)

print(t1)

print(t2)

输出结果:

tensor([[1, 2, 3],

[4, 5, 6]])

tensor([[7, 8, 9]])

tensor([[1, 2, 3],

[4, 5, 6]])

tensor([[7, 8, 9]])

3. Tensor的GPU加速和自动求导

3.1 Tensor的GPU加速

Pytorch中支持使用GPU来对Tensor进行加速计算,只需要将Tensor转换为cuda数据类型即可。以下是在GPU上进行Tensor加法计算的示例:

if torch.cuda.is_available():

device = torch.device("cuda")

else:

device = torch.device("cpu")

t1 = torch.tensor([1, 2, 3], device=device)

t2 = torch.tensor([2, 3, 4], device=device)

t3 = t1 + t2

print(t3.cpu())

3.2 Tensor的自动求导

Tensor支持自动求导,这意味着在进行深度学习算法时我们不需要手动计算梯度,而是只需要定义好模型并调用backward()方法进行反向传播即可。以下是一个简单的自动求导计算的示例:

x = torch.tensor(3.0, requires_grad=True)

y = x * 2 + 1

z = y ** 2 + 2 * y + 1

z.backward()

print(x.grad)

输出结果:

tensor(28.)

总结

在本文中,我们详细介绍了Pytorch中的Tensor数据结构,并演示了Tensor的创建、数据类型、维度操作、常见操作、GPU加速和自动求导等高级功能。Tensor是深度学习算法的基石,深入理解Tensor的操作和特性,能够有效地提高我们的深度学习算法实现能力。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签