tensflow

TensorFlow-漫游记

2018-11-06  本文已影响12人  5号船长

文中的部分素材来源于维基百科和慕课网

关于TensorFlow

TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。

TensorFlow是谷歌大脑的第二代机器学习系统。
从0.8.0版本(发布于2016年4月)开始本地的支持分布式运行。
从0.9.0版本(发布于2016年6月)开始支持iOS。
从0.12.0版本(发布于2016年12月)开始支持Windows系统。该移植代码主要由微软贡献。
1.0.0版本发布于2017年2月11日。虽然参考实现运行在单台设备,TensorFlow可以运行在多个CPU和GPU(图形处理器)(和可选的CUDA扩展和图形处理器通用计算的SYCL扩展。TensorFlow可用于64位Linux、macOS和Windows,以及移动计算平台,包括Android和iOS。

TensorFlow的计算使用有状态的数据流图表示。TensorFlow的名字来源于这类神经网络对多维数组执行的操作。这些多维数组被称为张量。

以下是TensorFlow的官网:
网址为:https://www.tensorflow.org/

TensorFlow首页.png

以下是使用TensorFlow的部分公司:

使用TensorFlow的公司.png
TensorFlow的安装

安装TensorFlow之前我们需要先安装一下Anaconda,那什么是Anaconda呢,Anaconda 是一种Python语言的免费增值开源发行版,用于进行大规模数据处理、预测分析,和科学计算,致力于简化包的管理和部署。 Anaconda使用软件包管理系统Conda进行包管理。

下面是Anaconda的下载页面,
网址为:https://www.anaconda.com/download/#macos

Anaconda下载页面.png
conda --version                       查看版本信息
conda info                            查看安装信息
conda list                            查看当前已经安装的库
conda install xxx                     安装某库
conda update xxx                      更新某库
anaconda search -t conda tensorflow   搜索当前可用的tensorflow库

TensorFlow是Google开源的基于数据流图的科学计算库,适用于机器学习。
下面是一张数据流图:


数据流图.png
TensorFlow详细架构:
TensorFlow架构.png
TensorFlow的特点

1.灵活性:只要可以将计算表示成数据流图,就可以使用TensorFlow
2.跨平台:Linux,Windows,Mac,IOS等等
3.多语言:上层开发语言可以使用Python,C++,java,go等等语言
4.速度快:包含了XLA这款强大的线性代数编译器
5.上手快:加入了Keras,Estimiators等高层API
6.可移植:代码可以不加修改的移植到CPU,GPU,TPU等

如何学习TensorFlow

1.官网:https://www.tensorflow.org/
2.加强训练

安装完Anaconda之后,可以在这里创建一个虚拟环境,然后在虚拟环境里面安装tensorflow。具体细节可以参考网上其他文章。

TensorFlow讲解

进入Anaconda新建的虚拟环境

source activate tensorflow-two  激活虚拟环境
source deactivate               关闭虚拟环境

第一个TensorFlow程序:

import tensorflow as tf            导入tensorflow库
con = tf.constant("Hello Lss")     创建一个变量
sess = tf.Session()                启动一个tensorflow的Session(会话)
print (sess.run(con))              运行Graph(计算图)
sess.close()                       关闭Session
TensorFlow的编程模式

tensorflow是符号式编程
C,C++等编程语言属于命令式编程

TensorFlow基础结构
TensorFlow基础结构.png
图和会话
图和会话.png
TensorFlow程序的流程

1.定义算法的计算图(Graph)结构
2.使用会话(Session)执行计算

什么是张量(Tensor)
张量的维度.png Tensor表示法.png
可视化的TensorBoard
TensorBoard.png

TensorBoard图表中符号所代表的含义

TensorBoard符号含义.png
# -*- coding: UTF-8 -*-
import tensorflow as tf
W = tf.Variable(2.0, dtype=tf.float32, name="Weight")
b = tf.placeholder(dtype=tf.float32, name="Input")
with tf.name_scope("Output"):
    y = W * x + b
path = "./log"
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
writer = tf.summary.FileWriter(path, sess.graph)
result = sess.run(y, {x: 3.0})
print("y=%s" result)

运行TensorBoard:

tensorboard --logdir=log
官方例子

数据序列化
TensorBoard 通过读取 TensorFlow 的事件文件来运行。TensorFlow 的事件文件包含运行 TensorFlow 时生成的总结数据。下面是 TensorBoard 中总结数据的一般生命周期。

首先,创建您想从中收集总结数据的 TensorFlow 图,然后再选择您想在哪个节点标注总结指令

比如,假设您正在训练一个卷积神经网络,用于识别 MNIST 数据。您可能希望记录随着时间的推移,学习速度如何变化,以及目标函数如何变化。为了收集这些数据,您可以分别向输出学习速率和损失的节点附加 tf.summary.scalar 操作。然后,为每个 scalar_summary 分配一个有意义的 tag,如 'learning rate''loss function'

或许您还希望显示特定层中激活函数的分布情况,或者显示梯度或权重的分布情况。为了收集这些数据,您可以分别向梯度输出和存储权重的变量附加 tf.summary.histogram 操作。

有关所有可用的总结指令的详细信息,可查看总结指令文档。

在 TensorFlow 中,只有当您运行指令时,指令才会执行,或者另一个 op 依赖于指令的输出时,指令才会运行。我们刚才创建的这些总结节点都围绕着您的图:您目前运行的 op 都不依赖于这些节点的结果。因此,为了生成总结信息,我们需要运行所有这些总结节点。这样的手动操作是枯燥而乏味的,因此可以使用 tf.summary.merge_all 将这些操作合并为一个操作,从而生成所有汇总数据。

然后您可以执行该合并的总结 op,它会在特定步骤将所有总结数据生成一个序列化的 Summary protobuf 对象。最后,要将此汇总数据写入磁盘,请将汇总 protobuf 传递给 tf.summary.FileWriter

FileWriter 的构造函数中包含了参数 logdir。logdir 参数非常重要,所有事件都会写到它所指的目录下。 此外,FileWriter 的构造函数中可包含可选参数 Graph。如果 TensorBoard 接收到 Graph 对象,则会将图与张量形状信息一起可视化。这将使您更清楚地了解图的内涵:请参阅张量形状信息

现在您已经修改了图并具备 FileWriter,可以开始运行网络了!如果您愿意,可以每一步运行一次此合并的总结 op,并记录大量的训练数据。不过,可能会有一些您不需要的数据。因此,您可以考虑改为每 n 步运行一次合并的总结 op。

以下代码示例基于简单 MNIST 教程改编,我们在其中添加了一些总结 op,然后每十步运行一次。如果您将其运行,然后启动 tensorboard --logdir=/tmp/tensorflow/mnist,您就可将统计数据可视化,如可显示训练期间权重或准确性的变化。以下是节选的代码片段,要查看完整源代码请点击此处

def variable_summaries(var):
  """Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
  with tf.name_scope('summaries'):
    mean = tf.reduce_mean(var)
    tf.summary.scalar('mean', mean)
    with tf.name_scope('stddev'):
      stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
    tf.summary.scalar('stddev', stddev)
    tf.summary.scalar('max', tf.reduce_max(var))
    tf.summary.scalar('min', tf.reduce_min(var))
    tf.summary.histogram('histogram', var)

def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
  """Reusable code for making a simple neural net layer.

  It does a matrix multiply, bias add, and then uses relu to nonlinearize.
  It also sets up name scoping so that the resultant graph is easy to read,
  and adds a number of summary ops.
  """
  with tf.name_scope(layer_name):
    with tf.name_scope('weights'):
      weights = weight_variable([input_dim, output_dim])
      variable_summaries(weights)
    with tf.name_scope('biases'):
      biases = bias_variable([output_dim])
      variable_summaries(biases)
    with tf.name_scope('Wx_plus_b'):
      preactivate = tf.matmul(input_tensor, weights) + biases
      tf.summary.histogram('pre_activations', preactivate)
    activations = act(preactivate, name='activation')
    tf.summary.histogram('activations', activations)
    return activations

hidden1 = nn_layer(x, 784, 500, 'layer1')

with tf.name_scope('dropout'):
  keep_prob = tf.placeholder(tf.float32)
  tf.summary.scalar('dropout_keep_probability', keep_prob)
  dropped = tf.nn.dropout(hidden1, keep_prob)

y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)

with tf.name_scope('cross_entropy'):
  with tf.name_scope('total'):
    cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)
tf.summary.scalar('cross_entropy', cross_entropy)

with tf.name_scope('train'):
  train_step = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(
      cross_entropy)

with tf.name_scope('accuracy'):
  with tf.name_scope('correct_prediction'):
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
  with tf.name_scope('accuracy'):
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar('accuracy', accuracy)
/tmp/mnist_logs (by default)
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train',
                                      sess.graph)
test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test')
tf.global_variables_initializer().run()

我们初始化 FileWriters 后,在训练和测试模型时,必须向 FileWriters 添加总结。

def feed_dict(train):
  """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
  if train or FLAGS.fake_data:
    xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
    k = FLAGS.dropout
  else:
    xs, ys = mnist.test.images, mnist.test.labels
    k = 1.0
  return {x: xs, y_: ys, keep_prob: k}

for i in range(FLAGS.max_steps):
  if i % 10 == 0:  
    summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
    test_writer.add_summary(summary, i)
    print('Accuracy at step %s: %s' % (i, acc))
  else:  
    summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
    train_writer.add_summary(summary, i)

要运行 TensorBoard,请使用以下命令(或者 python -m tensorboard.main)

tensorboard --logdir=path/to/log-directory

其中,logdir 指向 FileWriter 将数据序列化的目录。如果此 logdir 目录下有子目录,而子目录包含基于各个运行的序列化数据,则 TensorBoard 会将所有这些运行涉及的数据都可视化。TensorBoard 运行后,请在您的网络浏览器中转到 localhost:6006 以查看 TensorBoard。

查看 TensorBoard 时,您会看到右上角的导航标签。每个标签代表一组可供可视化的序列化数据。

要深入了解如何使用“图”标签将图可视化,请参阅 TensorBoard:图的可视化

有关更多 TensorBoard 通用使用信息,请参阅 TensorBoard GitHub

以上就是官方提供的一个关于TensorBoard的例子:
原网址:https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard?hl=zh-cn

总结

岁月蹉跎过后,要留下自己的踪迹!

上一篇 下一篇

猜你喜欢

热点阅读