2017-08-11 3 views
0

Ich verwende TensorFlow 1.2.1 unter Windows 10 und verwende die Estimator API. Alles läuft ohne Fehler, aber jedes Mal, wenn ich die Parameter von einem Prüfpunkt wiederherstellen muss, funktioniert ein Teil davon nicht. Ich habe überprüft, dass die Werte jeder Variablen in classifier.get_variable_names() sich nach einer Auswertung nicht ändern, jedoch springt der Verlust bis nahe dorthin, wo er begonnen hat, gefolgt von einem weiteren Lernen, wobei jedes Mal schneller gelernt wird als das letzte .TensorFlow Estimator, der alle Variablen korrekt wiederherstellt, aber Verlustspitzen nachher

Dies geschieht innerhalb eines TensorFlow-Laufs, wenn ein Validierungs- oder Evaluierungslauf stattfindet oder wenn ich die Python-Datei erneut ausfühle, um mit dem Training fortzufahren.

Die folgenden Diagramme sind ein Beispiel für dieses Problem, wiederherstellen sie die Variablen alle 2500 Schritte:

http://imgur.com/6q9Wuat

http://imgur.com/CQ2hdR8

Der folgende Code ist eine significiantly reduzierte Version meines Codes, die noch repliziert den Fehler:

import tensorflow as tf 
from tensorflow.contrib import learn 
from tensorflow.contrib.learn.python.learn.estimators import model_fn as model_fn_lib 

tf.logging.set_verbosity(tf.logging.INFO) 

sess = tf.InteractiveSession() 

def cnn_model_fn(features, labels, mode): 

    dense_layer1 = tf.layers.dense(inputs=features, units=512, activation=tf.nn.relu, name="FC_1") 
    dense_layer2 = tf.layers.dense(inputs=dense_layer1, units=1024, activation=tf.nn.relu, name="FC_2") 
    dense_layer3 = tf.layers.dense(inputs=dense_layer2, units=2048, activation=tf.nn.relu, name="FC_3") 
    dense_layer4 = tf.layers.dense(inputs=dense_layer3, units=512, activation=tf.nn.relu, name="FC_4") 
    logits = tf.layers.dense(inputs=dense_layer4, units=2, name="logit_layer") 

    loss = None 
    train_op = None 

    if mode != learn.ModeKeys.INFER: 
     loss = tf.losses.softmax_cross_entropy(
      onehot_labels=labels, logits=logits) 

    if mode == learn.ModeKeys.TRAIN: 
     train_op = tf.contrib.layers.optimize_loss(
      loss=loss, 
      global_step=tf.contrib.framework.get_global_step(), 
      learning_rate=.001, 
      optimizer="SGD") 

    predictions = { 
     "classes": tf.argmax(input=logits, axis=1), 
     "probabilities": tf.nn.softmax(
     logits, name="softmax_tensor")} 


    return model_fn_lib.ModelFnOps(
     mode=mode, 
     predictions=predictions, 
     loss=loss, 
     train_op=train_op) 



def main(unused_param): 
    def data_pipeline(filenames, batch_size, num_epochs=None, min_after_dequeue=10000): 
     with tf.name_scope("data_pipeline"): 
      filename_queue = tf.train.string_input_producer(filenames, num_epochs=num_epochs) 

      reader = tf.TextLineReader() 
      key, value = reader.read(filename_queue) 

      row = tf.decode_csv(value, record_defaults=[[0.0] for _ in range(66)]) 

      example_op, label_op = tf.stack(row[:len(row)-2]), tf.stack(row[len(row)-2:]) 

      capacity = min_after_dequeue + 3 * batch_size 

      example_batch, label_batch = tf.train.shuffle_batch(
       [example_op, label_op], 
       batch_size=batch_size, 
       capacity=capacity, 
       min_after_dequeue=min_after_dequeue) 

      return example_batch, label_batch 


    def input_data_fn(data_getter_ops): 
     batch, labels = sess.run(data_getter_ops) 
     return tf.constant(batch, dtype=tf.float32), tf.constant(labels, dtype=tf.float32) 

    NUM_EPOCHS = 6  
    BATCHES_IN_TRAINING_EPOCH = 8000 


    training_data_pipe_ops = data_pipeline(
     filenames=["train_data.csv"], 
     batch_size=500, 
     min_after_dequeue=10000) 

    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 

    classifier = tf.contrib.learn.Estimator(
     model_fn=cnn_model_fn, 
     model_dir="/tmp/bug_finder") 

    for j in range(NUM_EPOCHS): 
     classifier.fit(
      input_fn=lambda: input_data_fn(training_data_pipe_ops), 
      steps = BATCHES_IN_TRAINING_EPOCH) 

     print("Epoch", str(j+1), "training completed.") 

    coord.request_stop() 
    coord.join(threads) 


if __name__ == "__main__": 
    tf.app.run() 

Antwort

0

Ich fand das Problem, ich war c Ermitteln von Datenpipelines mit der interaktiven Sitzung, die ich erstellt habe, und dann mit meiner Eingabefunktion die Beispiele bewerten (wie ein Feed-Dictionary). Der Grund dafür ist, dass die Estimator-Klasse eine eigene Sitzung (eine MonitoredTraininSession) erstellt und da die Diagrammoperationen nicht innerhalb eines Aufrufs der Estimator-Klasse (und damit ihrer Sitzung) erstellt wurden, waren sie nicht vorhanden Gerettet. Die Verwendung einer Eingabefunktion zum Erstellen der Graphenoperationen und zum Zurückgeben der letzten Graphenoperation (der Stapelverarbeitung) hat dazu geführt, dass alles reibungslos funktioniert.

Verwandte Themen