PyTorch 张量(Tensor)

PyTorch 基础

本节介绍 PyTorch 的核心概念和基础操作,适合初学者快速上手。内容涵盖张量(Tensor)、自动求导(Autograd)、基本神经网络构建和数据处理。以下是简明教程,代码示例简洁且可运行。


1. 张量(Tensor)

张量是 PyTorch 的核心数据结构,类似 NumPy 数组,但支持 GPU 加速和自动求导。

创建张量

import torch

# 基本张量
x = torch.tensor([1, 2, 3])  # 1D 张量
y = torch.zeros(2, 3)  # 2x3 全零张量
z = torch.randn(3, 4)  # 3x4 随机张量(正态分布)

# 从 NumPy 转换
import numpy as np
np_array = np.array([[1, 2], [3, 4]])
tensor_from_np = torch.from_numpy(np_array)

print(x, y, z)

张量操作

# 基本运算
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print(a + b)  # 元素相加: [5, 7, 9]
print(torch.matmul(a, b))  # 点积: 32

# 形状操作
x = torch.randn(2, 3)
print(x.view(3, 2))  # 重塑为 3x2
print(x.unsqueeze(0).shape)  # 增加维度: [1, 2, 3]
print(x.squeeze().shape)  # 移除单一维度

# 移动到 GPU
if torch.cuda.is_available():
    x = x.to('cuda')
  • 关键点
  • 张量支持广播(broadcasting),类似 NumPy。
  • 使用 .to('cuda').to('cpu') 切换设备。

2. 自动求导(Autograd)

PyTorch 的 autograd 模块自动计算梯度,是深度学习的核心。

示例:计算梯度

x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x ** 2  # 定义运算
z = y.sum()  # 标量输出
z.backward()  # 计算梯度
print(x.grad)  # 输出梯度: [4.0, 6.0] (dy/dx = 2x)
  • 关键点
  • requires_grad=True:启用梯度跟踪。
  • backward():计算梯度,存储在 .grad 中。
  • torch.no_grad():在推理时禁用梯度计算以节省内存。

3. 构建简单神经网络

使用 torch.nn 模块快速定义神经网络。

示例:全连接网络

import torch.nn as nn

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(10, 5)  # 输入 10 维,输出 5 维
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(5, 2)   # 输出 2 维

    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = SimpleNN()
print(model)
  • 说明
  • 继承 nn.Module 定义模型。
  • forward 方法定义前向传播。
  • 使用 nn.Linearnn.ReLU 等模块构建层。

4. 数据加载

PyTorch 的 torch.utils.data 模块简化数据处理。

示例:创建数据集

from torch.utils.data import DataLoader, TensorDataset

# 模拟数据
X = torch.randn(100, 10)  # 100 个样本,10 维特征
y = torch.randint(0, 2, (100,))  # 0 或 1 的标签
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=32, shuffle=True)

# 访问数据
for data, target in loader:
    print(data.shape, target.shape)  # [32, 10], [32]
    break

5. 训练模型

以下是训练神经网络的基本流程。

示例:训练分类模型

import torch.optim as optim

# 初始化
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练循环
for epoch in range(5):
    for data, target in loader:
        optimizer.zero_grad()  # 清零梯度
        output = model(data)   # 前向传播
        loss = criterion(output, target)  # 计算损失
        loss.backward()        # 反向传播
        optimizer.step()       # 更新参数
    print(f"Epoch {epoch+1}, Loss: {loss.item()}")

6. 使用 GPU

将模型和数据移到 GPU 加速计算:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
data, target = data.to(device), target.to(device)

7. 关键模块

  • torch: 核心模块,包含张量操作和数学函数。
  • torch.nn: 提供神经网络层(如 nn.Linearnn.Conv2d)和损失函数。
  • torch.optim: 优化器(如 SGDAdam)。
  • torchvision: 提供计算机视觉数据集、模型和变换。

8. 调试与可视化

  • 打印张量print(tensor) 查看值和形状。
  • 检查梯度model.parameters()tensor.grad
  • 可视化损失:记录 loss.item(),可用 Matplotlib 绘制(需要时可提供代码)。

9. 资源

  • 官方文档:https://pytorch.org/docs/stable/index.html
  • 教程:https://pytorch.org/tutorials/
  • 社区:在 X 平台搜索 #PyTorch 获取最新讨论。

如果你需要更深入的讲解(例如,特定张量操作、卷积网络、数据增强)或代码示例,请告诉我!也可以生成损失曲线等图表。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注