sess.run的多个参数执行
是将整个计算图中所有需要计算的节点,计算完全后一次行输出,
两次print顺序不同,结果不同
import tensorflow as tf# 基础数据
state1 = tf.Variable(0, dtype=tf.int8,name= 'mi')
state = tf.Variable(0, dtype=tf.int8,name= 'MID_VAL')
one = tf.constant(1, dtype=tf.int8,name='ONE')# 对数据处理的节点new_val = tf.add(state, one*2, name='ADD') # state+1→ new_val
update = tf.assign(state, new_val, name='update') # update功能,更新参数init = tf.global_variables_initializer()with tf.Session() as sess:sess.run(init)print(sess.run([new_val,state]))print(sess.run([update,state]))
下图中第一次打印的是没有run赋值节点的内容,因此未执行后边的赋值动作
当将打印的两个命令换顺序后出现,下面的内容,分析不同顺序打印的差别原因是,在第一个命令中执行了赋值动作,后边的state初始值是2,对于没有要求执行的后面节点动作,也不会自动执行(第二个state没有赋值要求,就没有变化)
同一次run是将需要的节点全部计算后输出
将打印的中的参数修改,发现new_val打印的数值仍然是2,和前面一样。表明参数中的update的赋值命令执行后,并没有再次对其前面的步骤进行重复,(因为new_val没有成为4)
对同一个变量进行赋值操作
import tensorflow as tf# 基础数据
state = tf.Variable(0, dtype=tf.int8,name= 'MID_VAL')
one = tf.constant(1, dtype=tf.int8,name='ONE')# 对数据处理的节点new_val = tf.add(state, 2, name='ADD') # state+1→ new_val
update = tf.assign(state, new_val, name='update') # update功能,更新参数
new_val1 = tf.multiply(state, 5, name='mul') # 乘法
update1 = tf.assign(state, new_val1, name='update1')init = tf.global_variables_initializer()with tf.Session() as sess:sess.run(init)print(sess.run([update, update1]))
下面是上述程序执行的节点过程,根据结果是先进行了绿色线的state更新,所以最后才赋值为10,但通过改变update和update1的顺序结果并未改变,但还是中间变换有一些问题
将中间的数据变化也显示
显示结果中的2和12表示进行了加法运算,这是能理解的
with tf.Session() as sess:sess.run(init)for _ in range(2):print(sess.run([update,new_val, update1, new_val1]))
混乱的执行列表
将加法的执行换成下面,只是加了一个one*,但输出结果就不同,而且有时候同样执行同一个程序,会出现两种不同结果,从下面结果中表明进行了加法,但在赋值过程中出现问题,有可能是时间问题
new_val = tf.add(state, one*2, name='ADD')
当只改变new_val1的值的时候
new_val1 = tf.multiply(state, one*5, name='mul') # 乘法
出现的结果被赋值的结果就不是0,可以理解为,先进行了加法结果的赋值,后进行乘法的赋值