Zhangxu's Blog.

Tensorflow简单认识

Word count: 563 / Reading time: 2 min
2018/04/20 Share

这两天看了些tensorflow的知识点,这里分享一点心得。

最直观的感受,和以往编程最大的不同是,数据不是实时操控的。

编码的过程实际上是在用程序构造一个计算图,这个计算图定义了处理数据、模型创建、训练、验证、测试等等一系列行为。

这个计算图有一个入口,就是我们的数据集,当我们把数据喂到这个图中,一切就按照我们预先等一好的那样运转起来,直至最后给出结果。

用一个图来直观感受下:

pic

那也就是说,我们在定义图的过程中,用到的基础的数据结构它并不是“真实”的,更像是一个约定,等到数据经过这真实的计算才会发生。

来看一个简单的例子:

1
2
3
4
5
6
a = tf.constant(3.0, dtype=tf.float32)
b = tf.constant(4.0) # also tf.float32 implicitly
total = a + b
print(a)
print(b)
print(total)

通常我们以为程序会直接打印出a、b的值和求和的结果total,然而实际输出是:

1
2
3
Tensor("Const:0", shape=(), dtype=float32)
Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("add:0", shape=(), dtype=float32)

tensorflow只是描述了“有两个变量a、b,total是他们的和”,并没有立即计算结果。

如果要让这个图运行起来需要提供一个运行时的会话tf.Session:

1
2
sess = tf.Session()
print(sess.run(total))

这时程序才会输出预期的值:

1
7.0

更直观的我们构建图的时候指定占位符tf.placeholder

1
2
3
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
z = x + y

placeholder承诺在稍后提供值:

1
2
sess = tf.Session()
print(sess.run(z, feed_dict={x: 3, y: 4.5}))

程序输出:

1
7.5

由此可见,tensorflow和常规的编码习惯有稍许的不同,我猜想这样的好处是,由于机器学习对算力的要求很高,实际部署项目运行并不会在单机上进行计算,引入session的机制可以控制任务在分布式的集群上协调计算,而事先我们只要提供一个运算大纲也就是计算图就可以了。

CATALOG