TensorFlow 强化学习 softmax 层
TensorFlow reinforcement learning softmax layer
我对 TensorFlow 代码有疑问。这是我在之前的环境中使用的一段代码 - Cart-pole problem
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
outputs = tf.nn.sigmoid(logits)
p_left_and_right = tf.concat(axis=1, values=[outputs, 1 - outputs])
action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)
y = 1. - tf.to_float(action)
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)
有两个可能的离散决定(向右和向左移动)。
我的决定是由 sigmoid 层给出的,后来是根据该层给出的概率随机选择的。
现在我的环境包含三个离散的可能决策,所以我尝试使用 softmax 层但它不起作用。当我启动 TensorFlow 会话时。
代码是这样的:
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
outputs = tf.nn.softmax(logits)
p_left_and_right = tf.concat(axis=3, values=[outputs])
action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)
y = 1. - tf.to_float(action)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)
我应该如何更改或改进它,以达到合适的结果和correct/better TensorFlow 的代码
我自己还没有尝试 运行 这个,但我的猜测是放弃引入的将伯努利案例映射到更一般的分类案例的技巧。
更具体地说,我会尝试这样做:
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
action = tf.multinomial(logits, num_samples=1)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=action, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)
(我假设您使用这些梯度来构建适当的反馈信号,其中还涉及一些 returns/advantages)
最简单的问题解决方案是更改交叉熵函数。我将其更改为 sparse_softmax_cross_entropy_with_logits ,它不需要一种热编码格式的标签。
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
action = tf.multinomial(logits, num_samples=1)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels= action[0], logits=logits)
我对 TensorFlow 代码有疑问。这是我在之前的环境中使用的一段代码 - Cart-pole problem
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
outputs = tf.nn.sigmoid(logits)
p_left_and_right = tf.concat(axis=1, values=[outputs, 1 - outputs])
action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)
y = 1. - tf.to_float(action)
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)
有两个可能的离散决定(向右和向左移动)。
我的决定是由 sigmoid 层给出的,后来是根据该层给出的概率随机选择的。
现在我的环境包含三个离散的可能决策,所以我尝试使用 softmax 层但它不起作用。当我启动 TensorFlow 会话时。 代码是这样的:
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
outputs = tf.nn.softmax(logits)
p_left_and_right = tf.concat(axis=3, values=[outputs])
action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)
y = 1. - tf.to_float(action)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)
我应该如何更改或改进它,以达到合适的结果和correct/better TensorFlow 的代码
我自己还没有尝试 运行 这个,但我的猜测是放弃引入的将伯努利案例映射到更一般的分类案例的技巧。
更具体地说,我会尝试这样做:
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
action = tf.multinomial(logits, num_samples=1)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=action, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)
(我假设您使用这些梯度来构建适当的反馈信号,其中还涉及一些 returns/advantages)
最简单的问题解决方案是更改交叉熵函数。我将其更改为 sparse_softmax_cross_entropy_with_logits ,它不需要一种热编码格式的标签。
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
action = tf.multinomial(logits, num_samples=1)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels= action[0], logits=logits)