1

我如何断言张量如下所示(例如):

[ True, True ]
[ True, True, True, False, False, False, False ]
[ True, True, True, False, False ]
[ True, False, False, False, False ]
[ False, False ]

但拒绝这样的输入:

[ True, False, True, False, False, True, False ]
[ False, False, False, False, True ]

或者更笼统地说:我想测试一个张量是否只包含 0 到 N 个 True 值的序列,然后是 0 到 N 个 False 值。我如何使用 Tensorflow 2 做到这一点?

4

2 回答 2

1

另一种方法,研究元素的索引:

import tensorflow as tf

def is_valid(t):
  where_false = tf.where(~t)
  return len(where_false) == 0 or all( idx_true < min(where_false) for idx_true in tf.where(t))

assert is_valid(tf.constant([ True, True ]))
assert is_valid(tf.constant([ True, True, True, False, False, False, False ]))
assert is_valid(tf.constant([ True, True, True, False, False ]))
assert is_valid(tf.constant([ True, False, False, False, False ]))
assert is_valid(tf.constant([ False, False ]))
assert not is_valid(tf.constant([ True, False, True, False, False, True, False ]))
assert not is_valid(tf.constant([ False, False, False, False, True ]))

这个想法是,所有 True 值都应该出现在第一个 False 之前,如果有的话。

于 2020-03-12T12:07:05.830 回答
1

这是您可以做到这一点的一种方法:

import tensorflow as tf

def is_valid(a):
    # a is assumed to be a 1D boolean array
    a = tf.convert_to_tensor(a)
    # Convert to integer
    a_int = tf.dtypes.cast(a, tf.int32)
    # Take pairwise differences
    diff = a_int[1:] - a_int[:-1]
    # Check all differences are zero or negative (no transitions from False to True)
    return tf.reduce_all(diff <= 0)

# Valid examples
tf.print(is_valid([ True, True ]))
# 1
tf.print(is_valid([ True, True, True, False, False, False, False ]))
# 1
tf.print(is_valid([ True, True, True, False, False ]))
# 1
tf.print(is_valid([ True, False, False, False, False ]))
# 1
tf.print(is_valid([ False, False ]))
# 1

# Invalid examples
tf.print(is_valid([ True, False, True, False, False, True, False ]))
# 0
tf.print(is_valid([ False, False, False, False, True ]))
# 0

注意:is_valid返回标量布尔张量,即使tf.print将其打印为整数。

于 2020-03-12T12:00:36.683 回答