需求
算法分析
这是个很明显的回归问题
整体思路:数据加载器设计,模型设计,损失函数设计,绘图函数设计,训练测试脚本设计
##训练集代码
import torch
import torch.optim as optim
from torch import nn
from torch.utils.data import DataLoader
from tqdm import tqdm
from CONSTANT import OUTPUTDIM
from dataloaders import CovIdDataset
from model import DNN
from utils.loss import plotLossCurve
# Set device
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# Model, loss, and optimizer
model = DNN(87).to(device)
# Hyperparameters
batch_size = OUTPUTDIM
learning_rate = 0.001
epochs = 100
# 更换了优化器
# optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, betas=(0.9, 0.999))
optimizer = optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-4)
# 余弦退火调度器
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50, eta_min=1e-5)
# Instantiate dataset and dataloader
dataset = CovIdDataset(r'E:\pycharmProjects\PythonProject22\data\covid_train.csv'
,pattern='train')
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=False)
criterion = nn.MSELoss()
loss_list = []
mseList = []
for epoch in tqdm(range(epochs)):
model.train()
running_loss = 0.0
for batch in dataloader:
x = batch[0].to(device).unsqueeze(0)
y = batch[1].to(device).unsqueeze(0)
output = model(x)
loss = criterion(output.view(-1), y.view(-1))
mseList.append(loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
# 更新学习率
scheduler.step()
epoch_loss = running_loss/len(dataloader)
loss_list.append(epoch_loss)
print(f"Epoch {epoch + 1}/{epochs}, Loss: {epoch_loss:.4f}")
# Save model
torch.save(model.state_dict(), 'res/myParams.pt')
print("模型已保存!")
# Plot loss curve
plotLossCurve(loss_list)
print(min(mseList))
##测试集代码
# @File: test.py
# @Author: chen_song
# @Time: 2025-05-05 9:05
import torch
from torch.utils.data import DataLoader
import pandas as pd
from dataloaders import CovIdDataset
from model import DNN
if __name__ == '__main__':
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
dict = torch.load(r"E:\pycharmProjects\PythonProject22\myParams.pt")
model = DNN(87).to(device)
model.load_state_dict(dict)
testPath = r"E:\pycharmProjects\PythonProject22\data\covid_test.csv"
testData = CovIdDataset(testPath,pattern='test')
dataloader = DataLoader(testData, batch_size=1, shuffle=False)
results = []
for data in dataloader:
x = data.to(device).unsqueeze(0)
output = model(x).detach()
value = output.item()
results.append(value)
# 将所有结果写入 DataFrame
df = pd.DataFrame({'CK1': results})
# 保存到 Excel 文件
df.to_excel('output.xlsx', index=False)
整体代码可以通过网盘下载
完整代码