我在tensorflow方面是新手
我们可以同时运行多个张量,有两种方法:使用collection
和tf.group
,但我不确定这两者的区别
举个简单的例子
const0=tf.constant(8)const1=tf.constant(11)tf.add_to_collection('my_collection' , const0)tf.add_to_collection('my_collection' , const1)#或 tf.group(const0 , const1)
下面的代码是用tensorflow实现的Mandelbrot分形
。使用tf.group
和collection
执行时没有区别
#step = tf.group(# tf.assign(zs, zs_add),# tf.assign_add(ns, zs_cast)#)#tf.add_to_collection('my_collection',tf.assign(zs, zs_add))#tf.add_to_collection('my_collection',(ns, zs_cast))#step = tf.get_collection('my_collection')#import tensorflow as tfimport numpy as np import matplotlib.pyplot as plt# 概念# 输入初始值#Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]init_value = X + 1j*Y#xs = tf.constant(init_value )zs = tf.Variable(xs)zs_zeros = tf.zeros_like(xs, tf.float32)ns = tf.Variable(zs_zeros)zs_squre = tf.multiply(zs,zs)zs_add = tf.add(zs_squre , xs)zs_abs = tf.abs(zs_add)zs_less = tf.math.less(zs_abs , 4)zs_cast = tf.cast(zs_less , tf.float32)#step = tf.group( tf.assign(zs, zs_add), tf.assign_add(ns, zs_cast))#sess = tf.Session()sess.run(tf.global_variables_initializer())for i in range(200): sess.run(step)value = sess.run(ns)plt.imshow(value)plt.show()
所以我的问题是
tf.group
和collection
有什么区别?谢谢!
回答:
tf.group
在计算图内部创建一个操作,一旦评估就会执行组内的所有张量:
op = tf.group(a,b)
而tf.add_to_collection
则是在计算图外部创建一组操作,仅存在于python脚本中。
tf.add_to_collection('coll', a)tf.add_to_collection('coll', b)
你可以通过查看op
和tf.get_collection('coll')
的描述来看到这一点:
- op:
<tf.Operation 'group_deps' type=NoOp>
- tf.get_collection:
[<tf.Tensor 'Const:0' shape=() dtype=int32>, <tf.Tensor 'Const_1:0' shape=() dtype=int32>]
在你的例子中,使用tf.group
或tf.add_to_collection
+ tf.get_collection
是相同的:你只需要所有操作并行执行,因此sess.run(op)
和sess.run(tf.get_collection('coll'))
的行为相同。
但在导出计算图的情况下(这只是一个例子,让你理解可能的场景),你不能依赖于python列表,因此你必须使用tf.group