4

我目前正在计划我的第一个Conv。 NN在Tensorflow中的实现,并且已经阅读了Tensorflow的website上提供的许多教程以获取见解。TensorFlow:tf.layers vs低级API

看来,有两种基本的方法来创建自定义CNN:

1)使用Tensorflow层模块tf.layers,这是“高级API”。使用此方法,您可以定义一个由tf.layers对象组成的模型定义函数,并在主函数中实例化一个tf.learn.Estimator,将模型定义函数传递给它。从这里,可以分别在Estimator对象上调用fit()evaluate()方法,该对象分别进行训练和验证。链接:https://www.tensorflow.org/tutorials/layers。下面主要功能:

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) 

完整代码here


2)使用Tensorflow的 “低级API”,其中层以定义功能定义。在这里,图层是手动定义的,用户必须手动执行许多计算。在主要功能中,用户启动tf.Session(),并使用循环手动配置培训/验证。链接:https://www.tensorflow.org/get_started/mnist/pros。以下主要功能:

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})) 

的完整代码here


我的困境是,我喜欢定义使用tf.layers(选项1)神经网络的简单,但我想培训的定制是“低级API”(选项2)提供。具体来说,当使用tf.layers实现时,是否有一种方法可以每n次迭代训练报告验证准确度?或者更一般地说,我可以使用tf.Session()进行培训/验证,还是仅限于使用tf.learn.Estimatorfit()evaluate()方法?

在所有培训完成后,人们会希望获得最终评估分数,这似乎很奇怪,因为我认为整个验证的重点是跟踪培训期间的网络进展。否则,验证和测试之间会有什么区别?

任何帮助,将不胜感激。

回答

2

你几乎正确tf.layersEstimator类别的功能是分开的如果你想你可以使用tf.Layers来定义你的图层,但是然后建立你自己的训练循环或任何你喜欢的东西。你可以认为tf.Layers就是你可以在上面的第二个选项中创建的那些功能。

如果您有兴趣能够快速构建基本模型,但可以使用其他功能,自己的训练循环等进行扩展,那么没有理由不能使用图层来构建模型和进行交互无论你希望如何。

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

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