python - tensorflow LSTM 模型中的 NaN 损失

标签 python tensorflow lstm

以下网络代码,应该是您经典的简单 LSTM 语言模型,一段时间后开始输出 nan 损失...在我的训练集上它需要几个小时,而且我无法在较小的数据集上轻松复制它。但它总是在认真的训练中发生。

Sparse_softmax_with_cross_entropy 应该在数值上是稳定的,所以这不是原因......但除此之外,我没有看到任何其他节点可能会导致图中出现问题。可能是什么问题?

class MyLM():
    def __init__(self, batch_size, embedding_size, hidden_size, vocab_size):
        self.x = tf.placeholder(tf.int32, [batch_size, None])  # [batch_size, seq-len]
        self.lengths = tf.placeholder(tf.int32, [batch_size])  # [batch_size]

        # remove padding. [batch_size * seq_len] -> [batch_size * sum(lengths)]
        mask = tf.sequence_mask(self.lengths)  # [batch_size, seq_len]
        mask = tf.cast(mask, tf.int32)  # [batch_size, seq_len]
        mask = tf.reshape(mask, [-1])  # [batch_size * seq_len]

        # remove padding + last token. [batch_size * seq_len] -> [batch_size * sum(lengths-1)]
        mask_m1 = tf.cast(tf.sequence_mask(self.lengths - 1, maxlen=tf.reduce_max(self.lengths)), tf.int32)  # [batch_size, seq_len]
        mask_m1 = tf.reshape(mask_m1, [-1])  # [batch_size * seq_len]

        # remove padding + first token.  [batch_size * seq_len] -> [batch_size * sum(lengths-1)]
        m1_mask = tf.cast(tf.sequence_mask(self.lengths - 1), tf.int32)  # [batch_size, seq_len-1]
        m1_mask = tf.concat([tf.cast(tf.zeros([batch_size, 1]), tf.int32), m1_mask], axis=1)  # [batch_size, seq_len]
        m1_mask = tf.reshape(m1_mask, [-1])  # [batch_size * seq_len]

        embedding = tf.get_variable("TokenEmbedding", shape=[vocab_size, embedding_size])
        x_embed = tf.nn.embedding_lookup(embedding, self.x)  # [batch_size, seq_len, embedding_size]

        lstm = tf.nn.rnn_cell.LSTMCell(hidden_size, use_peepholes=True)

        # outputs shape: [batch_size, seq_len, hidden_size]
        outputs, final_state = tf.nn.dynamic_rnn(lstm, x_embed, dtype=tf.float32,
                                                 sequence_length=self.lengths)
        outputs = tf.reshape(outputs, [-1, hidden_size])  # [batch_size * seq_len, hidden_size]

        w = tf.get_variable("w_out", shape=[hidden_size, vocab_size])
        b = tf.get_variable("b_out", shape=[vocab_size])
        logits_padded = tf.matmul(outputs, w) + b  # [batch_size * seq_len, vocab_size]
        self.logits = tf.dynamic_partition(logits_padded, mask_m1, 2)[1]  # [batch_size * sum(lengths-1), vocab_size]

        predict = tf.argmax(logits_padded, axis=1)  # [batch_size * seq_len]
        self.predict = tf.dynamic_partition(predict, mask, 2)[1]  # [batch_size * sum(lengths)]

        flat_y = tf.dynamic_partition(tf.reshape(self.x, [-1]), m1_mask, 2)[1]  # [batch_size * sum(lengths-1)]

        self.cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.logits, labels=flat_y)
        self.cost = tf.reduce_mean(self.cross_entropy)
        self.train_step = tf.train.AdamOptimizer(learning_rate=0.01).minimize(self.cost)

最佳答案

检查提供给模型的列,在我的例子中,有一列具有 NaN 值,在删除 NaN 后,它起作用了

关于python - tensorflow LSTM 模型中的 NaN 损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45886645/

相关文章:

Python 3.5 - Selenium - 如何处理新窗口并等待它完全加载?

java - 从 java 运行 python 脚本产生 KeyError

python - 如何在 tensorflow 2.0 中累积梯度?

machine-learning - 将静态数据(不随时间变化)添加到 LSTM 中的序列数据

python - 外部网络摄像头不适用于 Opencv 和 Python

tensorflow - 在 Keras 中未检测到 GCP GPU

python - 在CPU为python2.7的Mac上安装Keras/Tensorflow

tensorflow - 使用 Keras Functional API 将时间序列与 RNN/LSTM 中的时不变数据相结合

machine-learning - 时间序列的 LSTM

python - 在 OS X 10.7 Lion 上安装 pycurl