大家好!今天我要和大家分享深度学习界最受欢迎的框架之一 - PyTorch!作为一个直观、灵活的深度学习工具,PyTorch不仅容易上手,还拥有强大的计算能力和丰富的功能。无论你是刚接触深度学习的新手,还是经验丰富的研究者,PyTorch都能帮你轻松实现各种深度学习模型。让我们开始这段exciting的学习之旅吧!
1. PyTorch基础:张量(Tensor)
首先来认识PyTorch中最基本的数据结构 -张量。可以把张量理解为一个多维数组,它与NumPy的数组很相似,但能在GPU上运行,支持自动求导。
import torch
# 创建张量
# 直接从列表创建
tensor1 = torch.tensor([1, 2, 3, 4, 5])
print("一维张量:", tensor1)
# 创建特殊张量
zeros = torch.zeros(2, 3) # 2x3的零张量
ones = torch.ones(2, 2) # 2x2的全1张量
rand = torch.rand(3, 3) # 3x3的随机张量
print("\n零张量:\n", zeros)
print("\n随机张量:\n", rand)
# 张量运算
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print("\n加法:", a + b)
print("乘法:", a * b)
小贴士:PyTorch中的张量可以很方便地在CPU和GPU之间转移。使用
.to('cuda')
将张量移到GPU,用.to('cpu')
将其移回CPU。记得先检查是否有可用的GPU!
2. 自动求导机制
PyTorch最强大的特性之一是它的自动求导系统。这让我们在训练深度学习模型时不用手动计算梯度:
import torch
# 创建需要计算梯度的张量
x = torch.tensor([2.0], requires_grad=True)
y = x * x + 3
# 反向传播
y.backward()
# 查看梯度
print("x的梯度:", x.grad) # 应该是4.0,因为y对x的导数是2x
# 更复杂的例子
x = torch.tensor([[1., 2.], [3., 4.]], requires_grad=True)
y = x.mean() # 计算平均值
y.backward() # 反向传播
print("\nx的梯度:\n", x.grad) # 每个元素的梯度都是1/4
3. 构建神经网络
PyTorch提供了nn.Module
作为创建神经网络的基类。让我们来创建一个简单的神经网络:
import torch.nn as nn
import torch.nn.functional as F
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
# 定义网络层
self.fc1 = nn.Linear(10, 5) # 输入10维,输出5维
self.fc2 = nn.Linear(5, 2) # 输入5维,输出2维
def forward(self, x):
# 定义前向传播
x = F.relu(self.fc1(x)) # 使用ReLU激活函数
x = self.fc2(x)
return x
# 创建模型实例
model = SimpleNet()
print("模型结构:", model)
# 准备输入数据
input_data = torch.randn(1, 10) # 一个10维的输入样本
output = model(input_data)
print("\n输出结果:", output)
4. 模型训练实战
来看一个完整的模型训练例子,我们用PyTorch实现一个简单的分类器:
import torch
import torch.nn as nn
import torch.optim as optim
# 生成一些假数据
X = torch.randn(100, 2) # 100个样本,每个2个特征
y = torch.randint(0, 2, (100,)) # 二分类标签
# 定义模型
class Classifier(nn.Module):
def __init__(self):
super(Classifier, self).__init__()
self.linear = nn.Linear(2, 2)
def forward(self, x):
return self.linear(x)
# 创建模型、损失函数和优化器
model = Classifier()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(100):
# 前向传播
outputs = model(X)
loss = criterion(outputs, y)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 10 == 0:
print(f'Epoch {epoch}, Loss: {loss.item():.4f}')
小贴士:在训练模型时,别忘了调用
optimizer.zero_grad()
清除旧的梯度。这是初学者经常犯的错误之一!
5. 保存和加载模型
学会保存和加载模型是很重要的,这样我们就不用每次都重新训练:
# 保存模型
torch.save(model.state_dict(), 'model.pth')
# 加载模型
new_model = Classifier()
new_model.load_state_dict(torch.load('model.pth'))
new_model.eval() # 设置为评估模式
# 使用加载的模型进行预测
with torch.no_grad(): # 不计算梯度
test_input = torch.randn(1, 2)
output = new_model(test_input)
print("模型预测结果:", output)
今天的Python学习之旅就到这里啦!记得动手敲代码。这里给大家留一个有趣的练习:
尝试构建一个多层神经网络 使用MNIST数据集训练一个手写数字识别模型 实验不同的优化器(如Adam、RMSprop)对训练效果的影响
提示:可以使用torchvision.datasets
来加载MNIST数据集!
祝大家学习愉快,Python学习节节高!