目录
关于TensorFlow
TensorFlow是目前最流行的深度学习框架。它基于Python语言,是集合了神经网络各个算法函数组成的一个工具箱。
2017年2月,TensorFlow的首届开发者峰会在美国加利福尼亚州举行。在会上,谷歌公司正式宣布发布TensorFlow 1.0版本。
TensorFlow的编程模式
编程的模式通常分为命令式编程(imperative style programing)和符号式编程(symbolic style programing)。命令式编程就是直接以命令的形式编写程序,运行后计算机逐条执行。符号式编程则先定义各个变量及它们之间的计算关系,但此时没有任何实际数据,只有把需要运算的输入放进去后,才能在模型中形成数据流,从而形成输出值。TensorFlow采用的就是符号式编程模式。
举个栗子:如果走在路上有人问我食堂怎么走,那我可以直接告诉他:先往前走100米,再左转走50米,再…,然后就到了。
偶尔几个人问那ok,但要是有一个接一个的人来问路,那我选择狗带。这种情况下,最有效率的办法就是在各个路口处设置指示牌。人流从入口进去后,根据自身需要选择下一步怎么走。
如果人群是数据的话,那第一种指路方式就是命令式编程,第二种就是符号式编程。
变量的创建和输出
创建变量
明白了TensorFlow的编程模式后,就可以编写一个简单的程序体会一下这种编程模式了。最后,本文会提供完整的代码,方便有兴趣的朋友自己调试运行。
首先,使用tf.Variable()
创建变量:
import tensorflow as tf
# 创建变量
var1 = tf.Variable(2, name="a",dtype=tf.float16)
var2 = tf.Variable(3, name="b",dtype=tf.float16)
创建了两个变量,a=2
和b=3
。
定义计算关系
这一步需要确定这两个变量在数据流中的走向,也就是给人群设置指示牌。
# 对变量进行乘运算
y = tf.multiply(var1,var2)
# 对变量进行加运算
z = tf.add(var1,var2)
# 对变量进行减法运算
x = tf.subtract(y,z)
# 改变变量的值
var3 = var1.assign(tf.add(var1,1.0))
var4 = var2.assign_add(1.0)
这一步先定义了变量的加减乘运算关系,最后用assign()
和assign_add()
改变变量的值。
创建会话并输出
之前所做的工作只是建立了一个数据流图,而数据并没有开始流动。好比各个路口的指示牌都竖好了,人群还在门口排队。创建会话(Session)后,数据开始流动,并从而形成输出值。创建会话sess,使用sess.run()
输出各个运算节点处的数据值。
with tf.Session() as sess:
# 变量初始化
sess.run(tf.global_variables_initializer())
print('y=%.0f' % sess.run(y))
print('z=%.0f' % sess.run(z))
print('x=%.0f' % sess.run(x))
print('a=%.0f' % sess.run(var1))
print('b=%.0f' % sess.run(var2))
print('var3=%.0f' % sess.run(var3))
print('var4=%.0f' % sess.run(var4))
# 根据变量名输出变量值
for var in tf.global_variables():
if var.name == 'b:0':
print('找到的变量b的值为%.0f' % sess.run(var))
整个算法的代码至此编写完毕。最后用到了tf.global_variables()
,利用这个API可以遍历各个变量的name
,从而使我们可以根据name
找到我们指定的变量。
详细的计算流程参照下图:
结果及思考
运行代码后的print结果为:
y=6
z=5
x=1
a=2
b=3
var3=3
var4=4
找到的变量b的值为4
这里可以发现,定义计算关系实际上定义了上图中的节点,而sess.run()
其实是输出了某个计算节点处的数据流值。
注意,并不是某个变量的值!从输出结果中可以看到,两个b的值不一样。严格来说b=3
这种输出方式并不严谨,而应该是Var2=3
!从最后一条输出结果可知,程序执行完毕后,保存在名为b的变量中的值为4。
完整代码如下:
import tensorflow as tf
# 创建变量
var1 = tf.Variable(2, name="a",dtype=tf.float16)
var2 = tf.Variable(3, name="b",dtype=tf.float16)
# 对变量进行乘法运算
y = tf.multiply(var1,var2)
# 对变量进行加法运算
z = tf.add(var1,var2)
# 对变量进行减法运算
x = tf.subtract(y,z)
# 改变变量的值
var3 = var1.assign(tf.add(var1,1.0))
var4 = var2.assign_add(1.0)
# 创建会话
with tf.Session() as sess:
# 变量初始化
sess.run(tf.global_variables_initializer())
# 变量输出
print('y=%.0f' % sess.run(y))
print('z=%.0f' % sess.run(z))
print('x=%.0f' % sess.run(x))
print('a=%.0f' % sess.run(var1))
print('b=%.0f' % sess.run(var2))
print('var3=%.0f' % sess.run(var3))
print('var4=%.0f' % sess.run(var4))
# 根据变量名输出变量值
for var in tf.global_variables():
if var.name == 'b:0':
print('找到的变量b的值为%.0f' % sess.run(var))
参考资料
- https://www.tensorflow.org/api_docs/
- https://www.w3cschool.cn/tensorflow_python/tensorflow_python-bm7y28si.html
- 《TensorFlow技术解析与实战》——李嘉璇
- 其它零碎互联网内容