PyTorch训练神经网络模型时如何正确开启数据shuffle模式?
错误原因
你之前的随机重排写法只打乱了输入x_data的顺序,没有同步打乱对应标签y_data的顺序,输入和标签的配对关系完全被破坏,模型接收到的是错配的训练样本,训练效果必然极差。
正确实现方法
方法1:手动同步打乱(适配原有全量训练逻辑)
使用torch.randperm生成统一的随机排列索引,同时作用于输入和标签,保证二者的对应关系不变,替换原有训练循环即可:
model = FCN(1,1,50,4) optimizer = torch.optim.Adam(model.parameters(),lr=15e-3, weight_decay=15e-3/4000) data_length = len(x_data) for i in range(4000): optimizer.zero_grad() # 生成覆盖全量数据的随机索引 shuffle_idx = torch.randperm(data_length) # 输入、标签用同一索引打乱 x_input = x_data[shuffle_idx] y_label = y_data[shuffle_idx] yhh = model(x_input) loss = torch.mean((yhh - y_label)**2) loss.backward() optimizer.step()
方法2:使用PyTorch内置DataLoader(推荐)
这是PyTorch框架下的标准数据加载写法,内置shuffle逻辑,不需要手动维护索引,同时支持小批量训练,训练稳定性和效率更高:
from torch.utils.data import TensorDataset, DataLoader # 打包输入、标签为标准数据集 train_dataset = TensorDataset(x_data, y_data) # 初始化加载器,开启shuffle,batch_size设为全量数据长度时和原训练逻辑一致,也可设为32/64等做小批量训练 train_loader = DataLoader( train_dataset, batch_size=len(train_dataset), shuffle=True ) model = FCN(1,1,50,4) optimizer = torch.optim.Adam(model.parameters(),lr=15e-3, weight_decay=15e-3/4000) for i in range(4000): for x_batch, y_batch in train_loader: optimizer.zero_grad() yhh = model(x_batch) loss = torch.mean((yhh - y_batch)**2) loss.backward() optimizer.step()
注意事项
- 不要使用numpy的随机选择接口处理PyTorch张量索引,容易出现维度不匹配、设备不兼容的问题,优先使用
torch.randperm生成打乱索引。 - 小批量训练时shuffle带来的泛化性提升会比全量训练更明显,可以根据数据规模调整batch_size参数。
内容的提问来源于stack exchange,提问作者Ali Hosseinli
相关产品推荐
相关产品推荐

