2015-12-17 2 views
4

Существует ли канонический способ повторного использования вычислений из ранее поставленного заполнителя в TensorFlow? Мой конкретный случай использования:Кэширование вычислений в TensorFlow

  • питание много входов (с использованием одного заполнителя) одновременно, все из которых кормили через сеть, чтобы получить меньшие представления
  • определить потери на основе различных комбинаций этих меньших представлений
  • поезд на одной партии в то время, когда каждая партия использует некоторое подмножество входов, без пересчета меньшие представления

Вот цель в коде, но неполноценно becau Повторные подсчеты повторяются:

X_in = some_fixed_data 
combinations_in = large_set_of_combination_indices 
for combination_batch_in in batches(combinations_in, batch_size=128): 
    session.run(train_op, feed_dict={X: X_in, combinations: combination_batch_in}) 

Спасибо.

+0

Кроме того, мне нужно кэшировать X, потому что градиенты, которые возвращаются из тренировки, будут зависеть от X. (Я бы отредактировал свой пост, но сейчас не вижу опции редактирования). – rd11

ответ

6

Канонический способ совместного использования вычисленных значений через вызовы sess.Run() заключается в использовании Variable. В этом случае вы можете настроить свой график так, чтобы при подаче заполнителей они вычисляли новое значение представления, которое сохраняется в переменной. Отдельная часть графика считывает эти переменные для вычисления потери. Это не сработает, если вам нужно вычислить градиенты через часть графика, который вычисляет представление. Вычисление этих градиентов потребует перекомпоновки каждой Op в кодере.

+1

Итак, вы думаете, что нет способа сделать это «правильным» способом, который должен был бы сделать один проход вперед, кэшировать эти результаты и вычислять градиенты, используя эти кешированные результаты? – rd11

+0

Насколько мне известно, вам нужно будет реализовать собственную версию tf.gradients, которая знает, как повторно использовать значения, хранящиеся в переменных. –

1

Это то, что должно решаться автоматически с помощью CSE (устранение общего подвыражения). Не уверен, какая поддержка в TensorFlow прямо сейчас может быть довольно пятнистой, но есть флаг optimizer_do_cse для параметров Graph, который по умолчанию имеет значение false, и вы можете установить его значение true с помощью GraphConstructorOptions. Вот C++ example с использованием GraphConstructorOptions (извините, не удалось найти Python)

Если это не сработает, вы можете сделать «ручной CSE», то есть выяснить, какая часть излишне пересчитана, в отдельный тензор, и ссылайтесь на этот тензор во всех вычислениях.

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