Я реализовал logi c с использованием python / numpy, который выглядит следующим образом:
У меня есть тензор (из нулей и единиц), и мне нужно создать маску для этого тензора на основе минимальное пороговое значение последовательных вхождений 1 . Предположим, что если у нас есть пороговое значение, равное 3, то части тензора, имеющие 3 или более последовательных вхождений 1 , должны быть замаскированы до нуля или иначе 1. Для вышеуказанного тензора, если у нас есть пороговое значение как 3, тогда мы должен получить
tensor = [1, 1, 1, 1, 0, 0, 1, 1, 0, 1]
mask = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
Первый патч единиц в тензоре имеет более 3 вхождений (замаскирован до 0), тогда как второй патч единиц имеет только 2 случая (замаскирован до 1). Нули в тензоре всегда маскируются до 1.
Моя реализация (с использованием нетерпеливого выполнения):
seq_length = tf.constant(10) #length of tensor given
tensor = tf.constant([1, 1, 1, 1, 0, 0, 1, 1, 0, 1])
v = 3 (integer as threshold value)
mask = np.ones(seq_length.numpy())
update_mask = np.zeros(v)
for start in range(seq_length.numpy()): (We iterate a sliding window of v elements over the tensor and check the condition at every iteration)
end = start + v - 1 #sliding window (start, end)
if end >= seq_length.numpy():
break
if tf.reduce_sum(tensor[start : end + 1, t]).numpy() == v:
mask[start : end + 1, t] = update_mask
return mask
Я хочу реализовать этот logi c в коде TF 1.x внутри сеанс (без активного выполнения) с использованием только tf-операций tf.while_loop, tf.cond, tf.scatter_update etc
для включения этих операций в tf-график.
Но поскольку назначение срезов не работает с тензорами, я не могу понять, как реализовать это logi c в сеансе tf.
Любая помощь будет оценена.