RNN выводит NaN после обновления веса - PullRequest
3 голосов
/ 24 сентября 2019

Я реализую настройку автоматического кодирования, где и кодер, и декодеры являются рекуррентными нейронными сетями (RNN).Модель кодера и декодера инициализируется следующим образом:

def enc(message, weights, biases):
    message = tf.unstack(message, 4, 1)
    fw_cell = rnn.LSTMCell(num_hidden_enc)
    with tf.variable_scope("encoder"):
        outputs, _ = rnn.static_rnn(fw_cell, message, dtype=tf.float32)
    return tf.matmul(outputs[-1], weights) + biases

def dec(codeword, weights, biases, time_steps):
    codeword = tf.expand_dims(codeword, axis=2)
    codeword = tf.unstack(codeword, 7, 1)
    fw_cell = rnn.LSTMCell(num_hidden_dec)
    with tf.variable_scope("decoder"):
        outputs, _ = rnn.static_rnn(fw_cell, codeword, dtype=tf.float32)
    a = tf.matmul(outputs[-1], weights) + biases
    weight_fc = np.random.normal(loc=0.0, scale=0.01, size=[4, 4])
    init = tf.constant_initializer(weight_fc)
    return tf.layers.dense(a, units=4, activation=tf.nn.sigmoid, kernel_initializer=init)

И я использую mean square error функцию потерь вместе с Adam оптимизатором.

# message_hat is the output of the decoder neural network, input_bits is the input to the encoder network
loss = tf.reduce_sum(0.5 * (tf.squeeze(input_bits) - message_hat) ** 2) / float(batch_size)
opt = tf.train.AdamOptimizer().minimize(loss)

Когда явывести выходные данные сети декодера в конце эпохи 0, я получу некоторые значения с плавающей запятой, но как только я выполню еще одну эпоху, все значения по умолчанию будут равны NaN.Это верно как для кодера, так и для декодера.Поэтому я попытался обрезать градиент, используя следующий код:

opt = tf.train.AdamOptimizer()
gvs = opt.compute_gradients(loss)
capped_gvs = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gvs]
train_op = opt.apply_gradients(capped_gvs)

Все еще с той же проблемой.Точнее, это вывод начиная с эпохи 1:

Epoch: 1
Decoding loss: nan
Decoder output: [[nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]
 [nan nan nan nan nan nan nan]]

Что-то не так с кодом по своей сути?Предложения приветствуются.Заранее спасибо.

...