PyTorch 主要有以下几个基础概念:张量(Tensor)、自动求导(Autograd)、神经网络模块(nn.Module)、优化器(optim)等。
张量(Tensor)
张量(Tensor)是 PyTorch 中的核心数据结构,用于存储和操作多维数组。
张量可以视为一个多维数组,支持加速计算的操作。
在 PyTorch 中,张量的概念类似于 NumPy 中的数组,但是 PyTorch 的张量可以运行在不同的设备上,比如 CPU 和 GPU,这使得它们非常适合于进行大规模并行计算,特别是在深度学习领域。
维度(Dimensionality):张量的维度指的是数据的多维数组结构。例如,一个标量(0维张量)是一个单独的数字,一个向量(1维张量)是一个一维数组,一个矩阵(2维张量)是一个二维数组,以此类推。
形状(Shape):张量的形状是指每个维度上的大小。例如,一个形状为(3, 4)的张量意味着它有3行4列。
数据类型(Dtype):张量中的数据类型定义了存储每个元素所需的内存大小和解释方式。PyTorch支持多种数据类型,包括整数型(如torch.int8、torch.int32)、浮点型(如torch.float32、torch.float64)和布尔型(torch.bool)。
张量创建
import torch
# 创建一个 2x3 的全 0 张量
a = torch.zeros(2, 3)
print(a)# 创建一个 2x3 的全 1 张量
b = torch.ones(2, 3)
print(b)# 创建一个 2x3 的随机数张量
c = torch.randn(2, 3)
print(c)# 从 NumPy 数组创建张量
import numpy as np
numpy_array = np.array([[1, 2], [3, 4]])
tensor_from_numpy = torch.from_numpy(numpy_array)
print(tensor_from_numpy)# 在指定设备(CPU/GPU)上创建张量
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
d = torch.randn(2, 3, device=device)
print(d)
常用张量操作
import torch
# 张量相加
e = torch.randn(2, 3)
f = torch.randn(2, 3)
print(e)
print(f)
print(e + f)# 逐元素乘法
print(e * f)# 张量的转置
g = torch.randn(3, 2)
print(g)
print(g.t()) # 或者 g.transpose(0, 1)
# 张量的形状
print(g.shape)# 返回形状
梯度和自动微分
PyTorch的张量支持自动微分。当创建一个需要梯度的张量时,PyTorch可以自动计算其梯度:
import torch
# 创建一个需要梯度的张量
tensor_requires_grad = torch.tensor([3.0], requires_grad=True)
print(tensor_requires_grad)# 进行一些操作
tensor_result = tensor_requires_grad * 3
print(tensor_result)# 计算梯度
tensor_result.backward()
print(tensor_requires_grad.grad) # 输出梯度
自动求导(Autograd)
PyTorch 提供了自动求导功能,通过autograd模块来自动计算梯度。
torch.Tensor对象有一个 requires_grad 属性,用于指示是否需要计算该张量的梯度。
当你创建一个 requires_grad=True 的张量时,PyTorch 会自动跟踪所有对它的操作,以便在之后计算梯度。
创建需要梯度的张量:
import torch # 创建一个需要计算梯度的张量 x = torch.randn(2, 2, requires_grad=True) print(x) # 执行某些操作 y = x + 2 z = y * y * 3 out = z.mean() print(out)
定义了计算图,可以通过 .backward() 方法来计算梯度。在神经网络训练中,自动求导主要用于实现反向传播算法。
# 反向传播,计算梯度
out.backward()# 查看 x 的梯度
print(x.grad)
神经网络(nn.Module)
神经网络(nn.Module)
神经网络是一种模仿人脑神经元连接的计算模型,由多层节点(神经元)组成,用于学习数据之间的复杂模式和关系。
神经网络通过调整神经元之间的连接权重来优化预测结果,这一过程涉及前向传播、损失计算、反向传播和参数更新。
神经网络的类型包括前馈神经网络、卷积神经网络(CNN)、循环神经网络(RNN)和长短期记忆网络(LSTM),它们在图像识别、语音处理、自然语言处理等多个领域都有广泛应用。
PyTorch 提供了一个非常方便的接口来构建神经网络模型,即 torch.nn.Module。
我们可以继承 nn.Module 类并定义自己的网络层。
创建一个简单的神经网络:
import torch.nn as nn
import torch
import torch.optim as optim
# 定义一个简单的全连接神经网络
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(2, 2) # 输入层到隐藏层
self.fc2 = nn.Linear(2, 1) # 隐藏层到输出层def forward(self, x):
x = torch.relu(self.fc1(x)) # ReLU 激活函数
x = self.fc2(x)
return x
# 创建网络实例
model = SimpleNN()# 打印模型结构
print(model)
前向传播与损失计算
# 随机输入
x = torch.randn(1, 2)# 前向传播
output = model(x)
print(output)# 定义损失函数(例如均方误差 MSE)
criterion = nn.MSELoss()# 假设目标值为 1
target = torch.randn(1, 1)# 计算损失
loss = criterion(output, target)
print(loss)
优化器(Optimizers)
优化器在训练过程中更新神经网络的参数,以减少损失函数的值。使用优化器进行参数更新:
# 定义优化器(使用 Adam 优化器)
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练步骤
optimizer.zero_grad() # 清空梯度
loss.backward() # 反向传播
optimizer.step() # 更新参数
训练模型
import torch import torch.nn as nn import torch.optim as optim # 1. 定义一个简单的神经网络模型 class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(2, 2) # 输入层到隐藏层 self.fc2 = nn.Linear(2, 1) # 隐藏层到输出层 def forward(self, x): x = torch.relu(self.fc1(x)) # ReLU 激活函数 x = self.fc2(x) return x # 2. 创建模型实例 model = SimpleNN() # 3. 定义损失函数和优化器 criterion = nn.MSELoss() # 均方误差损失函数 optimizer = optim.Adam(model.parameters(), lr=0.001) # Adam 优化器 # 4. 假设我们有训练数据 X 和 Y X = torch.randn(10, 2) # 10 个样本,2 个特征 Y = torch.randn(10, 1) # 10 个目标值 # 5. 训练循环 for epoch in range(100): # 训练 100 轮 optimizer.zero_grad() # 清空之前的梯度 output = model(X) # 前向传播 loss = criterion(output, Y) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新参数 # 每 10 轮输出一次损失 if (epoch + 1) % 10 == 0: print(f'Epoch [{epoch + 1}/100], Loss: {loss.item():.4f}')在每 10 轮,程序会输出当前的损失值,帮助我们跟踪模型的训练进度。随着训练的进行,损失值应该会逐渐降低,表示模型在不断学习并优化其参数。
训练模型是一个迭代的过程,需要不断地调整和优化,直到达到满意的性能。这个过程涉及到大量的实验和调优,目的是使模型在新的、未见过的数据上也能有良好的泛化能力。
设备(Device)
PyTorch 允许你将模型和数据移动到 GPU 上进行加速。使用 torch.device 来指定计算设备。将模型和数据移至 GPU:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 将模型移动到设备
model.to(device)# 将数据移动到设备
X = X.to(device)
Y = Y.to(device)