TensorFlow-漫游记
文中的部分素材来源于维基百科和慕课网
关于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的部分公司:
TensorFlow的安装
安装TensorFlow之前我们需要先安装一下Anaconda,那什么是Anaconda呢,Anaconda 是一种Python语言的免费增值开源发行版,用于进行大规模数据处理、预测分析,和科学计算,致力于简化包的管理和部署。 Anaconda使用软件包管理系统Conda进行包管理。
下面是Anaconda的下载页面,
网址为:https://www.anaconda.com/download/#macos
conda --version 查看版本信息
conda info 查看安装信息
conda list 查看当前已经安装的库
conda install xxx 安装某库
conda update xxx 更新某库
anaconda search -t conda tensorflow 搜索当前可用的tensorflow库
TensorFlow是Google开源的基于数据流图的科学计算库,适用于机器学习。
下面是一张数据流图:
数据流图.png
TensorFlow详细架构:
TensorFlow架构.pngTensorFlow的特点
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图和会话
图和会话.pngTensorFlow程序的流程
1.定义算法的计算图(Graph)结构
2.使用会话(Session)执行计算
什么是张量(Tensor)
张量的维度.png Tensor表示法.png可视化的TensorBoard
TensorBoard.pngTensorBoard图表中符号所代表的含义
# -*- 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
总结
岁月蹉跎过后,要留下自己的踪迹!