2016-08-04 51 views
0

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:

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

Antwort

0

Verwenden AdamOptimizer statt

optimizer = tf.train.AdamOptimizer()