tf.group和tensorflow集合有什么区别?

时间:2018-12-23 02:26:15

标签: python tensorflow machine-learning deep-learning

我是tensorflow的新手

有两种方法可以一次运行多个张量。 使用collectiontf.gruop 但我不确定两者有何不同

简单的例子

const0=tf.constant(8)
const1=tf.constant(11)

tf.add_to_collection('my_collection' , const0)
tf.add_to_collection('my_collection' , const1)

#or 
tf.group(const0 , const1)

下面的代码是Mandelbrot fractal由tensorflow实现 使用tf.groupcollection

执行的操作没有区别
#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 tf
import numpy as np 
import matplotlib.pyplot as plt

# Concept
# input initial value
#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.groupcollection有什么区别? 谢谢!

1 个答案:

答案 0 :(得分:2)

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.grouptf.add_to_collection + tf.get_collection是相同的:您只需要并行执行所有操作,因此sess.run(op)和{{1} }具有相同的行为。

但是在导出计算图的情况下(这只是一个示例,可以使您理解可能的情况),您不能依赖python列表,因此必须使用sess.run(tf.get_collection('coll'))