Максимизировать функцию вознаграждения с Tensorflow - PullRequest
0 голосов
/ 06 января 2019

Я довольно новичок в 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}), но это работает вечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...