我知道this stackoverflow thread已经提供了一些关于张量流中条件的好例子,但是我仍然在努力解决我在张量流中随机选择几个不同面具的问题。
现在我只能在两个面具张量a
和b
:
rand_num = tf.random_uniform([], minval=0, maxval=2.0, dtype=tf.float32, seed=None)
def if_true():
return b
def if_false():
return a
mask_sel = tf.cond(tf.less(rand_num , tf.constant(1.0)),if_true,if_false)
(我仍然觉得很奇怪,需要定义这两个辅助函数,但不使用它们会奇怪地抛出错误。)
现在的问题是:假设我有4个掩模张量(a,b,c,d)或更多随机选择,在tensorflow中这样做的最佳方法是什么?
在python中
rand_num = np.random.uniform(low=0,high=4.0)
if (rand_num < 1.0):
mask_sel = a
elif(rand_num < 2.0):
mask_sel = b
elif(rand_num < 3.0):
mask_sel = c
else
mask_sel = d
答案 0 :(得分:0)
关于辅助函数,它们很有用,因为它们允许张量流知道在每种条件下将运行哪些操作,这样它可以通过仅运行所选分支并忽略另一个来优化。辅助函数之外的操作但由任何函数使用的操作将始终在tf.cond
运行之前运行。
其他选项是使用tf.select
;你不需要这里的辅助函数,但它会在运行tf.select
之前总是评估双方,如果你不需要,这可能是低效的。
现在主要问题是“从超过2个测试者中选择”,您可以使用多个选项:
1-递归嵌套tf.cond
操作:
def select_from_list(selector, tensor_list):
length = len(tensor_list)
if length == 0:
raise ValueError('List is empty')
elif length == 1:
return tensor_list[0]
else:
half = length // 2
return tf.cond(tf.less(selector, float(half)), lambda: select_from_list(selector, tensor_list[:half]), lambda: select_from_list(selector - half, tensor_list[half:]))
2-使用tf.case
:
def select_from_list(selector, tensor_list):
length = len(tensor_list)
if length == 0:
raise ValueError('List is empty')
elif length == 1:
return tensor_list[0]
else:
def fn(tensor):
return lambda: tensor
pred_fn_pairs = [(tf.less(selector, float(i+1)), fn(tensor)) for i, tensor in enumerate(tensor_list)]
return tf.case(pred_fn_pairs, default=lambda:tensor_list[-1])
您可以使用以下方法测试其中任何一个:
def test(selector, value_list, sess):
return select_from_list(float(selector), [tf.constant(value) for value in value_list]).eval(session = sess)
sess = tf.Session()
test(3.5, [4,2,6,7,5], sess)
这应该返回7