4

Ich bin gerade dabei, meine erste Conv. NN-Implementierung in Tensorflow, und haben viele der Tutorials auf Tensorflow website für Einblicke gelesen.TensorFlow: tf.layers vs Low-Level-API

Es scheint, dass es im Wesentlichen zwei Möglichkeiten, sind eine kundenspezifische CNN zu erstellen:

1) Verwendung Tensorflow Schichten tf.layers Module, das der "High-Level-API" ist. Mit dieser Methode definieren Sie eine Modelldefinitionsfunktion, die aus tf.layers-Objekten besteht, und instanziieren Sie in der Hauptfunktion eine und übergeben Sie ihr die Modelldefinitionsfunktion. Von hier aus können die fit() und evaluate() Methoden auf dem Objekt Estimator aufgerufen werden, die jeweils trainieren und validieren. Link: https://www.tensorflow.org/tutorials/layers. Hauptfunktion unter:

def main(unused_argv): 
    # Load training and eval data 
    mnist = learn.datasets.load_dataset("mnist") 
    train_data = mnist.train.images # Returns np.array 
    train_labels = np.asarray(mnist.train.labels, dtype=np.int32) 
    eval_data = mnist.test.images # Returns np.array 
    eval_labels = np.asarray(mnist.test.labels, dtype=np.int32) 

    # Create the Estimator 
    mnist_classifier = learn.Estimator(
     model_fn=cnn_model_fn, model_dir="/tmp/mnist_convnet_model") 

    # Set up logging for predictions 
    # Log the values in the "Softmax" tensor with label "probabilities" 
    tensors_to_log = {"probabilities": "softmax_tensor"} 
    logging_hook = tf.train.LoggingTensorHook(
     tensors=tensors_to_log, every_n_iter=50) 

    # Train the model 
    mnist_classifier.fit(
     x=train_data, 
     y=train_labels, 
     batch_size=100, 
     steps=20000, 
     monitors=[logging_hook]) 

    # Configure the accuracy metric for evaluation 
    metrics = { 
     "accuracy": 
      learn.MetricSpec(
       metric_fn=tf.metrics.accuracy, prediction_key="classes"), 
    } 

    # Evaluate the model and print results 
    eval_results = mnist_classifier.evaluate(
     x=eval_data, y=eval_labels, metrics=metrics) 
    print(eval_results) 

vollständiger Code here


2) Verwenden Tensorflow der "Low-Level-API", in den Schichten in einer Definitionsfunktion definiert. Hier werden Ebenen manuell definiert und der Benutzer muss viele Berechnungen manuell durchführen. In der Hauptfunktion startet der Benutzer eine tf.Session() und konfiguriert manuell Training/Validierung mit for-Schleife (n). Link: https://www.tensorflow.org/get_started/mnist/pros. Hauptfunktion unter:

def main(_): 
    # Import data 
    mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) 

    # Create the model 
    x = tf.placeholder(tf.float32, [None, 784]) 

    # Define loss and optimizer 
    y_ = tf.placeholder(tf.float32, [None, 10]) 

    # Build the graph for the deep net 
    y_conv, keep_prob = deepnn(x) 

    with tf.name_scope('loss'): 
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, 
                 logits=y_conv) 
    cross_entropy = tf.reduce_mean(cross_entropy) 

    with tf.name_scope('adam_optimizer'): 
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 

    with tf.name_scope('accuracy'): 
    correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) 
    correct_prediction = tf.cast(correct_prediction, tf.float32) 
    accuracy = tf.reduce_mean(correct_prediction) 

    graph_location = tempfile.mkdtemp() 
    print('Saving graph to: %s' % graph_location) 
    train_writer = tf.summary.FileWriter(graph_location) 
    train_writer.add_graph(tf.get_default_graph()) 

    with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(20000): 
     batch = mnist.train.next_batch(50) 
     if i % 100 == 0: 
     train_accuracy = accuracy.eval(feed_dict={ 
      x: batch[0], y_: batch[1], keep_prob: 1.0}) 
     print('step %d, training accuracy %g' % (i, train_accuracy)) 
     train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) 

    print('test accuracy %g' % accuracy.eval(feed_dict={ 
     x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})) 

Voll Code here


Mein Dilemma ist, ich mag die Einfachheit des neuronalen Netzes definiert, mit tf.layers (Option 1), aber ich möchte die Anpassbarkeit der Ausbildung, die die "Low-Level-API" (Option 2) bietet. Gibt es bei Verwendung der tf.layers-Implementierung eine Möglichkeit, die Validierungsgenauigkeit bei jedem Trainingsnull zu melden? Oder allgemeiner: Kann ich unter Verwendung der tf.Session() trainieren/validieren, oder bin ich darauf beschränkt, die Methoden tf.learn.Estimatorfit() und evaluate() zu verwenden?

Es scheint seltsam, dass man nach Abschluss des gesamten Trainings einen abschließenden Bewertungseffekt haben möchte, da ich dachte, der ganze Sinn der Validierung bestehe darin, den Netzwerkfortschritt während des Trainings zu verfolgen. Was wäre sonst der Unterschied zwischen Validierung und Testen?

Jede Hilfe wäre willkommen.

Antwort

2

Sie sind fast richtig aber tf.layers ist getrennt von der Estimator Klasse von Funktionen usw. Wenn Sie wollten, könnten Sie tf.Layers verwenden, um Ihre Schichten zu definieren, aber dann Ihre eigenen Trainingsloops oder was auch immer Sie mögen. Sie können sich denken, tf.Layers sind nur diejenigen Funktionen, die Sie in Ihrer zweiten Option oben erstellen konnten.

Wenn Sie daran interessiert sind, ein Basismodell schnell aufzubauen, es aber mit anderen Funktionen, eigenen Trainingsschleifen usw. erweitern können, dann gibt es keinen Grund, dass Sie Layer nicht zum Modellieren und Interagieren verwenden können damit aber wie du willst.

tf.Layers - https://www.tensorflow.org/api_docs/python/tf/layers

tf.Estimator - https://www.tensorflow.org/api_docs/python/tf/estimator