在深度学习入门实践中,用简单的回归任务验证模型效果是非常有效的方式,两数加法作为基础的数值计算任务,能够清晰展示多层感知机从数据准备到训练推理的全流程。下面我们就用PyTorch一步步实现这个功能。

环境准备与依赖导入
首先需要确保已经安装PyTorch库,如果没有安装可以通过官方命令进行安装,本文使用的是基础PyTorch版本即可满足需求。首先导入需要的依赖模块:
import torch import torch.nn as nn import torch.optim as optim import numpy as np
数据集构建
两数加法任务的输入是两个数值,输出是这两个数值的和,属于简单的回归任务。我们可以随机生成大量的输入样本和对应的标签,这里生成10000个样本作为训练数据:
# 生成训练数据,输入是两个0到100之间的随机数,输出是两数之和
def generate_data(num_samples=10000):
# 生成输入数据,形状为(num_samples, 2)
inputs = np.random.randint(0, 100, size=(num_samples, 2))
# 计算标签,即两个数的和
labels = inputs.sum(axis=1)
# 转换为PyTorch张量,并转为浮点型
inputs_tensor = torch.tensor(inputs, dtype=torch.float32)
labels_tensor = torch.tensor(labels, dtype=torch.float32).view(-1, 1)
return inputs_tensor, labels_tensor
# 生成训练集和测试集
train_inputs, train_labels = generate_data(8000)
test_inputs, test_labels = generate_data(2000)
MLP模型定义
多层感知机的结构包含输入层、隐藏层和输出层,这里输入层有2个神经元对应两个加数,隐藏层设置16个神经元,输出层1个神经元对应相加的结果,激活函数使用ReLU:
class AdditionMLP(nn.Module):
def __init__(self):
super(AdditionMLP, self).__init__()
# 定义网络层
self.fc1 = nn.Linear(2, 16) # 输入层到隐藏层
self.relu = nn.ReLU() # 激活函数
self.fc2 = nn.Linear(16, 1) # 隐藏层到输出层
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# 初始化模型
model = AdditionMLP()
训练过程实现
训练过程需要选择损失函数和优化器,回归任务常用均方误差损失,优化器选择Adam,设置合适的学习率和训练轮次:
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练参数设置
num_epochs = 50
batch_size = 32
# 开始训练
for epoch in range(num_epochs):
model.train()
total_loss = 0.0
# 按批次训练
for i in range(0, len(train_inputs), batch_size):
batch_inputs = train_inputs[i:i+batch_size]
batch_labels = train_labels[i:i+batch_size]
# 前向传播
outputs = model(batch_inputs)
loss = criterion(outputs, batch_labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
# 每10轮打印一次平均损失
if (epoch + 1) % 10 == 0:
avg_loss = total_loss / (len(train_inputs) // batch_size)
print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {avg_loss:.4f}")
模型评估与保存
训练完成后可以用测试集评估模型效果,同时保存训练好的模型参数方便后续推理使用:
# 模型评估
model.eval()
with torch.no_grad():
test_outputs = model(test_inputs)
test_loss = criterion(test_outputs, test_labels)
print(f"测试集损失: {test_loss.item():.4f}")
# 保存模型参数
torch.save(model.state_dict(), "addition_mlp.pth")
print("模型保存成功")
推理阶段实现
推理阶段需要加载保存的模型参数,输入两个待相加的数值,输出模型的预测结果:
# 加载模型
inference_model = AdditionMLP()
inference_model.load_state_dict(torch.load("addition_mlp.pth"))
inference_model.eval()
# 推理函数
def predict_addition(num1, num2):
input_tensor = torch.tensor([[num1, num2]], dtype=torch.float32)
with torch.no_grad():
prediction = inference_model(input_tensor)
return prediction.item()
# 测试推理效果
print(f"3 + 5 的预测结果: {predict_addition(3, 5):.2f}")
print(f"27 + 43 的预测结果: {predict_addition(27, 43):.2f}")
print(f"99 + 1 的预测结果: {predict_addition(99, 1):.2f}")
总结
通过以上步骤我们完成了用PyTorch构建MLP实现两数加法的完整流程,从数据生成到模型训练再到推理部署的每个环节都有对应的代码实现。这个简单的任务可以帮助理解神经网络处理回归问题的基本逻辑,后续可以在此基础上调整网络结构、增加训练数据或者修改任务难度,进一步巩固PyTorch的使用方法。