我对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维矢量组成,这些矢量会产生如下奖励:
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})
来调用它,但是它一直都在运行。