深度学习回归任务训练代码模版
文章目录
参数设置
超参设置:config
包含所有训练需要的超参数(便于后续的调参),以及模型需要存储的位置
device = 'cuda' if torch.cuda.is_available() else 'cpu'
config = {
'seed': 5201314, # 随机种子,可以自己填写. :)
'select_all': False, # 是否选择全部的特征
'valid_ratio': 0.2, # 验证集大小(validation_size) = 训练集大小(train_size) * 验证数据占比(valid_ratio)
'n_epochs': 3000, # 数据遍历训练次数
'batch_size': 256,
'learning_rate': 1e-5,
'early_stop': 400, # 如果early_stop轮损失没有下降就停止训练.
'save_path': './models/model.ckpt' # 模型存储的位置
}
功能函数
导入需要的Python包
# 数值、矩阵操作
import math
import numpy as np
# 数据读取与写入
import pandas as pd
import os
import csv
# 进度条
# from tqdm import tqdm
# 如果是使用notebook 推荐使用以下(颜值更高 : ) )
from tqdm.notebook import tqdm
# Pytorch 深度学习张量操作框架
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader, random_split
# 绘制pytorch的网络
from torchviz import make_dot
# 学习曲线绘制
from torch.utils.tensorboard import SummaryWriter
一些重要的方法(随机种子设置、数据拆分、模型预测)
# 定义一个函数来设置随机种子,以确保实验的可复现性
def same_seed(seed):
"""
设置随机种子(便于复现)
"""
# 设置CUDA的确定性,确保每次运行的结果是确定的
torch.backends.cudnn.deterministic = True
# 关闭CUDA的benchmark模式,因为这与确定性运行模式冲突
torch.backends.cudnn.benchmark = False
# 设置NumPy的随机种子
np.random.seed(seed)
# 设置PyTorch的随机种子
torch.manual_seed(seed)
# 如果CUDA可用,则为GPU设置随机种子
if torch.cuda.is_available():
torch.cuda.manual_seed_all(seed)
# 打印设置的种子值
print(f'Set Seed = {
seed}')
# 定义一个函数来将数据集随机拆分为训练集和验证集
def train_valid_split(data_set, valid_ratio, seed):
"""
数据集拆分成训练集(training set)和 验证集(validation set)
"""
# 计算验证集的大小
valid_set_size = int(valid_ratio * len(data_set))
# 训练集的大小是数据集总大小减去验证集大小
train_set_size = len(data_set) - valid_set_size
# 使用PyTorch的random_split函数来拆分数据集,传入随机种子以确保可复现性
train_set, valid_set = random_split(data_set, [train_set_size, valid_set_size], generator=torch.Generator().manual_seed(seed))
# 将拆分得到的数据集转换为NumPy数组格式并返回
return np.array(train_set), np.array(valid_set)
# 定义一个函数来进行模型的预测
def predict(test_loader, model, device):
# 将模型设置为评估模式
model.eval()
# 初始化一个列表来存储预测结果
preds = []
# 遍历测试数据集
for x in tqdm(test_loader):
# 将数据移动到指定的设备上(CPU或GPU)
x = x.to(device)
# 使用with torch.no_grad()来禁止计算梯度,因为在预测模式下不需要计算梯度
with torch.no_grad():
# 进行前向传播以获得预测结果
pred = model(x)
# 将预测结果从GPU移回CPU,并将其