学过 Python 的小伙伴都会觉得, python 的语法简单, 逻辑清晰. 虽然 tensorflow 是 python 的一个库(并不是标准库), 但是使用并不简单, 你可能会被 tensorflow 的奇怪语法设计困惑, 所以本文章叫做费解的 tensorflow, 希望通过本文, 读者可以更好的了解 tensorflow.
编程必备 hello world
学习任何编程语言, 可能上来都是打印输出下 hello world, 用 python 很简单, 我们一行代码就可以了.
print('hello world')
就算是先定义为变量, 我们也只是需要 2 行代码.
- a = 'hello world'
- print(a)
那我们用 tensorflow 来写, 需要 3 行, 代码不是很多, 但是看上去就是很费解.
- a = tf.constant('hello world')
- sess = tf.Session()
- print(sess.run(a))
那我们就以这个简单代码, 来看看 tensorflow 的语法.
计算图
如果把上面代码抽象出来, 其实就是建立计算图和运行计算图的完整过程. 当然读者就会问, 什么是计算图? 其本质就是全局数据结构: 是一个有向图, 用于捕获有关如何计算的指令. 概念还是比较生硬, 图那我就以流程图为例, 流程中的方框 (节点) 就是我们 tensorflow 的定义的数据, 箭头就是计算指令.
例如, 下面代码, 我们就定义了一个常量, 在计算图中就是给了他一个位置, 他就是一个节点. 打印输出其说明:
tensorflow 张量
零维
数据类型
- a = tf.constant(2)
- print(a)
- # Tensor("Const:0", shape=(), dtype=int32)
通过下面代码就可以算是完整的计算图(有节点和计算).
- two_node = tf.constant(2)
- three_node = tf.constant(3)
- sum_node = two_node + three_node
会话
前面说到了是建立计算图, 接着我们就要执行计算图, 这样代码才能运行. 这里就要提到一个新概念, 会话. 会话的作用是处理内存分配和优化, 使我们能够实际执行由计算图指定的计算. 简单说, 建立计算图, 通过会话, 然后运行计算图.
这就是为什么 tensorflow 代码都有这个代码的原因了.
- sess = tf.Session()
- sess.run()
回到 hello world
我们重新在来看下 hello world 的代码.
- a = tf.constant('hello world')
- sess = tf.Session()
- print(sess.run(a))
- # hello world
第一行, 我们建立计算图, 这里我们是通过 tf.constant 来定义的, 其为常量.
建立会话
运行计算图
占位符(placeholder)
前面的程序, 我们没有输入, 这样就是只会输出同样的东西. 在 python 中, 我们可以通过 iput 输入数据.
在 tf 中, 我们需要先定义占位符, 然后用 feed_dict 方法传入数据, 代码如下:
- a = tf.placeholder(tf.int32)
- b = tf.placeholder(tf.int32)
- c = a + b
- with tf.Session() as sess:
- print(sess.run([a,b,c],feed_dict={a:5,b:8}))
- # [array(5), array(8), 13]
变量
前面, 我们用 tf.constant 定义了常量, 用占位符 (placeholder) 用于输入, 最后我们看看变量的定义.
说变量之前, 我们再来看看 tensorflow 这个单词, 其实他是分为 tensor(张量)和 flow(流). 变量在 tensorflow 就是张量的意思.
这里我们定义一个一维张量:
a = tf.Variable([0.2,0.4,0.5])
接着如果我们建立会话, 运行程序会报错. 我们需要初始化变量, 这里我们不讲解底层的原因, 我们只需要记住, 用到变量加上下面的代码初始化即可.
- sess = tf.Session()
- init = tf.global_variables_initializer()
- sess.run(init)
- print(sess.run(a))
- # [0.2 0.4 0.5]
- tensorboard
最后, 我们可视化下我们的计算图.
- a = tf.placeholder(tf.int32)
- b = tf.placeholder(tf.int32)
- c = a * b
- with tf.Session() as sess:
- print(sess.run([a,b,c],feed_dict={a:5,b:8}))
- writer = tf.summary.FileWriter('log/test1',sess.graph)
- writer.close()
接着我们打开代码所在环境, 输入一下代码.
tensorboard --logdir=G:\ 我的 Python 项目 \ 深度学习 \ deeplearn\log\test1
在浏览器中输入 http://localhost:6006/
总结
本文通过最简单的 hello world 代码, 详细讲解了 tf 的语法. 我们需要记住, 整个过程就是建立和运行计算图的流程.
来源: http://www.jianshu.com/p/7b302aceffe3