Tensorflow:随机选择面具

时间:2017-03-30 22:25:17

标签: tensorflow

我知道this stackoverflow thread已经提供了一些关于张量流中条件的好例子,但是我仍然在努力解决我在张量流中随机选择几个不同面具的问题。
现在我只能在两个面具张量ab

之间进行选择
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

1 个答案:

答案 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