最近,我以“Cartpol-v1”环境为例学习了Q-学习。
该模型的预测函数总是返回一个类似于[[ 0.31341377 -0.03776223]]的向量。我创建了我自己的小游戏,Ai必须用ouput 0和1向左或向右移动。我只向网络显示一个列表[0, 0, 1, 0, 0],如果它输出0,它向左,如果它输出1,它就向右。到达左0,你就赢了,右0,你输了。真的很容易。然而,当我打印我的输出向量时,我总是得到这样的信息:
[[0.01347399 0.04450664]
[0.01347399 0.04450664]
[0.01347399 0.04450664]
[0.1216775 0.38299465]
[0.01347399 0.04450664]]这会扰乱学习函数,因为np.argmax()然后返回类似或5的内容,而且网络无法处理这个问题,因为开始时只有两个操作。
这是我的模型的缺点:
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确实会水平地增加向量,所以看起来如下:
[[ 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。
发布于 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]。
https://stackoverflow.com/questions/61120151
复制相似问题