Я довольно новичок в Tensorflow и пытаюсь максимизировать какую-то функцию вознаграждения, которая зависит от выходов нейронной сети. Моя сеть выглядит так:
x = tf.placeholder(tf.float32, [None, 1])
with tf.variable_scope("weights", reuse=tf.AUTO_REUSE):
A1 = tf.get_variable("A1", shape=[q1, d],
initializer=tf.contrib.layers.xavier_initializer())
b1 = tf.get_variable("b1", shape=[q1,1],
initializer=tf.contrib.layers.xavier_initializer())
A2 = tf.get_variable("A2", shape=[q2,q1],
initializer=tf.contrib.layers.xavier_initializer())
b2 = tf.get_variable("b2", shape=[q2,1],
initializer=tf.contrib.layers.xavier_initializer())
A3 = tf.get_variable("A3", shape=[1,q2],
initializer=tf.contrib.layers.xavier_initializer())
b3 = tf.get_variable("b3", shape=[1,1],
initializer=tf.contrib.layers.xavier_initializer())
layer1 = tf.nn.relu(tf.matmul(A1,x) + b1)
layer2 = tf.nn.relu(tf.matmul(A2,layer1) + b2)
output = tf.nn.sigmoid(tf.matmul(A3,layer2) + b3)
Таким образом, он имеет d
-мерный ввод, два скрытых слоя с единицами q1
и q2
и единицу вывода. Мой набор обучающих данных xtrain
состоит из M d-dim векторов, которые создают вознаграждение следующим образом:
reward = 0
for i in range M
xtrain[i] = ... # [d,1] vector
reward = reward + 1/M * (g(xtrain[i]) *output)
, где g
- некоторая функция, зависящая от записей обучающего набора, а output
- это значение, которое создается при вводе xtrain[i]
в сеть, указанную выше.
То, что я хочу сделать, это максимизировать reward
(или минимизировать -reward
). Как я могу это сделать, используя AdamOptimizer? Я пытался вызвать его, просто позвонив train = tf.train.AdamOptimizer().minimize(-reward)
, а затем выполнив tf.Session.run(train, feed_dict = {x: xtrain})
, но это работает вечно.