🗂️ 一、项目结构概览
我们将做的事情包括:
- 生成模拟数据
- 定义神经网络结构
- 选择损失函数和优化器
- 训练模型
- 评估效果
- 保存与加载模型
📌 二、环境准备
pip install torch
💾 三、生成模拟数据(简单线性关系)
import torch
import matplotlib.pyplot as plt
# 模拟数据:y = 3x + 2 + 噪声
torch.manual_seed(0)
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # shape: (100, 1)
y = 3 * x + 2 + 0.2 * torch.rand(x.size())
# 可视化
plt.scatter(x.numpy(), y.numpy())
plt.title("训练数据分布")
plt.show()
🧠 四、定义神经网络结构
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.hidden = nn.Linear(1, 10) # 输入1维,隐藏层10维
self.relu = nn.ReLU()
self.output = nn.Linear(10, 1) # 输出1维(回归)
def forward(self, x):
x = self.hidden(x)
x = self.relu(x)
x = self.output(x)
return x
model = Net()
print(model)
🎯 五、定义损失函数和优化器
import torch.optim as optim
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
🔁 六、训练神经网络
for epoch in range(200):
prediction = model(x) # 前向传播
loss = criterion(prediction, y) # 计算损失
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 参数更新
if epoch % 20 == 0:
print(f'Epoch {epoch}, Loss: {loss.item():.4f}')
📊 七、可视化效果
pred = model(x).detach()
plt.scatter(x.numpy(), y.numpy(), label='真实数据')
plt.plot(x.numpy(), pred.numpy(), 'r-', label='预测结果')
plt.legend()
plt.title("训练结果")
plt.show()
💾 八、保存与加载模型
# 保存模型参数
torch.save(model.state_dict(), 'mymodel.pth')
# 加载模型参数
model.load_state_dict(torch.load('mymodel.pth'))
model.eval()
✅ 九、小结
步骤 | 内容 |
---|---|
数据准备 | 自定义或使用数据集 |
网络结构 | 定义一个 nn.Module |
损失函数 | nn.MSELoss() |
优化器 | optim.SGD() 、.backward() 、.step() |
可视化 | 使用 matplotlib |
保存模型 | torch.save() 、torch.load() |
🧪 十、挑战建议(练手)
- 修改网络结构:增加层数或神经元数量
- 尝试使用
nn.Sequential
重写网络 - 使用
optim.Adam()
替代 SGD - 修改任务为分类(比如二分类)
发表回复