Как использовать функцию merge и switch из tensorflow?
merge и switch не могут быть открыты для использования обычными пользователями. И я искал исходный код:
Есть описание в merge:
Возвращает значение доступного элемента
inputs.
Что это значит доступно ? Возвращается ли он switch? Это демо:
from tensorflow.python.ops import control_flow_ops
x_0, x_1 = control_flow_ops.switch(tf.constant(2), False)
x_2, x_3 = control_flow_ops.switch(tf.constant(7), True)
y = control_flow_ops.merge([x_0, x_1, x_2, x_3])
with tf.Session() as sess:
print(sess.run(y))
1 ответ:
Начнем с рассмотрения функции
switchcontrol_flow_ops.switch:x_0, x_1 = control_flow_ops.switch(tf.constant(2), False) x_2, x_3 = control_flow_ops.switch(tf.constant(7), True) with tf.Session() as sess: print(sess.run(x_0)) # prints 2 print(sess.run(x_3)) # prints 7
control_flow_ops.switchвозвращает кортеж тензоров, но только один из них будет иметь значение (в зависимости от аргумента условия). В приведенном выше примере этоx_0 = 2из первогоswitchиx_3 = 7из второго. Попытка оценитьx_1илиx_2приведет к Retval не имеет значения ошибка:Другими словами,sess.run(x_1) # FAILS! sess.run(x_2) # FAILS!x_0иx_3являются доступными , в то время какx_1илиx_2нет.
merge
control_flow_ops.mergeвыполняет обратную операцию: учитывая кортеж тензоров, он выбирает доступный. Именно, он возвращает именованный кортеж["output", "value_index"]тензора, который имеет значение. Согласно текущему doc, входные данные должны содержать ровно один доступный тензор, это означает, что ваша демонстрация строго говоря не поддерживается и приводит к неопределенному поведению. Вот пример:with tf.Session() as sess: print(sess.run(merge([x_0, x_1]))) # Merge(output=2, value_index=0) print(sess.run(merge([x_1, x_0]))) # Merge(output=2, value_index=1) print(sess.run(merge([x_2, x_3]))) # Merge(output=7, value_index=1) print(sess.run(merge([x_3, x_2]))) # Merge(output=7, value_index=0) print(sess.run(merge([x_0, x_1, x_2]))) # Merge(output=2, value_index=0) print(sess.run(merge([x_1, x_2, x_3]))) # Merge(output=7, value_index=2)Обе эти функции могут быть удобны для управления. поток вычислений, например
control_flow_ops.switchградиент реализуется черезswitchСам (исходный код tensorflow).