Ich versuche, meine Hand mit Tensorflow nass zu werden, indem ich diese Herausforderung löste: https://www.kaggle.com/c/integer-sequence-learning.Tensorflow Verlust divergiert in meinem RNN
Meine Arbeit basiert auf diesen Blog-Beiträge:
- https://danijar.com/variable-sequence-lengths-in-tensorflow/
- https://gist.github.com/evanthebouncy/8e16148687e807a46e3f
Ein komplettes Arbeitsbeispiel - mit meinen Daten - hier gefunden werden kann: https://github.com/bottiger/Integer-Sequence-Learning das Beispiel ausführen, werden gedruckt eine Menge Debug-Informationen aus. Führen Sie execute rnn-lstm-my.py aus. (Erfordert Tensorflow und Pandas)
Der Ansatz ist ziemlich geradlinig. Ich lade alle meine Zugfolgen, speichere ihre Länge in einem Vektor und die Länge der längsten in einer Variablen, die ich '' max_length '' nenne.
In meiner Trainingsdaten I die Sequenzen, die das letzte Element in allen Streifen aus und speichern sie in einem Vektor, genannt „train_solutions“
Die I speichern alle Sequenzen, aufgefüllt mit Nullen, in einer Matrix, mit der Form: [n_seq, max_length].
Da ich die nächste Zahl in einer Sequenz vorhersagen möchte, sollte meine Ausgabe eine einzelne Zahl sein, und meine Eingabe sollte eine Sequenz sein.
Ich benutze eine RNN (tf.nn.rnn) mit einer BasicLSTMCell als Zelle, mit 24 versteckten Einheiten. Die Ausgabe wird in ein grundlegendes lineares Modell (xW + B) eingespeist, das meine Vorhersage erzeugen sollte.
Meine Kostenfunktion ist einfach die vorhergesagte Anzahl von meinem Modell, rechne ich die Kosten wie folgt aus:
cost = tf.nn.l2_loss(tf_result - prediction)
Die Grundlagen Dimensionen scheint korrekt zu sein, da der Code tatsächlich ausgeführt wird. Nach nur ein oder zwei Iterationen beginnt jedoch etwas NaN, das sich schnell ausbreitet, und alles wird zu NaN.
Hier ist der wichtige Teil des Codes, wo ich das Diagramm definieren und ausführen. Ich habe jedoch das Laden/Vorbereiten der Daten vergessen. Sehen Sie sich bitte das Git Repo an, um Details darüber zu erfahren - aber ich bin mir ziemlich sicher, dass dieser Teil korrekt ist.
cell = tf.nn.rnn_cell.BasicLSTMCell(num_hidden, state_is_tuple=True)
num_inputs = tf.placeholder(tf.int32, name='NumInputs')
seq_length = tf.placeholder(tf.int32, shape=[batch_size], name='NumInputs')
# Define the input as a list (num elements = batch_size) of sequences
inputs = [tf.placeholder(tf.float32,shape=[1, max_length], name='InputData') for _ in range(batch_size)]
# Result should be 1xbatch_szie vector
result = tf.placeholder(tf.float32, shape=[batch_size, 1], name='OutputData')
tf_seq_length = tf.Print(seq_length, [seq_length, seq_length.get_shape()], 'SequenceLength: ')
outputs, states = tf.nn.rnn(cell, inputs, dtype=tf.float32)
# Print the output. The NaN first shows up here
outputs2 = tf.Print(outputs, [outputs], 'Last: ', name="Last", summarize=800)
# Define the model
tf_weight = tf.Variable(tf.truncated_normal([batch_size, num_hidden, frame_size]), name='Weight')
tf_bias = tf.Variable(tf.constant(0.1, shape=[batch_size]), name='Bias')
# Debug the model parameters
weight = tf.Print(tf_weight, [tf_weight, tf_weight.get_shape()], "Weight: ")
bias = tf.Print(tf_bias, [tf_bias, tf_bias.get_shape()], "bias: ")
# More debug info
print('bias: ', bias.get_shape())
print('weight: ', weight.get_shape())
print('targets ', result.get_shape())
print('RNN input ', type(inputs))
print('RNN input len()', len(inputs))
print('RNN input[0] ', inputs[0].get_shape())
# Calculate the prediction
tf_prediction = tf.batch_matmul(outputs2, weight) + bias
prediction = tf.Print(tf_prediction, [tf_prediction, tf_prediction.get_shape()], 'prediction: ')
tf_result = result
# Calculate the cost
cost = tf.nn.l2_loss(tf_result - prediction)
#optimizer = tf.train.AdamOptimizer()
learning_rate = 0.05
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
minimize = optimizer.minimize(cost)
mistakes = tf.not_equal(tf.argmax(result, 1), tf.argmax(prediction, 1))
error = tf.reduce_mean(tf.cast(mistakes, tf.float32))
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
no_of_batches = int(len(train_input))/batch_size
epoch = 1
val_dict = get_input_dict(val_input, val_output, train_length, inputs, batch_size)
for i in range(epoch):
ptr = 0
for j in range(no_of_batches):
print('eval w: ', weight.eval(session=sess))
# inputs batch
t_i = train_input[ptr:ptr+batch_size]
# output batch
t_o = train_output[ptr:ptr+batch_size]
# sequence lengths
t_l = train_length[ptr:ptr+batch_size]
sess.run(minimize,feed_dict=get_input_dict(t_i, t_o, t_l, inputs, batch_size))
ptr += batch_size
print("result: ", tf_result)
print("result len: ", tf_result.get_shape())
print("prediction: ", prediction)
print("prediction len: ", prediction.get_shape())
c_val = sess.run(error, feed_dict = val_dict)
print "Validation cost: {}, on Epoch {}".format(c_val,i)
print "Epoch ",str(i)
print('test input: ', type(test_input))
print('test output: ', type(test_output))
incorrect = sess.run(error,get_input_dict(test_input, test_output, test_length, inputs, batch_size))
sess.close()
Und hier ist (die ersten Zeilen) der Ausgang es produziert. Sie können sehen, dass alles NaN werden: http://pastebin.com/TnFFNFrr (Ich konnte es nicht hier posten aufgrund der Körpergrenze)
Das erste Mal, dass ich die NaN sehen ist hier:
I tensorflow/core/Kern/logging_ops .cc: 79] Last: [0 0.76159418 0 0 0 0 0 -0,76159418 0 -0,76159418 0 0 0 0,76159418 0,76159418 0 -0,76159418 0,76159418 0 0 0 0,76159418 0 0 0 nan nan nan 0 0 nan nan 1 0 nan 0 0.76159418 Nan Nan Nan 1 0 Nan 0 0.76159418 in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in in in in in in in in in in in in in in in in in in in in in in -in -in -in -in -in -in -in -in -in -in -in - -im -in -in -in -in -in -in -in -in -in -in -in der von der von dem von dem von dem von dem von dem von dem von dem von in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in in in in in in in in in in in in in in in in in in in in in in in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in -in - -in der von der von der von der von der von der von der von der von der von der von der]
Ich hoffe, dass ich mein Problem deutlich gemacht. Vielen Dank im Voraus