Попытка реализовать опыт воспроизведения в Tensorflow

Я пытаюсь реализовать опыт воспроизведения в Tensorflow. Проблема, с которой я столкнулся, заключается в сохранении выходных данных для пробной версии моделей и одновременном обновлении градиента. Пара подходов, которые я пробовал, - сохранять полученные значения из sess.run(модель), однако они не являются тензорами и не могут использоваться для градиентного спуска, если речь идет о тензорном потоке. В настоящее время я пытаюсь использовать tf.assign(), однако трудности, с которыми я сталкиваюсь, лучше всего показаны в этом примере.

import tensorflow as tf
import numpy as np

def get_model(input):
   return input

a = tf.Variable(0)
b = get_model(a)
d = tf.Variable(0)
for i in range(10):
   assign = tf.assign(a, tf.Variable(i))
   b = tf.Print(b, [assign], "print b: ")
   c = b
   d = tf.assign_add(d, c)
e = d

with tf.Session() as sess:
   tf.global_variables_initializer().run()
   print(sess.run(e))

Проблема, с которой я столкнулся в приведенном выше коде, заключается в следующем: - Он печатает разные значения при каждом запуске, что кажется странным. - Неправильно обновляется на каждом шаге цикла for. Часть того, почему я запутался, заключается в том, что я понимаю, что у вас есть однако, чтобы выполнить операцию присвоения для обновления предыдущей ссылки, я просто не могу понять, как правильно сделать это на каждом шаге цикла for. Если есть более простой способ, я открыт для предложений. Этот пример аналогичен тому, как я сейчас пытаюсь ввести массив входных данных и получить сумму на основе каждого прогноза, который делает модель. Если разъяснение по любому из вышеперечисленных поможет, я буду более чем рад предоставить его.

Ниже приведены результаты выполнения кода выше три раза.

$ python test3.py
2018-07-03 13:35:08.380077: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
print b: [8]
print b: [8]
print b: [8]
print b: [8]
print b: [8]
print b: [8]
print b: [8]
print b: [8]
print b: [8]
print b: [8]
80


$ python test3.py
2018-07-03 13:35:14.055827: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
print b: [7]
print b: [6]
print b: [6]
print b: [6]
print b: [6]
print b: [6]
print b: [6]
print b: [6]
print b: [6]
print b: [6]
60

$ python test3.py
2018-07-03 13:35:20.120661: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
print b: [9]
print b: [9]
print b: [9]
print b: [9]
print b: [9]
print b: [9]
print b: [9]
print b: [9]
print b: [9]
print b: [9]
90

Результат, который я ожидаю, выглядит следующим образом:

print b: [0]
print b: [1]
print b: [2]
print b: [3]
print b: [4]
print b: [5]
print b: [6]
print b: [7]
print b: [8]
print b: [9]
45

Основная причина, по которой я запутался, заключается в том, что иногда он предоставляет все девятки, что заставляет меня думать, что он загружает последнее значение, назначенное 10 раз, однако иногда он загружает разные значения, что, кажется, противоречит этой теории.

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

1 ответ

Когда вы звоните tf.assign(a, tf.Variable(i)) это на самом деле не сразу присваивает значение второй переменной первой. Он просто создает операцию в NN, чтобы выполнить назначение, когда sess.run(...) называется.

Когда он вызывается, все 10 назначений пытаются выполнить их назначение одновременно. Один из них случайным образом выигрывает, а затем попадает в 10 assign_add операции, которые фактически умножают это в 10 раз.

Что касается вашей мотивирующей проблемы реализации воспроизведения опыта, большинство подходов, с которыми я столкнулся, используют tf.placeholder() подать содержимое буфера опыта в сеть на тренировках.

Другие вопросы по тегам