Как я могу утверждать, что Тензор - это последовательность от 0 до N `True`s, за которой следует от 0 до N` False`s? - PullRequest
1 голос
/ 12 марта 2020

Как я могу утверждать, что Тензор выглядит следующим образом (например):

[ 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 ]

Или в более общем смысле: я хочу проверить, состоит ли Tensor только из последовательности значений от 0 до N значений True, а затем от 0 до N значений False. Как я могу сделать это с Tensorflow 2?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Другой подход, изучая индексы элементов:

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, если таковые существуют.

1 голос
/ 12 марта 2020

Это можно сделать одним из следующих способов:

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 печатает его как целое число.

...