2017-07-17 7 views
0

Ich arbeite an einem LSTM, der Text generiert, und ich habe Probleme, zuvor trainierte Modelle wiederzuverwenden. Ich habe meinen Code unten unter Verwendung der tensorflow website als Ressource aufgeteilt.Probleme beim Speichern und Wiederherstellen des Tensorflow-Modells (LSTM)

Hier stelle ich alle meine Variablen:

graph = tf.Graph() 

with graph.as_default(): 
    global_step = tf.Variable(0) 

    data = tf.placeholder(tf.float32, [batch_size, len_section, char_size]) 
    labels = tf.placeholder(tf.float32, [batch_size, char_size]) 

    ..... 

    #Reset at the beginning of each test 
    reset_test_state = tf.group(test_output.assign(tf.zeros([1, hidden_nodes])), 
           test_state.assign(tf.zeros([1, hidden_nodes]))) 

    #LSTM 
    test_output, test_state = lstm(test_data, test_output, test_state) 
    test_prediction = tf.nn.softmax(tf.matmul(test_output, w) + b) 

    saver = tf.train.Saver() 

Hier trainiere ich mein Modell und einen Kontrollpunkt bei 30 Iterationen

with tf.Session(graph = graph) as sess: 
    tf.global_variables_initializer().run() 
    offset = 0 

    for step in range(10000): 

     offset = offset % len(X) 

     if offset <= (len(X) - batch_size): 

      batch_data = X[offset: offset + batch_size] 
      batch_labels = y[offset:offset+batch_size] 
      offset += batch_size 

     else: 
      to_add = batch_size - (len(X) - offset) 
      batch_data = np.concatenate((X[offset: len(X)], X[0: to_add])) 
      batch_labels = np.concatenate((y[offset: len(X)], y[0: to_add])) 
      offset = to_add 

     _, training_loss = sess.run([optimizer, loss], feed_dict = {data : batch_data, labels : batch_labels}) 

     if step % 10 == 0: 
      print('training loss at step %d: %.2f (%s)' % (step, training_loss, datetime.datetime.now())) 

     if step % save_every == 0: 
      saver.save(sess, checkpoint_directory + '/model.ckpt', global_step=step) 

     if step == 30: 
      break 

ich in diesem Verzeichnis suchen zu sparen und die folgenden Dateien waren erstellt:

enter image description here

Her e ich trainierte Modell angeblich bin Wiederherstellung und Test es:

with tf.Session(graph=graph) as sess: 
    #standard init step 
    offset = 0 
    saver = tf.train.Saver() 
    saver.restore(sess, "/ckpt/model-150.meta") 
    tf.global_variables_initializer().run() 

    test_start = "I plan to make this world a better place " 
    test_generated = test_start 

.... 

dies Nachdem ich bekomme ich folgende Fehlermeldung:

DataLossError (see above for traceback): Unable to open table file /ckpt/model.ckpt-30.meta: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator? 

Ich bin nicht ganz sicher, was ich falsch mache. Das Tutorial scheint ziemlich einfach zu sein, aber mir fehlt offensichtlich etwas. Jede Art von Feedback würde sehr geschätzt werden.

Antwort

1

Beachten Sie zuerst, dass wenn Sie alle Variablen nach der Wiederherstellung von einem Prüfpunkt initialisieren, Sie ihre zufälligen Anfangswerte anstelle der trainierten Werte erhalten.

Zweitens ist es viel einfacher zu erreichen, speichern/Wiederherstellen richtig, wenn Sie tf.estimator.Estimator statt diese selbst zu implementieren.

Drittens verstehe ich nicht, wie Sie model-150.meta übergeben, um wiederherzustellen, aber einen Fehler über model-30.meta zu sehen. Ich glaube jedoch, dass Sie nur model-30 (ohne das Suffix .meta) übergeben sollten.

Verwandte Themen