首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义DQN的输出大小

定义DQN的输出大小
EN

Stack Overflow用户
提问于 2020-04-09 11:29:57
回答 1查看 77关注 0票数 0

最近,我以“Cartpol-v1”环境为例学习了Q-学习。

该模型的预测函数总是返回一个类似于[[ 0.31341377 -0.03776223]]的向量。我创建了我自己的小游戏,Ai必须用ouput 0和1向左或向右移动。我只向网络显示一个列表[0, 0, 1, 0, 0],如果它输出0,它向左,如果它输出1,它就向右。到达左0,你就赢了,右0,你输了。真的很容易。然而,当我打印我的输出向量时,我总是得到这样的信息:

代码语言:javascript
复制
[[0.01347399 0.04450664]
 [0.01347399 0.04450664]
 [0.01347399 0.04450664]
 [0.1216775  0.38299465]
 [0.01347399 0.04450664]]

这会扰乱学习函数,因为np.argmax()然后返回类似或5的内容,而且网络无法处理这个问题,因为开始时只有两个操作。

这是我的模型的缺点:

代码语言:javascript
复制
    def __init__(self, state_shape, num_actions, lr):
        super(DQN, self).__init__()
        self.state_shape = state_shape # (1,)
        self.num_actions = num_actions # 2
        self.lr = lr # 1e-3

        input_state = Input(shape=state_shape)
        x = Dense(20)(input_state)
        x = Activation('relu')(x)
        x = Dense(20)(x)
        x = Activation('relu')(x)
        output_pred = Dense(self.num_actions)(x)

        self.model = Model(inputs=input_state, outputs=output_pred)
        self.model.compile(loss="mse", optimizer=Adam(lr=self.lr))

完整的代码可在https://www.mediafire.com/file/rq7ogjxpr990e51/dqn.py/file上使用。

如何裁剪输出矢量?或者,为了获得有用的输出,我必须如何更改输入?

编辑:

我做了更多的实验,并且将num_actions从当前的2增加到例如4确实会水平地增加向量,所以看起来如下:

代码语言:javascript
复制
[[ 0.00109814  0.01464381 -0.00270887 -0.00422738]
 [ 0.00109814  0.01464381 -0.00270887 -0.00422738]
 [-0.01450843  0.10628925 -0.06114068 -0.10908635]
 [ 0.00109814  0.01464381 -0.00270887 -0.00422738]
 [ 0.00109814  0.01464381 -0.00270887 -0.00422738]]

这意味着,num_actions作为2不是问题,而是它的5行而不是1。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-09 14:10:01

因此,经过更多的实验,我找到了一个解决方案。

输入仍然是list [0, 0, 1, 0, 0],它的len() = 5,这解释了这五行。如果它更改为[[0, 0, 1, 0, 0]],而state_shape被更改为(5 ),那么它就工作了,我得到了一个包含2个值的向量。

*访问列表的所有其他函数都必须从board[idx]更改为board[0][idx]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61120151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档