我正在 CPU 上训练 LSTM 网络,并且在不使用数据加载器时可以获得确定性结果。但是当我使用 Pytorchs 数据加载器时,我得到了非确定性的训练错误结果,尽管从数据加载器加载的实际批次是确定性的。
我在这里种下了几乎所有我能想到的种子
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.enabled = False
这两段代码是:
optimiser = torch.optim.Adam(model_test.parameters(), learning_rate)
set_seed(42)
for t in range(num_epochs):
for batch_idx, (X_train, y_train) in enumerate(train_loader):
# Zero out gradients
optimiser.zero_grad()
# Forward pass
y_pred = model_test(X_train)
# Loss Function
loss = loss_fn(y_pred, y_train)
# Backward pass
loss.backward()
# Update parameters
optimiser.step()
if t % 100 == 0: print("Epoch ", t, "MSE: ", loss.item())
和
optimiser = torch.optim.Adam(model_test.parameters(), learning_rate)
set_seed(42)
for t in range(num_epochs):
# Zero out gradients
optimiser.zero_grad()
# Forward pass
y_pred = model_test(X_train)
# Loss Function
loss = loss_fn(y_pred, y_train)
# Backward pass
loss.backward()
# Update parameters
optimiser.step()
if t % 100 == 0: print("Epoch ", t, "MSE: ", loss.item())
我在 Github 上看到一些帖子谈到 GPU 上存在确定性问题,但这只是在 CPU 上。