PyTorch torch张量

2025-06-25 13:56 更新

一、张量基础概念

在深度学习领域,张量是一个核心概念。PyTorch 是一个功能强大的开源深度学习框架,它提供了灵活的张量操作,使得它在科研和工业应用中都备受青睐。张量本质上是一个多维数组,你可以将它理解为一个包含单个数据类型元素的多维矩阵。

PyTorch 的张量具有多种数据类型,包括 32 位浮点型 (torch.float32torch.float)、64 位浮点型 (torch.float64torch.double)、16 位浮点型 (torch.float16torch.half)、8 位无符号整型 (torch.uint8)、8 位有符号整型 (torch.int8)、16 位有符号整型 (torch.int16torch.short)、32 位有符号整型 (torch.int32torch.int)、64 位有符号整型 (torch.int64torch.long) 以及布尔型 (torch.bool),同时支持 CPU 和 GPU 加速。

torch.Tensor 是默认张量类型的别名,它为 PyTorch 中的张量操作提供了便捷的接口。通过这个接口,我们可以轻松地创建、操作和转换张量,以满足各种深度学习任务的需求。

二、创建张量

(一)从 Python 列表或 NumPy 数组构造张量

可以使用 torch.tensor() 构造函数从 Python list 或序列构造张量:

import torch


## 从 Python 列表构造张量
x = torch.tensor([[1., -1.], [1., -1.]])
print(x)
## 输出:
## tensor([[ 1.0000, -1.0000],
##         [ 1.0000, -1.0000]])


## 从 NumPy 数组构造张量
import numpy as np
x = torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]))
print(x)
## 输出:
## tensor([[ 1,  2,  3],
##         [ 4,  5,  6]])

(二)构造特定数据类型的张量

可以通过将 torch.dtype 和/或 torch.device 传递给构造函数或张量创建操作来构造特定数据类型的张量:

## 构造一个 2x4 的张量,数据类型为 32 位整数
x = torch.zeros([2, 4], dtype=torch.int32)
print(x)
## 输出:
## tensor([[ 0,  0,  0,  0],
##         [ 0,  0,  0,  0]], dtype=torch.int32)


## 构造一个 2x4 的张量,数据类型为 64 位浮点型,设备为 GPU
device = torch.device('cuda:0') if torch.cuda.is_available() else torch.device('cpu')
x = torch.ones([2, 4], dtype=torch.float64, device=device)
print(x)
## 输出:
## tensor([[ 1.0000,  1.0000,  1.0000,  1.0000],
##         [ 1.0000,  1.0000,  1.0000,  1.0000]], dtype=torch.float64, device='cuda:0')

三、张量操作

(一)索引和切片

张量的内容可以使用 Python 的索引和切片符号来访问和修改:

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


## 访问张量元素
print(x[1][2])  # 输出:6


## 修改张量元素
x[0][1] = 8
print(x)
## 输出:
## tensor([[ 1,  8,  3],
##         [ 4,  5,  6]])

(二)获取单个值

可以使用 torch.Tensor.item() 从张量中获取包含单个值的 Python 数字:

x = torch.tensor([[1]])
print(x.item())  # 输出:1


x = torch.tensor(2.5)
print(x.item())  # 输出:2.5

(三)自动微分

PyTorch 提供了强大的自动微分功能,可以通过设置 requires_grad=True 创建一个张量,以便 torch.autograd 对其进行记录操作以进行自动微分:

x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
out = x.pow(2).sum()
out.backward()
print(x.grad)
## 输出:
## tensor([[ 2.0000, -2.0000],
##         [ 2.0000,  2.0000]])

四、张量属性

(一)数据类型

torch.dtype 定义了张量中元素的数据类型。可以通过 dtype 属性获取张量的数据类型:

x = torch.tensor([1.0])
print(x.dtype)  # 输出:torch.float32

(二)设备

torch.device 指定了张量所在的计算设备(CPU 或 GPU)。可以通过 device 属性获取张量的设备信息:

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
x = torch.tensor([1.0], device=device)
print(x.device)  # 输出:cuda:0 或 cpu

(三)形状

torch.Size 表示张量的形状。可以通过 shape 属性获取张量的形状:

x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(x.shape)  # 输出:torch.Size([2, 3])

五、张量转换

(一)改变数据类型

可以使用 to() 方法改变张量的数据类型:

x = torch.tensor([1.0])
x = x.to(torch.int32)
print(x)  # 输出:tensor([1], dtype=torch.int32)

(二)改变设备

可以使用 to() 方法将张量从 CPU 移动到 GPU 或反之:

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
x = torch.tensor([1.0])
x = x.to(device)
print(x)  # 输出:tensor([1.0], device='cuda:0') 或 tensor([1.0])

六、实际案例

假设我们正在使用 PyTorch 构建一个简单的神经网络,用于对编程狮平台上的用户行为数据进行分类。我们需要对输入数据进行预处理,包括将数据转换为张量并进行归一化。以下是具体的代码示例:

import torch
import numpy as np


## 假设我们有用户行为数据
user_data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=np.float32)


## 将 NumPy 数组转换为 PyTorch 张量
tensor_data = torch.tensor(user_data)


## 对张量进行归一化
mean = tensor_data.mean(dim=0)
std = tensor_data.std(dim=0)
normalized_data = (tensor_data - mean) / std


print(normalized_data)
## 输出:
## tensor([[-1.2247, -1.2247, -1.2247],
##         [ 0.0000,  0.0000,  0.0000],
##         [ 1.2247,  1.2247,  1.2247]])

在这个案例中,我们首先将用户行为数据从 NumPy 数组转换为 PyTorch 张量,然后对张量进行归一化处理,使其适合用于神经网络的训练。

七、总结

张量是 PyTorch 中的核心数据结构,通过掌握张量的创建、操作、属性和转换,可以为深入学习深度学习奠定坚实的基础。在实际应用中,合理地使用张量操作可以高效地处理各种数据任务。无论是在编程狮平台学习深度学习,还是在 W3Cschool 上探索其他编程知识,理解张量的基本概念和操作都是非常重要的。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号