【问题标题】:TensorFlow reinforcement learning softmax layerTensorFlow 强化学习 softmax 层
【发布时间】:2020-07-12 23:03:58
【问题描述】:

我对 TensorFlow 代码有疑问。这是我在之前的环境中使用的一段代码 - Cart-pole 问题

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)

我应该如何改变或改进它,以获得合适的结果和正确/更好的 TensorFlow 代码

【问题讨论】:

  • 跳过p_left_and_right的定义,直接使用logits作为多项式logits。对于y,您可能只想使用action。简而言之,删除 2-class 特定的 hack,你就可以开始了。
  • 我这样改:|隐藏= tf.layers.dense(X,n_hidden,激活=tf.nn.elu,kernel_initializer=initializer)| logits = tf.layers.dense(hidden, n_outputs) |动作 = tf.multinomial(tf.log(logits), num_samples=1) | y = 1. - tf.to_float(action) | cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=logits) 但还是不行

标签: python tensorflow neural-network reinforcement-learning softmax


【解决方案1】:

我没有尝试自己运行此程序,但我的猜测是放弃将伯努利案例映射到更一般的分类案例的技巧。

更具体地说,我会尝试这样做:


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)

(我假设您使用这些毕业生来建立适当的反馈信号,其中还涉及一些回报/优势)

【讨论】:

  • 有了这个我有一个错误:F ./tensorflow/core/framework/tensor.h:781] 检查失败:NDIMS == new_sizes.size() (2 vs. 1) Aborted (core倾倒)
【解决方案2】:

问题最简单的解决方案是改变交叉熵函数。我将其更改为 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)

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多