代码:
import torch
import numpy as np
import torch.nn as nn
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 定义数据: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()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
epoches =500
for n in range(1,epoches+1):
epoch_loss=0
#以前都是所有数据一块训练,现在是按照批次进行训练
for batch_x,batch_y in dataloader:
#现在x_train 相当于10个样本,但是现在维度,添加一个维度
#10x1 变成样本 x 维度形式
y_prd=model(batch_x.unsqueeze(1))
#计算损失
#y_prd在前面,y_true 是后面
batch_loss=criterion(y_prd.squeeze(1),batch_y)
#梯度更新
#清空之前存储在优化器中的梯度
optimizer.zero_grad()
#损失函数对模型参数的梯度
batch_loss.backward()
#根据优化算法更新参数
optimizer.step()
#计算一下epoch的损失
epoch_loss=epoch_loss+batch_loss
# 5、显示频率设置
#计算一下epoch的平均损失
avg_loss=epoch_loss/(len(dataloader))
# 不先画图
if n % 10 == 0 or n == 1:
print(f"epoches:{n},loss:{avg_loss}")
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)
#添加上下文不需要计算梯度
with torch.no_grad():
y_pred=model(x_test)
threshold = 50 # 设定阈值
y_pred_class = int(y_pred.item() > threshold)
# 输出预测结果
print(f"预测值 : {y_pred.item():.4f}")
print(f"预测类 : {y_pred_class}")
# 假设真实标签也是 1 或 0,我们用一个假的真实标签来计算评估指标(你可以根据实际情况替换)
y_true_class = 1 if y_data[1] > threshold else 0 # 假设我们预测的是第二个样本
# 计算精确度、召回率和 F1 分数
accuracy = accuracy_score([y_true_class], [y_pred_class])
precision = precision_score([y_true_class], [y_pred_class])
recall = recall_score([y_true_class], [y_pred_class])
f1 = f1_score([y_true_class], [y_pred_class])
# 输出分类评估指标
print(f"precision : {precision:.4f}")
print(f"recall : {recall:.4f}")
print(f"f1 : {f1:.4f}")
结果: