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.float32torch.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的操作和特性,能够有效地提高我们的深度学习算法实现能力。