tensorflow学习笔记十四:TF官方教程学习 tf.contrib.learn Quickstart

来源:互联网 发布:js删除注释工具 编辑:程序博客网 时间:2024/05/22 13:00

TensorFlow高级API(tf.contrib.learn)及可视化工具TensorBoard的使用

一.TensorFlow高层次机器学习API (tf.contrib.learn)

1.tf.contrib.learn.datasets.base.load_csv_with_header 加载csv格式数据

2.tf.contrib.learn.DNNClassifier 建立DNN模型(classifier)

3.classifer.fit 训练模型

4.classifier.evaluate 评价模型

5.classifier.predict 预测新样本

完整代码:

复制代码
 1 from __future__ import absolute_import 2 from __future__ import division 3 from __future__ import print_function 4  5 import tensorflow as tf 6 import numpy as np 7  8 # Data sets 9 IRIS_TRAINING = "iris_training.csv"10 IRIS_TEST = "iris_test.csv"11 12 # Load datasets.13 training_set = tf.contrib.learn.datasets.base.load_csv_with_header(14     filename=IRIS_TRAINING,15     target_dtype=np.int,16     features_dtype=np.float32)17 test_set = tf.contrib.learn.datasets.base.load_csv_with_header(18     filename=IRIS_TEST,19     target_dtype=np.int,20     features_dtype=np.float32)21 22 # Specify that all features have real-value data23 feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]24 25 # Build 3 layer DNN with 10, 20, 10 units respectively.26 classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,27                                             hidden_units=[10, 20, 10],28                                             n_classes=3,29                                             model_dir="/tmp/iris_model")30 31 # Fit model.32 classifier.fit(x=training_set.data,33                y=training_set.target,34                steps=2000)35 36 # Evaluate accuracy.37 accuracy_score = classifier.evaluate(x=test_set.data,38                                      y=test_set.target)["accuracy"]39 print('Accuracy: {0:f}'.format(accuracy_score))40 41 # Classify two new flower samples.42 new_samples = np.array(43     [[6.4, 3.2, 4.5, 1.5], [5.8, 3.1, 5.0, 1.7]], dtype=float)44 y = list(classifier.predict(new_samples, as_iterable=True))45 print('Predictions: {}'.format(str(y)))
复制代码

 结果:

Accuracy:0.966667

 

二.在tf.contrib.learn中创建input函数(输入预处理函数)

格式:

def my_input_fn():

  # Preprocess your data here...

  # ...then return 1) a mapping of feature columns to Tensors with
  # the corresponding feature data, and 2) a Tensor containing labels
  return feature_cols, labels

其中,frature_cols是一个字典,包含键值对可以将特征中的列名集Tensor s中包含的特征数据对应起来。

而labels 则是一个包含你的标签值的张量。

那么如何将你的特征数据转换成张量?

如果你的特征、标签数据保存in pandas dataframes or numpy arrays, 保存你需要转换它们到张量s中before returning it form your input_fn.

对于连续的数据,你可以用tf.constant新建并填充张量;而对于稀疏、分类数据(数值多数是0),你可能需要用一个稀疏张量SparseTensor,它带有三个参数:【张量的形状,指明包含非零值的元素的位置,指明非零元素的值】

下面是一个对波士顿房屋价格的神经网络完整代码。在本教程的其余部分,你将预处理从UCI的波士顿房价数据集的子集,并将其输入到一个神经网络回归进行预测房价中间值功能

完整代码:

复制代码
 1 #  Copyright 2016 The TensorFlow Authors. All Rights Reserved. 2 # 3 #  Licensed under the Apache License, Version 2.0 (the "License"); 4 #  you may not use this file except in compliance with the License. 5 #  You may obtain a copy of the License at 6 # 7 #   http://www.apache.org/licenses/LICENSE-2.0 8 # 9 #  Unless required by applicable law or agreed to in writing, software10 #  distributed under the License is distributed on an "AS IS" BASIS,11 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12 #  See the License for the specific language governing permissions and13 #  limitations under the License.14 """DNNRegressor with custom input_fn for Housing dataset."""15 16 from __future__ import absolute_import17 from __future__ import division18 from __future__ import print_function19 20 import itertools21 22 import pandas as pd23 import tensorflow as tf24 # set logging verbosity to INFO 25 tf.logging.set_verbosity(tf.logging.INFO)26 #Define the column names for the data set in COLUMNS.To distinguish features from the label,also define FEATURES and LABEL.       # Then read the three CSVs into pandas DataFrame s:
