Петля в тензорном потоке - PullRequest
0 голосов
/ 03 июля 2018

Я изменил свой вопрос, чтобы лучше объяснить свою проблему:

У меня есть функция: output_image = my_dunc (x), которая должна быть похожа на (1, 4, 4, 1)

Пожалуйста, помогите мне исправить ошибку в этой части:

out = tf.Variable(tf.zeros([1, 4, 4, 3]))
index = tf.constant(0)
def condition(index):
    return tf.less(index, tf.subtract(tf.shape(x)[3], 1))
def body(index):
    out[:, :, :, index].assign(my_func(x[:, :, :, index]))
    return tf.add(index, 1), out
out = tf.while_loop(condition, body, [index])

ValueError: две структуры не имеют одинаковую вложенную структуру. Первая структура: type = list str = [] Вторая структура: тип = список str=[<tf.Tensor 'while_10/Add_3:0' shape=() dtype=int32>, <tf.Variable 'Variable_2:0' shape=(1, 4, 4, 3) dtype=float32_ref>] Более конкретно: две структуры не имеют одинаковое количество элементов. Первая структура: type=list str=[<tf.Tensor 'while_10/Identity:0' shape=() dtype=int32>]. Вторая структура: type=list str=[<tf.Tensor 'while_10/Add_3:0' shape=() dtype=int32>, <tf.Variable 'Variable_2:0' shape=(1, 4, 4, 3) dtype=float32_ref>]

Я проверил свой код и могу получить результат из out = my_func(x[:, :, :, i]) с другими значениями для i, а также while_loop работает, когда я комментирую строку out[:, :, :, index].assign(my_func(x[:, :, :, index])). Что-то не так в этой линии.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я понимаю, что нет цикла for и так далее, и просто пока, почему?

Согласно Реализация потока управления в TensorFlow

Они должны хорошо соответствовать модели потока данных TensorFlow и должны быть пригодны для параллельного и распределенного выполнения и автоматического дифференцирования.

Я думаю, что распределенные графы потоков данных и Автоматическое дифференцирование по устройствам могли быть ограничениями, ведущими к введению очень небольшого числа таких примитивов цикла.

В этом документе несколько диаграмм. что специалисты по распределенным вычислениям могут лучше понять. Более подробное объяснение мне недоступно.

0 голосов
/ 03 июля 2018

Я понимаю, что нет цикла for и так далее, и просто пока, почему?

Управляющие структуры сложно понять правильно и сложно оптимизировать. В вашем случае, что если следующий пример в той же партии имеет 5 каналов. Вам нужно будет выполнить 5 итераций цикла и либо испортить, либо тратить вычислительные ресурсы для первого примера только с 3 каналами.

Вам нужно подумать, чего именно вы пытаетесь достичь. Как правило, у вас будут разные веса для каждого канала, поэтому система не может просто создать их из воздуха, их нужно правильно обучить.

Если вы просто хотите применить одну и ту же логику 3 раза, просто переставьте ваш тензор (3, 4, 4, 1). Вы получаете 3 результата и делаете с ними все, что хотите.

Обычно, когда вам действительно нужны циклы (при обработке последовательностей), вы дополняете примеры так, чтобы они имели одинаковую длину, и генерировали модель, в которой цикл развернут (у вас было бы 3 разных операции, по одной на каждую итерацию петля). Ищите dynamic_rnn или static_rnn (сначала можно обрабатывать разные длины для каждого пакета).

...