小白学Tensorflow之可视化与图

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


Tensorflow提供了很强大的可视化功能,今天来学习一下。
当我们导入tensorflow包的时候,系统已经帮助我们产生了一个默认的图,它被存在_default_graph_stack中,但是我们没有权限直接进入这个图,我们需要使用tf.get_default_graph()命令来获取图。

>>> graph = tf.get_default_graph()

tensorflow中的图上的节点被称之为operations或者ops。我们可以使用graph.get_operations()命令来获取图中的operations

>>> graph.get_operations()
# []

现在,因为图中没有操作,所以返回的是[]。我们可以向图中添加任何的操作,比如我们先定义一个常量input_value

>>> input_value = tf.constant(1.0)

现在,这个常量作为一个节点被添加到了图中,作为一个operations。现在,我们能发现operations中存在值了。

>>> operations = graph.get_operations()
>>> operations
# [<tensorflow.python.framework.ops.Operation at 0x1185005d0>]
>>> operations[0].node_def
# name: "Const"
# op: "Const"
# attr {
#   key: "dtype"
#   value {
#     type: DT_FLOAT
#   }
# }
# attr {
#   key: "value"
#   value {
#     tensor {
#       dtype: DT_FLOAT
#       tensor_shape {
#       }
#       float_val: 1.0
#     }
#   }
# }

Tensorflow还能做很多非常有意义的事,但是你必须给每个操作都赋予明确的含义,即使只是一个常量。

如果我们查看常量input_value,我们将能看到它只是一个32位的浮点数类型的tensor,维度是零维度。

>>> input_value
# <tf.Tensor 'Const:0' shape=() dtype=float32>

可能你注意到了,我们发现这个操作并没有告诉我们input_value的值是多少。这是为什么呢?因为图graph只是定义了操作operations,但是操作operations只能在session里面执行,但是graphsession是独立创建的。所以,我们上述操作才没有显示input_value的值是多少。如果,我们想知道input_value中具体的值是多少,那么我们需要创建一个session,具体如下:

>>> sess = tf.Session()
>>> sess.run(input_value)
# 1.0

至此,我们已经在图中创建了一个session

接下来,我们创建一个神经元。为了简便,我们只创建一个参数变量,在这里我们不使用常量constant来构建,因为我们希望在后续的计算中,这个权重可以更新,所以我们采用Variable来构建参数变量。

>>> weight = tf.Variable(0.8)

可能,你会认为,你只是添加了一个Variable,那么在图中也只会增加一个操作operations。但是事实上,增加了这个权重,却增加了四个操作。我们能使用以下命令来查看各个operations的名字。

>>> for op in graph.get_operations():
>>>     print op.name
# Const
# Variable/initial_value
# Variable
# Variable/Assign
# Variable/read

我们不会关心每一个操作,但是关心每一个操作的含义是有意义的。

>>> output_value = weight * input_value

现在,你查看图中的操作,发现有六个操作了,其中最后一个操作的名字是mul

>>> op = graph.get_operations()[-1]
>>> op.name
# 'mul'
>>> for op_input in op.inputs:
>>>     print op_input
# Tensor("Variable/read:0", shape=(), dtype=float32)
# Tensor("Const:0", shape=(), dtype=float32)

这个显示说明了,这个乘法操作的数据来源是哪里。

那么,我们怎么执行这个乘法操作呢?我们必须去run这个乘法,才能得到output_value的值。但是,这个操作依赖于一个参数weight。我们告诉Tensorflow这个值得初始值是0.8,但是这个初始化操作还没有在session中执行,我们需要使用tf.initialize_all_variables()来初始化参数变量。

>>> init = tf.initialize_all_variables()
>>> sess.run(init)

执行tf.initialize_all_variables()操作将初始化当前图中的所有参数变量,但是如果你想重新加入一个变量,那么就需要重新执行tf.initialize_all_variables()操作,因为先前的操作不包括初始化新的参数变量。

现在,我们来打印output_value操作。

>>> sess.run(output_value)
# 0.80000001

至此,我们已经能简单的描述一个图了。但是,TensorBoard提供了更加强大的可视化功能,接下来,我们来实现这个可视化功能。
TensorBoard读取操作operations中的每一个名字,然后对每个名字进行操作。比如如下操作:

>>> x = tf.constant(1.0, name = 'input')
>>> w = tf.Variable(0.8, name = 'weight')
>>> y = tf.mul(w, x, name = 'output')

TensorBoard的工作原理是从session创建的一个目录中读取结果。我们能使用SummaryWriter函数将output的结果保存到一个目录下面。

SummaryWriter函数的第一个参数是输出目录的名字,这个目录如果不存在,那么将会被创建。

>>> summary_writer = tf.train.SummaryWriter('log_simple_graph', sess.graph)

那么,我们可以在终端下面使用这个命令。

$ tensorboard --logdir=log_simple_graph

TensorBoard运行这个图在本地的6006端口,即localhost:6006

最后附上一个完整代码,以供学习。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tensorflow as tf

x = tf.constant(1.0, name='input')
w = tf.Variable(0.8, name='weight')
y = tf.mul(w, x, name='output')
y_ = tf.constant(0.0, name='correct_value')
loss = tf.pow(y - y_, 2, name='loss')
train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)

for value in [x, w, y, y_, loss]:
    tf.scalar_summary(value.op.name, value)

summaries = tf.merge_all_summaries()

sess = tf.Session()
summary_writer = tf.train.SummaryWriter('log_simple_stats', sess.graph)

sess.run(tf.initialize_all_variables())
for i in range(100):
    summary_writer.add_summary(sess.run(summaries), i)
    sess.run(train_step)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值