学校网站官网,设计类专业要艺考吗,英文网站正在建设页面,个人合法网站怎么做目录
固定的随机数种子
定义predict功能
拆分数据集
定义trainer
超参数设置
数据集载入
固定的随机数种子
在大量的机器学习与深度学习实验中#xff0c;如果不进行特殊设置#xff0c;我们的结果将不可复现#xff0c;固定的随机数种子将会解决这个问题
def same…目录
固定的随机数种子
定义predict功能
拆分数据集
定义trainer
超参数设置
数据集载入
固定的随机数种子
在大量的机器学习与深度学习实验中如果不进行特殊设置我们的结果将不可复现固定的随机数种子将会解决这个问题
def same_seed(seed): 设置随机种子(便于复现)torch.backends.cudnn.deterministic Truetorch.backends.cudnn.benchmark Falsenp.random.seed(seed)torch.manual_seed(seed)if torch.cuda.is_available():torch.cuda.manual_seed_all(seed)print(fSet Seed {seed})
定义predict功能
在自己进行完整的训练框架搭建时对于结果的预测功能搭建需要分离被预测对象否则预测的对象的梯度会回传扰乱模型backbone
def predict(test_loader, model, device):model.eval() # 设置成eval模式.preds []for x in tqdm(test_loader):x x.to(device) with torch.no_grad():pred model(x) preds.append(pred.detach().cpu())
#detach()从GPU分离tensor, cpu()将tensor从GPU转到CPUpreds torch.cat(preds, dim0).numpy()
# 将预测结果拼接成一个numpy矩阵return preds
拆分数据集
对于原始数据集分类的拆分函数
def train_valid_split(data_set, valid_ratio, seed):数据集拆分成训练集training set和 验证集validation setvalid_set_size int(valid_ratio * len(data_set)) train_set_size len(data_set) - valid_set_sizetrain_set, valid_set random_split(data_set, [train_set_size, valid_set_size],generatortorch.Generator().manual_seed(seed))return np.array(train_set), np.array(valid_set)
定义trainer
def trainer(train_loader, valid_loader, model, config, device):criterion nn.MSELoss(reductionmean) # 损失函数的定义# 定义优化器optimizer torch.optim.SGD(model.parameters(), lrconfig[learning_rate], momentum0.9) # tensorboard 的记录器writer SummaryWriter()if not os.path.isdir(./models):# 创建文件夹-用于存储模型os.mkdir(./models)n_epochs, best_loss, step, early_stop_count config[n_epochs], math.inf, 0, 0for epoch in range(n_epochs):model.train() # 训练模式loss_record []# tqdm可以帮助我们显示训练的进度 train_pbar tqdm(train_loader, position0, leaveTrue)# 设置进度条的左边 显示第几个Epoch了train_pbar.set_description(fEpoch [{epoch1}/{n_epochs}])for x, y in train_pbar:optimizer.zero_grad() # 将梯度置0.x, y x.to(device), y.to(device) # 将数据一到相应的存储位置(CPU/GPU)pred model(x) loss criterion(pred, y)loss.backward() # 反向传播 计算梯度.optimizer.step() # 更新网络参数step 1loss_record.append(loss.detach().item())# 训练完一个batch的数据将loss 显示在进度条的右边train_pbar.set_postfix({loss: loss.detach().item()})mean_train_loss sum(loss_record)/len(loss_record)# 每个epoch,在tensorboard 中记录训练的损失后面可以展示出来writer.add_scalar(Loss/train, mean_train_loss, step)model.eval() # 将模型设置成 evaluation 模式.loss_record []for x, y in valid_loader:x, y x.to(device), y.to(device)with torch.no_grad():pred model(x)loss criterion(pred, y)loss_record.append(loss.item())mean_valid_loss sum(loss_record)/len(loss_record)print(fEpoch [{epoch1}/{n_epochs}]: Train loss: {mean_train_loss:.4f}, Valid loss: {mean_valid_loss:.4f})# 每个epoch,在tensorboard 中记录验证的损失后面可以展示出来writer.add_scalar(Loss/valid, mean_valid_loss, step)if mean_valid_loss best_loss:best_loss mean_valid_losstorch.save(model.state_dict(), config[save_path]) # 模型保存print(Saving model with loss {:.3f}....format(best_loss))early_stop_count 0else: early_stop_count 1if early_stop_count config[early_stop]:print(\nModel is not improving, so we halt the training session.)return
超参数设置
device cuda if torch.cuda.is_available() else cpu
config {seed: 5201314, # 随机种子可以自己填写. :)select_all: True, # 是否选择全部的特征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 # 模型存储的位置
}
数据集载入
# 使用Pytorch中Dataloader类按照Batch将数据集加载
train_loader DataLoader(train_dataset, batch_sizeconfig[batch_size], shuffleTrue, pin_memoryTrue)
valid_loader DataLoader(valid_dataset, batch_sizeconfig[batch_size], shuffleTrue, pin_memoryTrue)
test_loader DataLoader(test_dataset, batch_sizeconfig[batch_size], shuffleFalse, pin_memoryTrue) 模型训练
model My_Model(input_dimx_train.shape[1]).to(device)
# 将模型和训练数据放在相同的存储位置(CPU/GPU)
trainer(train_loader, valid_loader, model, config, device)
模型测试
def save_pred(preds, file): 将模型保存到指定位置with open(file, w) as fp:writer csv.writer(fp)writer.writerow([id, tested_positive])for i, p in enumerate(preds):writer.writerow([i, p])model My_Model(input_dimx_train.shape[1]).to(device)
model.load_state_dict(torch.load(config[save_path]))
preds predict(test_loader, model, device)
save_pred(preds, pred.csv)