代码:
import torch
import numpy as np
import torch.nn as nn
# 定义数据:x_data 是特征,y_data 是标签(目标值)
data = [[-0.5, 7.7],
[1.8, 98.5],
[0.9, 57.8],
[0.4, 39.2],
[-1.4, -15.7],
[-1.4, -37.3],
[-1.8, -49.1],
[1.5, 75.6],
[0.4, 34.0],
[0.8, 62.3]]
# 将数据转为 numpy 数组
data = np.array(data)
# 提取 x_data 和 y_data
x_data = data[:, 0] # 取第一列作为输入特征
y_data = data[:, 1] # 取第二列作为目标标签
# 将数据转换为 PyTorch 张量
x_train = torch.tensor(x_data, dtype=torch.float32) # 输入特征
y_train = torch.tensor(y_data, dtype=torch.float32) # 目标标签
# 使用 TensorDataset 来创建一个数据集
from torch.utils.data import DataLoader, TensorDataset
dataset = TensorDataset(x_train, y_train) # 使用训练数据创建数据集
dataloader = DataLoader(dataset, batch_size=2, shuffle=True) # 将数据集转换为 DataLoader,批大小为 2,且每个 epoch 都会随机打乱数据
# 定义损失函数:均方误差损失 (MSELoss)
criterion = nn.MSELoss()
# 定义线性回归模型
class LinearModel(nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
# 使用一个线性层,输入为1维,输出为1维
self.layers = nn.Linear(1, 1)
def forward(self, x):
# 直接返回线性层的输出
return self.layers(x)
# 初始化模型
model = LinearModel()
# 定义优化器:使用随机梯度下降 (SGD),学习率为 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 设置训练的 epoch 数量
epochs = 500
# 开始训练
for n in range(1, epochs + 1):
epoch_loss = 0 # 初始化每个 epoch 的总损失
# 遍历每一个 batch
for batch_x, batch_y in dataloader:
# 对每个输入 batch_x 添加一个维度,使其适应线性回归模型
y_pred = model(batch_x.unsqueeze(1))
# 计算当前 batch 的损失
batch_loss = criterion(y_pred.squeeze(1), batch_y)
# 清除梯度
optimizer.zero_grad()
# 反向传播
batch_loss.backward()
# 更新模型参数
optimizer.step()
# 累加损失
epoch_loss += batch_loss
# 计算当前 epoch 的平均损失
avg_loss = epoch_loss / len(dataloader)
# 每 10 个 epoch 或第一个 epoch 打印一次损失
if n % 10 == 0 or n == 1:
print(f"epoches:{n}, loss:{avg_loss:.4f}")
# 在每 10 个 epoch 保存一次模型的状态字典
torch.save(model.state_dict(), 'model.pth')
# 训练完成后,加载保存的模型
model.load_state_dict(torch.load("model.pth"))
# 将模型切换到评估模式
model.eval()
# 测试数据
x_test = torch.tensor([[1.8]], dtype=torch.float32) # 测试输入 1.8
# 使用模型进行预测
with torch.no_grad(): # 在预测时不计算梯度
y_pre = model(x_test)
# 打印预测结果
print(y_pre)
结果: