Тензор потока: цикл цикла на тензор - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь применить цикл while для значения тензора.Например, для переменной «а» я пытаюсь постепенно увеличивать значение тензора, пока не будет выполнено определенное условие.Тем не менее, я получаю эту ошибку:

ValueError: Shape должен иметь ранг 0, но это ранг 3 для 'while_12 / LoopCond' (op: 'LoopCond') с входными формами: [3,1,1].

a = array([[[0.76393723]],
       [[0.93270312]],
       [[0.08361106]]])

a = np.random.random((3,1,1))
a1 = tf.constant(np.float64(a))
i = tf.constant(np.float64(6.14))

c = lambda i: tf.less(i, a1)
b = lambda x: tf.add(x, 0.1)
r = tf.while_loop(c, b, [a1])

1 Ответ

0 голосов
/ 26 ноября 2018

Первый аргумент tf. while_loop () должен возвращать скаляр (тензор ранга 0 на самом деле скаляр - это то, о чем говорится в сообщении об ошибке).В вашем примере вы, вероятно, захотите, чтобы условие вернуло true в случае, если все числа в тензоре a1 меньше 6.14.Это может быть достигнуто с помощью tf.reduce_all () (логическое И) и tf.reduce_any () (логическое ИЛИ).

Этот фрагмент работал для меня:

tf.reset_default_graph()

a = np.random.random_integers(3, size=(3,2))
print(a)
# [[1 1]
#  [2 3]
#  [1 1]]

a1 = tf.constant(a)
i = 6

# condition returns True till any number in `x` is less than 6
condition = lambda x : tf.reduce_any(tf.less(x, i))
body      = lambda x : tf.add(x, 1)
loop = tf.while_loop(
    condition,
    body,
    [a1],
)

with tf.Session() as sess:
    result = sess.run(loop)
    print(result)
    # [[6 6]
    #  [7 8]
    #  [6 6]]
    # All numbers now are greater than 6
...