【发布时间】:2020-04-09 13:43:09
【问题描述】:
我正在训练一个序列到序列 (seq2seq) 模型,我有不同的值要针对 input_sequence_length 进行训练。
对于值 10 和 15,我得到了可以接受的结果,但是当我尝试使用 20 进行训练时,我得到 内存错误 所以我将训练切换为分批训练,但是模型 过度拟合 并且验证损失会爆炸,即使使用累积的梯度,我也会得到相同的行为,所以我正在寻找提示并导致更准确的更新方法。
这是我的训练功能(仅限批处理部分):
if batch_size is not None:
k=len(list(np.arange(0,(X_train_tensor_1.size()[0]//batch_size-1), batch_size )))
for epoch in range(num_epochs):
optimizer.zero_grad()
epoch_loss=0
for i in list(np.arange(0,(X_train_tensor_1.size()[0]//batch_size-1), batch_size )): # by using equidistant batch till the last one it becomes much faster than using the X.size()[0] directly
sequence = X_train_tensor[i:i+batch_size,:,:].reshape(-1, sequence_length, input_size).to(device)
labels = y_train_tensor[i:i+batch_size,:,:].reshape(-1, sequence_length, output_size).to(device)
# Forward pass
outputs = model(sequence)
loss = criterion(outputs, labels)
epoch_loss+=loss.item()
# Backward and optimize
loss.backward()
optimizer.step()
epoch_loss=epoch_loss/k
model.eval
validation_loss,_= evaluate(model,X_test_hard_tensor_1,y_test_hard_tensor_1)
model.train()
training_loss_log.append(epoch_loss)
print ('Epoch [{}/{}], Train MSELoss: {}, Validation : {} {}'.format(epoch+1, num_epochs,epoch_loss,validation_loss))
编辑: 这是我正在训练的参数:
batch_size = 1024
num_epochs = 25000
learning_rate = 10e-04
optimizer=torch.optim.Adam(model.parameters(), lr=learning_rate)
criterion = nn.MSELoss(reduction='mean')
【问题讨论】:
-
你的批量大小是多少?
-
如果您的 batch_size 很小,那么就好像您正在逐个查看每个单词,因此您的模型会过拟合。根据您的计算机内存,我建议 batch_size 为 32/64 或 2^{i} 的倍数。出于好奇,您当前的 batch_size 是多少?
-
你能把
memory errors也发一下吗?因为它有助于理解并使用它来重现问题。 -
您使用哪种优化器?
-
根据有关的错误永远记住:有多种选择要处理,但更合适的解决方案是因为 mini-batch 的数据不适合到
GPU memory。 只需减小批量大小(它肯定会起作用)。当我为cifar10数据集设置batch size = 256时,我得到了同样的错误;然后我设置了batch size = 128,就解决了。尝试将批量大小从1024减少到512。看看它是否有效。
标签: python machine-learning neural-network pytorch training-data