我试图实施一个播放Doom的深层Q网络(vizdoom)
但是我(从昨天开始)因为一个热门编码及其后果的问题而陷入困境:事实上,我有3个可能的行为,就像这样编码
[[True, False, False], [False, True, False], [False, False, True]]
size = [Batch_size,3]
当我对一个动作数组进行one_hot编码时,我获得了这个大小的数组[BatchSize,3,3]
因此,当我想计算我的Q值估计时:
Q = tf.reduce_sum(tf.multiply(self.output, self.actions_one_hot), axis=1)
tf.multiply(self.output, self.actions_one_hot)
产生错误:
InvalidArgumentError: Incompatible shapes: [10,3] vs. [10,3,3]
[[Node: DQNetwork/Mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](DQNetwork/dense/BiasAdd, DQNetwork/one_hot)]]
我知道这两种形状不相容会增加,但我不明白我必须做些什么来使它们兼容。
更清楚this is the notebook with each part explained:
我确定我犯了一个非常愚蠢的错误,但我没有看到它。
感谢您的帮助!
答案 0 :(得分:2)
你必须使形状与tf.multiply
兼容,因为该函数是逐元素的乘法。
但是,我认为您可能对one_hot
做错了。通常,one_hot
函数将例如从数字变换为一个热矩阵。让我们假设你的动作空间中有3个可能的动作是(0,1,2),一个热门功能会将其转换为[[1,0,0],[0,1,0],[0,0,1]]
。
问题是您正在将one_hot向量发送到另一个one_hot函数。如果直接发送动作,则两个张量的形状都相同。
长话短说,您正在使用one_hot功能两次。如果你已经有[True,False,False]类型的向量,那么你已经有了one_hot。