Я реализую настройку автоматического кодирования, где и кодер, и декодеры являются рекуррентными нейронными сетями (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]]
Что-то не так с кодом по своей сути?Предложения приветствуются.Заранее спасибо.