在Tensorflow中计算行动损失和报酬

时间:2018-08-21 08:01:21

标签: python tensorflow reinforcement-learning

我正在尝试通过3个离散动作来计算RL项目中的损失。我有针对$的模型的输出预测(例如3种可能的操作,批处理大小为2):

tf.layers.dense()

我有一个由代理商采取的措施(例如):

[[10, 20.2, 4.3],
 [5, 3, 8.9]]

我有幸从环境中采取这种行动(例如):

[[1],
 [2]]

我想使用该动作作为指标和奖励来计算所采取动作的损失。我没有任何未采取的措施的信息。如果只是计算差额,我希望损失(来自前面的示例)为:

[[30.0],
 [15.0]]

我尝试过:

[[0, 9.8, 0],
 [0, 0, 6.1]]

但这得到updated = tf.scatter_update(logits, action, reward) loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=updated, logits=logits) 。我相信这是因为输入是张量,而不是AttributeError: 'Tensor' object has no attribute '_lazy_read'所需的变量。

我该如何计算损失?

1 个答案:

答案 0 :(得分:3)

您不能使用scatter_update,因为那是用于一维数据。您可能需要研究gather_ndscatter_nd的工作方式。但是以下代码可解决您的问题。

import tensorflow as tf

num_actions = 3
batch_size = 2
tf.reset_default_graph()

output = tf.convert_to_tensor([[10, 20.2, 4.3],[5, 3, 8.9]])

# There's a bit of dark magic looking reshaping going here
# Essentially to get tensor a in the correct shape of indices
# gather_nd requires
a_idx = tf.reshape(tf.range(batch_size),[-1,1])

a = tf.convert_to_tensor([[1],[2]])

a_reshaped = tf.reshape(tf.concat([a_idx,a],axis=1),[-1,1,2])

r = tf.convert_to_tensor([[30.0],[15.0]])

diff = tf.gather_nd(output, a_reshaped)
loss = tf.scatter_nd(a_reshaped, r-diff, (batch_size, num_actions))