27 COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",28            "dis", "tax", "ptratio", "medv"]29 FEATURES = ["crim", "zn", "indus", "nox", "rm",30             "age", "dis", "tax", "ptratio"]31 LABEL = "medv"32 33 34 def input_fn(data_set):35   feature_cols = {k: tf.constant(data_set[k].values) for k in FEATURES}36   labels = tf.constant(data_set[LABEL].values)37   return feature_cols, labels38 39 40 def main(unused_argv):41   # Load datasets42   training_set = pd.read_csv("boston_train.csv", skipinitialspace=True,43                              skiprows=1, names=COLUMNS)44   test_set = pd.read_csv("boston_test.csv", skipinitialspace=True,45                          skiprows=1, names=COLUMNS)46 47   # Set of 6 examples for which to predict median house values48   prediction_set = pd.read_csv("boston_predict.csv", skipinitialspace=True,49                                skiprows=1, names=COLUMNS)50 51   # Feature cols52   feature_cols = [tf.contrib.layers.real_valued_column(k)53                   for k in FEATURES]54 55   # Build 2 layer fully connected DNN with 10, 10 units respectively.56   regressor = tf.contrib.learn.DNNRegressor(feature_columns=feature_cols,57                                             hidden_units=[10, 10],58                                             model_dir="/tmp/boston_model")59 60   # Fit61   regressor.fit(input_fn=lambda: input_fn(training_set), steps=5000)62 63   # Score accuracy64   ev = regressor.evaluate(input_fn=lambda: input_fn(test_set), steps=1)65   loss_score = ev["loss"]66   print("Loss: {0:f}".format(loss_score))67 68   # Print out predictions69   y = regressor.predict(input_fn=lambda: input_fn(prediction_set))70   # .predict() returns an iterator; convert to a list and print predictions71   predictions = list(itertools.islice(y, 6))72   print("Predictions: {}".format(str(predictions)))73 74 if __name__ == "__main__":75   tf.app.run()
复制代码

 

在学习深度网络框架的过程中,我们发现一个问题,就是如何输出各层网络参数,用于更好地理解,调试和优化网络?针对这个问题,TensorFlow开发了一个特别有用的可视化工具包:TensorBoard,既可以显示网络结构,又可以显示训练和测试过程中各层参数的变化情况。本博文分为四个部分,第一部分介绍相关函数,第二部分是代码测试,第三部分是运行结果,第四部分介绍相关参考资料。


一. 相关函数

TensorBoard的输入是tensorflow保存summary data的日志文件。日志文件名的形式如:events.out.tfevents.1467809796.lei-All-Series 或 events.out.tfevents.1467809800.lei-All-Series。TensorBoard可读的summary data有scalar,images,audio,histogram和graph。那么怎么把这些summary data保存在日志文件中呢?


数值如学习率,损失函数用scalar_summary函数。tf.scalar_summary(节点名称,获取的数据)

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  
  2. tf.scalar_summary('accuracy', accuracy)  

各层网络权重,偏置的分布,用histogram_summary函数

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. preactivate = tf.matmul(input_tensor, weights) + biases  
  2. tf.histogram_summary(layer_name + '/pre_activations', preactivate)  

其他几种summary data也是同样的方式获取,只是对应的获取函数名称换一下。这些获取summary data函数节点和graph是独立的,调用的时候也需要运行session。当需要获取的数据较多的时候,我们一个一个去保存获取到的数据,以及一个一个去运行会显得比较麻烦。tensorflow提供了一个简单的方法,就是合并所有的summary data的获取函数,保存和运行只对一个对象进行操作。比如,写入默认路径中,比如/tmp/mnist_logs (by default)

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. merged = tf.merge_all_summaries()  
  2. train_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/train', sess.graph)  
  3. test_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/test')  

SummaryWriter从tensorflow获取summary data,然后保存到指定路径的日志文件中。以上是在建立graph的过程中,接下来执行,每隔一定step,写入网络参数到默认路径中,形成最开始的文件:events.out.tfevents.1467809796.lei-All-Series 或 events.out.tfevents.1467809800.lei-All-Series。

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. for i in range(FLAGS.max_steps):  
  2. if i % 10 == 0:  # Record summaries and test-set accuracy  
  3. summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))  
  4.       test_writer.add_summary(summary, i)  
  5.       print('Accuracy at step %s: %s' % (i, acc))  
  6.     else# Record train set summarieis, and train  
  7.       summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))  
  8.       train_writer.add_summary(summary, i)  

二. 代码测试

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # Copyright 2015 Google Inc. All Rights Reserved.  
  2. #  
  3. # Licensed under the Apache License, Version 2.0 (the 'License');  
  4. # you may not use this file except in compliance with the License.  
  5. # You may obtain a copy of the License at  
  6. #  
  7. #     http://www.apache.org/licenses/LICENSE-2.0  
  8. #  
  9. # Unless required by applicable law or agreed to in writing, software  
  10. # distributed under the License is distributed on an 'AS IS' BASIS,  
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  12. # See the License for the specific language governing permissions and  
  13. # limitations under the License.  
  14. # ==============================================================================  
  15.   
  16. """A simple MNIST classifier which displays summaries in TensorBoard. 
  17.  
  18.  This is an unimpressive MNIST model, but it is a good example of using 
  19. tf.name_scope to make a graph legible in the TensorBoard graph explorer, and of 
  20. naming summary tags so that they are grouped meaningfully in TensorBoard. 
  21.  
  22. It demonstrates the functionality of every TensorBoard dashboard. 
  23. """  
  24. from __future__ import absolute_import  
  25. from __future__ import division  
  26. from __future__ import print_function  
  27.   
  28. import tensorflow as tf  
  29.   
  30. from tensorflow.examples.tutorials.mnist import input_data  
  31.   
  32.   
  33. flags = tf.app.flags  
  34. FLAGS = flags.FLAGS  
  35. flags.DEFINE_boolean('fake_data'False'If true, uses fake data '  
  36.                      'for unit testing.')  
  37. flags.DEFINE_integer('max_steps'1000'Number of steps to run trainer.')  
  38. flags.DEFINE_float('learning_rate'0.001'Initial learning rate.')  
  39. flags.DEFINE_float('dropout'0.9'Keep probability for training dropout.')  
  40. flags.DEFINE_string('data_dir''/tmp/data''Directory for storing data')  
  41. flags.DEFINE_string('summaries_dir''/tmp/mnist_logs''Summaries directory')  
  42.   
  43.   
  44. def train():  
  45.   # Import data  
  46.   mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True,  
  47.                                     fake_data=FLAGS.fake_data)  
  48.   
  49.   sess = tf.InteractiveSession()  
  50.   
  51.   # Create a multilayer model.  
  52.   
  53.   # Input placehoolders  
  54.   with tf.name_scope('input'):  
  55.     x = tf.placeholder(tf.float32, [None784], name='x-input')  
  56.     image_shaped_input = tf.reshape(x, [-128281])  
  57.     tf.image_summary('input', image_shaped_input, 10)  
  58.     y_ = tf.placeholder(tf.float32, [None10], name='y-input')  
  59.     keep_prob = tf.placeholder(tf.float32)  
  60.     tf.scalar_summary('dropout_keep_probability', keep_prob)  
  61.   
  62.   # We can't initialize these variables to 0 - the network will get stuck.  
  63.   def weight_variable(shape):  
  64.     """Create a weight variable with appropriate initialization."""  
  65.     initial = tf.truncated_normal(shape, stddev=0.1)  
  66.     return tf.Variable(initial)  
  67.   
  68.   def bias_variable(shape):  
  69.     """Create a bias variable with appropriate initialization."""  
  70.     initial = tf.constant(0.1, shape=shape)  
  71.     return tf.Variable(initial)  
  72.   
  73.   def variable_summaries(var, name):  
  74.     """Attach a lot of summaries to a Tensor."""  
  75.     with tf.name_scope('summaries'):  
  76.       mean = tf.reduce_mean(var)  
  77.       tf.scalar_summary('mean/' + name, mean)  
  78.       with tf.name_scope('stddev'):  
  79.         stddev = tf.sqrt(tf.reduce_sum(tf.square(var - mean)))  
  80.       tf.scalar_summary('sttdev/' + name, stddev)  
  81.       tf.scalar_summary('max/' + name, tf.reduce_max(var))  
  82.       tf.scalar_summary('min/' + name, tf.reduce_min(var))  
  83.       tf.histogram_summary(name, var)  
  84.   
  85.   def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):  
  86.     """Reusable code for making a simple neural net layer. 
  87.  
  88.     It does a matrix multiply, bias add, and then uses relu to nonlinearize. 
  89.     It also sets up name scoping so that the resultant graph is easy to read, and 
  90.     adds a number of summary ops. 
  91.     """  
  92.     # Adding a name scope ensures logical grouping of the layers in the graph.  
  93.     with tf.name_scope(layer_name):  
  94.       # This Variable will hold the state of the weights for the layer  
  95.       with tf.name_scope('weights'):  
  96.         weights = weight_variable([input_dim, output_dim])  
  97.         variable_summaries(weights, layer_name + '/weights')  
  98.       with tf.name_scope('biases'):  
  99.         biases = bias_variable([output_dim])  
  100.         variable_summaries(biases, layer_name + '/biases')  
  101.       with tf.name_scope('Wx_plus_b'):  
  102.         preactivate = tf.matmul(input_tensor, weights) + biases  
  103.         tf.histogram_summary(layer_name + '/pre_activations', preactivate)  
  104.       activations = act(preactivate, 'activation')  
  105.       tf.histogram_summary(layer_name + '/activations', activations)  
  106.       return activations  
  107.   
  108.   hidden1 = nn_layer(x, 784500'layer1')  
  109.   dropped = tf.nn.dropout(hidden1, keep_prob)  
  110.   y = nn_layer(dropped, 50010'layer2', act=tf.nn.softmax)  
  111.   
  112.   
  113.   with tf.name_scope('cross_entropy'):  
  114.     diff = y_ * tf.log(y)  
  115.     with tf.name_scope('total'):  
  116.       cross_entropy = -tf.reduce_mean(diff)  
  117.     tf.scalar_summary('cross entropy', cross_entropy)  
  118.   
  119.   with tf.name_scope('train'):  
  120.     train_step = tf.train.AdamOptimizer(  
  121.         FLAGS.learning_rate).minimize(cross_entropy)  
  122.   
  123.   with tf.name_scope('accuracy'):  
  124.     with tf.name_scope('correct_prediction'):  
  125.       correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))  
  126.     with tf.name_scope('accuracy'):  
  127.       accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  
  128.     tf.scalar_summary('accuracy', accuracy)  
  129.   
  130.   # Merge all the summaries and write them out to /tmp/mnist_logs (by default)  
  131.   merged = tf.merge_all_summaries()  
  132.   train_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/train', sess.graph)  
  133.   test_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/test')  
  134.   tf.initialize_all_variables().run()  
  135.   
  136.   # Train the model, and also write summaries.  
  137.   # Every 10th step, measure test-set accuracy, and write test summaries  
  138.   # All other steps, run train_step on training data, & add training summaries  
  139.   
  140.   def feed_dict(train):  
  141.     """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""  
  142.     if train or FLAGS.fake_data:  
  143.       xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)  
  144.       k = FLAGS.dropout  
  145.     else:  
  146.       xs, ys = mnist.test.images, mnist.test.labels  
  147.       k = 1.0  
  148.     return {x: xs, y_: ys, keep_prob: k}  
  149.   
  150.   for i in range(FLAGS.max_steps):  
  151.     if i % 10 == 0:  # Record summaries and test-set accuracy  
  152.       summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))  
  153.       test_writer.add_summary(summary, i)  
  154.       print('Accuracy at step %s: %s' % (i, acc))  
  155.     else# Record train set summarieis, and train  
  156.       summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))  
  157.       train_writer.add_summary(summary, i)  
  158.   
  159. def main(_):  
  160.   if tf.gfile.Exists(FLAGS.summaries_dir):  
  161.     tf.gfile.DeleteRecursively(FLAGS.summaries_dir)  
  162.   tf.gfile.MakeDirs(FLAGS.summaries_dir)  
  163.   train()  
  164.   
  165. if __name__ == '__main__':  
  166.   tf.app.run()  


三. 运行结果

代码运行


生成文件



调用TensorBoard可视化运行结果

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. tensorboard --logdir=/tmp/mnist_logs/train/  


打开链接 http://0.0.0.0:6006



EVENTS是训练参数统计显示,可以看到整个训练过程中,各个参数的变换情况



IMAGES输入和输出标签,省略


GRAPH网络结构显示


双击进去,可以显示更多的细节,包括右边的列表显示


HISTOGRAM训练过程参数分布情况显示



四. 参考资料

如果你想了解更多信息,可以参考一下资料:

https://www.tensorflow.org/versions/r0.9/how_tos/summaries_and_tensorboard/index.html

https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/tensorboard/README.md

https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py

https://www.tensorflow.org/versions/r0.9/how_tos/graph_viz/index.html

14 0
原创粉丝点击