使用TensorFlow完成下面几个小功能,熟悉基本用法:
- 1. 实现一个累加器,并且每一步均输出累加器的结果值。
import tensorflow as tf
# 定义一个变量
x = tf.Variable(1, dtype=tf.int32, name='x')
# 更新变量
assign_op = tf.assign(ref=x, value=x+1)
'''
tf.assign():
ARGS:
ref:一个可变的张量.应该来自变量节点.节点可能未初始化.
value:张量.必须具有与 ref 相同的类型.是要分配给变量的值.
validate_shape:一个可选的 bool.默认为 True.如果为 true, 则操作将验证 "value" 的形状是否与分配给的张量的形状相匹配;如果为 false, "ref" 将对 "值" 的形状进行引用.
use_locking:一个可选的 bool.默认为 True.如果为 True, 则分配将受锁保护;否则, 该行为是未定义的, 但可能会显示较少的争用.
name:操作的名称(可选).
返回:
一个在赋值完成后将保留 "ref" 的新值的张量.
'''
# 变量的初始化操作
init_op = tf.global_variables_initializer()
# 启动会话
with tf.Session() as sess:
# 变量初始化
sess.run(init_op)
# 模拟迭代更新累加器
for i in range(5):
# 执行更新操作
sess.run(assign_op)
print("x:{}".format(sess.run(x)))
输出:
- 2. 编写一段代码,实现动态的更新变量的维度数目
import tensorflow as tf
# 定义一个不定形状的变量
x = tf.Variable(
initial_value=[], # 给定一个空值
dtype=tf.int32,
trainable=False, #表示不加载到内存空间,单独维护这个变量,一般情况下为True
validate_shape=False) # # 设置为True,表示在变量更新的时候,进行shape的检查,默认为True
# 变量的更改
concat = tf.concat([x, [0, 0]], axis=0) #主要用于连接两个数组,values:需要连接的数组,axis:从哪个维度来连接数组
assign_op = tf.assign(x, concat, validate_shape=False)
# 变量的初始化操作
init_op = tf.global_variables_initializer()
# 启动会话
with tf.Session() as sess:
# 变量初始化
sess.run(init_op)
# 动态更新变量维度
for i in range(5):
sess.run(assign_op)
print("x:{}".format(sess.run(x)))
输出:
- 3. 实现一个求解阶乘的代码
import tensorflow as tf
# 定义一个变量
sum = tf.Variable(1, dtype=tf.int32)
# 定义一个占位符
i = tf.placeholder(dtype=tf.int32)
# 更新操作
tmp_sum = sum * i
assign_op = tf.assign(sum, tmp_sum, name='factorial')
# 变量初始化操作
init_op = tf.global_variables_initializer()
# 启动会话
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 迭代求阶乘
for j in range(2,6):
sess.run(assign_op, feed_dict={i: j})
print("5!={}".format(sess.run(sum)))
输出:
总结:
- 使用图(graph)来表示计算任务;
- 在会话(session)的上下文中执行图;
- 使用tensor表示数据;
- 通过变量(Variable)来维护状态 ;
- 使用feed和fetch可以为任意的操作(Operation/op)赋值或者从其中获取数据。
以上五点就是TensorFlow的最基本概念:在TensorFlow框架下进行编程时,一定要有数据流图的概念,我们是在利用张量(Tensor)或者变量,通过数据流(data flow)的方式通过每个节点(nodes),在通过每个节点时进行一次操作(Operation),不同节点间相互联系构成一张我们想要计算图(Graph),类似网状的计算框架;最后通过构建会话(Session),来执行我们构建的图中节点,得到我们想要的结果。(个人想法,不对请指正!)