在使用OpenNMT-py对模型进行训练时,我们得到一个包含网络权重和偏差的数据作为输出。但是,这些张量具有requires_grad = False,因此没有梯度。例如。有了一层,我们可能有以下张量,表示嵌入以及权重和偏差的编码器和解码器。它们都没有梯度属性。
encoder.embeddings.emb_luts.0.weight
decoder.embeddings.emb_luts.0.weight
encoder.rnn.weight_ih_l0
encoder.rnn.weight_hh_l0
encoder.rnn.bias_ih_l0
encoder.rnn.bias_hh_l0
decoder.rnn.layers.0.weight_ih
decoder.rnn.layers.0.weight_hh
decoder.rnn.layers.0.bias_ih
decoder.rnn.layers.0.bias_hh
OpenNMT-py可以用一些我还没有找到的选项来设置requires_gradient = True,还是有其他方法来获得这些张量的梯度?
发布于 2019-06-05 12:38:02
只有在训练循环中才能访问梯度,其中调用了optim.step()。如果您想将梯度(或梯度规范或其他什么)记录到TensorBoard中,您可能最好在调用优化器步骤之前获得它们。这种情况发生在_gradient_accumulation对象的Trainer方法中。
请注意,有两个地方调用optim.step()。使用哪一个取决于是在每个批处理之后进行更新,还是从多个批累积渐变,然后再进行更新。
https://stackoverflow.com/questions/56447123
复制相似问题