Keras 深度Q学习的自定义损失函数

Keras 深度Q学习的自定义损失函数,keras,deep-learning,reinforcement-learning,q-learning,Keras,Deep Learning,Reinforcement Learning,Q Learning,解决强化学习问题时出现以下问题。在我的代码中,当计算损失时,我最终遇到了以下问题:我的神经网络输出4个q值(给定一个状态作为输入,它输出每个动作的q值,给定该状态-->4个可能动作)。现在对于DQN算法,我想计算y_true(它基本上代表折扣奖励,因此只是一个标量)和我的代理实际采取的行动的q值(因此只是四个q值中的一个)之间的损失。在那里,我无法使用keras中提供的自定义MSE。我想我需要以下结构: import keras.backend as kb def custom_loss_fu

解决强化学习问题时出现以下问题。在我的代码中,当计算损失时,我最终遇到了以下问题:我的神经网络输出4个q值(给定一个状态作为输入,它输出每个动作的q值,给定该状态-->4个可能动作)。现在对于DQN算法,我想计算y_true(它基本上代表折扣奖励,因此只是一个标量)和我的代理实际采取的行动的q值(因此只是四个q值中的一个)之间的损失。在那里,我无法使用keras中提供的自定义MSE。我想我需要以下结构:

import keras.backend as kb

def custom_loss_function(batch_action_taken):
    def loss(y_true, y_pred):
        q_value = ? #need to extract the q_values from y_pred according to the action taken in batch_action_taken
        return kb.mean(kb.square(q_value - y_true), axis=-1)
    return loss
但是由于函数中的值是keras对象,我不确定如何对放置注释的行进行编码

我希望,我解释得很好。我也在谷歌上搜索了很多,但我找不到答案

编辑:出于澄清目的:

采取的批量操作:长度为36的向量,每个条目为0、1、2或3

y\u true:长度为36的向量

y\u pred:的大小为(36,4)(对于每个数据点,总共36,4个可能的操作)

q\u值:应该是一个长度为36的向量,每个条目对应于y\u pred中一行中的一个值,具体取决于所采取的批处理操作的对应值这可能会有所帮助

# Based on your [action_size]
actions = kb.placeholder(shape=(None,[action_size]), dtype='float32')

q_value = kb.sum(kb.dot(batch_action_taken, actions), axis=1) 
return kb.mean(kb.square(q_value - y_true), axis=1)

遗憾的是,我得到了AttributeError:“tuple”对象在代码的第二行没有属性“rank”。很遗憾听到这个消息。我不确定这是为什么,但可能与这个问题有关: