【问题标题】:PyTorch: RuntimeError: element 0 of variables tuple is volatilePyTorch:RuntimeError:变量元组的元素 0 易失
【发布时间】:2018-08-08 13:56:44
【问题描述】:

我正在 PyTorch 0.3.1 中训练基于 LSTM 的模型。

我的问题是,在提高学习率后,我总是得到一个 RuntimeError 说:element 0 of variables tuple is volatile

这不会在开始时发生,而是在经过一些训练后发生,例如在 epoch 3、4、5 .. 等。

在处理此错误时,我发现 this Question on Stackoverflow 建议使用 zero_grad()。但发生错误时,它已经在使用中。

所以我的问题是:

  • 变量的元素是易失的是什么意思?
  • 变量元素变为“易失性”的可能原因有哪些?
  • 有没有办法测试哪个变量包含易失性元素,以便我可以回溯问题?

非常感谢您的任何帮助!

这是我正在使用的训练步骤的代码:

for epoch in range(num_epochs):
    states = (Var(torch.zeros(num_layers, batch_size, hidden_size)), 
              Var(torch.zeros(num_layers, batch_size, hidden_size)))
    new_batch = True
    step = 0
    epoch_loss = []
    print('Epoch: ', epoch+1)
    for i in range(0, token_ids.size(1) - seq_length, seq_length):
        #print(i)
        input_sequence = Var(token_ids[:,i:i+seq_length])
        target_sequence = Var(token_ids[:,(i+1):(i+1)+seq_length])
        entity_target_sequence = Var(entety_targets[:,(i+1):(i+1)+seq_length]).contiguous()

        if int(input_sequence )== 0:
            states = (Var(torch.zeros(num_layers, batch_size, hidden_size)), 
                      Var(torch.zeros(num_layers, batch_size, hidden_size)))
            print('New Document')
        model.zero_grad()
        states = detach(states)
        out, states, z = model(input_sequence, states)

        if new_batch:
            loss = loss_func(out, target_sequence.view(-1)) + bce_loss(z, entity_target_sequence)
            new_batch = False
        else:
            loss += loss_func(out, target_sequence.view(-1)) + bce_loss(z, entity_target_sequence)
        if (i+1) % wbatch_size == 0:
            step += 1 // seq_length
            if step % 10 == 0:
                epoch_loss.append((loss.data[0]/wbatch_size))
                print ('Epoch [%d/%d], Step[%d/%d], Loss: %.3f' % (epoch+1, num_epochs, step, num_wbatches, (loss.data[0]/wbatch_size)))
                sys.stdout.flush()

            loss.backward(retain_graph=True)
            torch.nn.utils.clip_grad_norm(model.parameters(), 0.5)
            optimizer.step()
            new_batch = True

(我省略了模型本身,以避免在这里出现代码墙并保持可读性,但如果这有助于解决问题,我当然可以添加代码。)

追溯:

Traceback (most recent call last):
  File "ent_lm.py", line 223, in <module>
    loss.backward(retain_graph=True)
  File "/usr/local/lib/python3.6/site-packages/torch/autograd/variable.py", line 167, in backward
    torch.autograd.backward(self, gradient, retain_graph, create_graph, retain_variables)
  File "/usr/local/lib/python3.6/site-packages/torch/autograd/__init__.py", line 99, in backward
    variables, grad_variables, retain_graph)

【问题讨论】:

    标签: python neural-network deep-learning gradient pytorch


    【解决方案1】:

    您提供的代码似乎没问题。

    错误似乎发生在以下两个函数之一期间。

    states = detach(states)
    out, states, z = model(input_sequence, states)
    

    我认为部分原因可能是您需要“保留图表”,但是当您分离状态或在模型中执行其他操作时,您会不断重置图表。

    【讨论】:

    • 感谢您的回答!有什么办法可以追溯吗?意味着任何测试哪些变量在什么位置导致这种情况的方法。你有什么资源可以让我了解变量元组的一个元素是易失的实际上意味着什么?
    • 您可以在此处阅读有关 volatile 的更多信息:pytorch.org/docs/master/… 我将通过首先删除 retain_graph=True 来测试它,因为您没有使用该模型两次,因此您不需要保留旧渐变然后从那里出发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多