2016-02-18 3 views
3

Оптимизатор обычно выполняет один и тот же график вычислений для многих шагов до конвергенции. Создает ли tenorflow график в начале и повторно использует его для каждого шага? Что, если я изменю размер партии во время обучения? Что, если я сделаю какое-то отрицательное изменение на графике, как изменение функции потерь? Что делать, если я сделал некоторые серьезные изменения на графике? Представляет ли тензорный поток все возможные графики? Знает ли tensorflow, как оптимизировать весь расчет при изменении графика?На какой стадии настроен график тензорного потока?

ответ

4

TensorFlow предоставляет только один график, который отображается пользователю, а именно тот, который указан пользователем. Пользователь может запустить график с Session.run() или по телефону Tensor.eval() на каком-то тензоре. A Session.run() вызов может указывать некоторые тензоры для подачи, а другие - для выбора. В зависимости от того, что должно быть выбрано, среда выполнения TensorFlow может быть внутренне построена и оптимизирована для различных структур данных, включая сокращенную версию видимого графика пользователя. Тем не менее, этот внутренний график не отображается пользователю в любом случае. Нет, TensorFlow не «предварительно генерирует» все возможные графики. Да, TensorFlow выполняет обширные оптимизации на графике вычислений. И, наконец, изменение размера партии подаваемого тензора не меняет структуру графика.

+0

@mrry Спасибо. Я все еще не совсем понимаю, что произойдет, если Session.run() вызывается дважды на разных тензорах/операциях, которым могут потребоваться разные графики вычислений. (При типичных проблемах оптимизации Session.run() неоднократно вызывается для выполнения одного и того же операционного режима, но op может меняться в принципе.) – user3320467

+0

Я добавил ответ, который касается вашего последующего вопроса. Дайте мне знать, если все станет ясно! – mrry

+0

@mrry Получил это. Теперь ясно. Большое спасибо! – user3320467

6

Как keveman says, с точки зрения клиента имеется один график TensorFlow. Во время выполнения может быть несколько обрезанных подкадров, которые содержат только узлы, которые необходимы для вычисления значений t1, t2 и т. Д., Которые вы получаете при вызове sess.run([t1, t2, ...]).

Если вы звоните sess.run([t1, t2]) будет подрезать общий график (sess.graph) до подграфа, необходимого для вычисления этих значений: то есть операции, которые производят t1 и t2 и все их предшественников. Если впоследствии вы вызовете sess.run([t3, t4]), время выполнения сократит график до подграфа, необходимого для вычисления t3 и t4. Каждый раз, когда вы передаете новую комбинацию значений для извлечения, TensorFlow будет вычислять новый сокращенный график и кэшировать его —, поэтому первый sess.run() может быть несколько медленнее, чем последующие.

Если обрезанные графики перекрываются, TensorFlow будет повторно использовать «ядро» для общих разделов op. Это актуально, поскольку некоторые операционные системы (например, tf.Variable и tf.FIFOQueue) являются stateful, и их содержимое может использоваться как на обрезанных графиках. Это позволяет вам, например, инициализировать ваши переменные одним подграфом (например, sess.run(tf.initialize_all_variables())), обучить их другим (например, sess.run(train_op)) и оценить вашу модель с третьим (например, sess.run(loss, feed_dict={x: ...})). Он также позволяет вставлять элементы в очередь с одним подграфом и деактивировать их другим, что является основой input pipelines.

+0

Важно отметить, что обрезка не включает обрезку неактивных ветвей узла 'tf.cond'. Входы как 'fn1', так и' fn2' остаются в графике и вычисляются. Только узлы, определенные * внутри * функций 'fn1' и' fn2', вычисляются условно. –

Смежные вопросы