在深度学习中,模型的训练通常会受到随机性因素的影响,如参数初始化、数据加载顺序等。这会导致每次训练得到的结果有所不同。要减少这种不稳定性,可以采取以下措施:
1.固定随机种子
通过设置随机种子,可以使得每次训练过程中的随机性操作(如参数初始化、数据加载顺序等)保持一致,从而提高结果的稳定性。
import torch
import numpy as np
import random
def set_seed(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
np.random.seed(seed)
random.seed(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
set_seed(42)
2.增加模型训练的次数
通过增加训练轮数(epochs),可以让模型在数据上更充分地训练,从而减少不稳定性。此时要修改的参数为num_epochs
# 训练模型
num_epochs = 50
for epoch in range(num_epochs):
model.train()
for geno, pheno in train_loader:
optimizer.zero_grad()
outputs = model(geno)
loss = criterion(outputs.squeeze(), pheno)
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
3.使用更大的批量大小
此时要进行修改的是batch_size的大小,指的是一次性选取的样本数量为多少
# 创建数据加载器
train_dataset = GenoPhenoDataset(X_train, y_train)
test_dataset = GenoPhenoDataset(X_test, y_test)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
4.使用学习率调度器
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=True)
5.K折交叉验证
通过 K 折交叉验证,可以更全面地评估模型的性能,从而减少由于训练数据集划分带来的不稳定性。
6.早停法
使用早停法在验证集上监控性能,当性能不再提升时提前停止训练,避免过拟合。
early_stopping = EarlyStopping(patience=10, verbose=True)