我正在尝试训练神经网络以有效地探索网格以使用Keras和Keras-RL来定位对象。每个“步骤”,代理人通过选择从0
到8
的数字来选择探索方向,其中每个数字对应于基数或中间方向。
(对于这个简单的任务使用强化学习显然不是最佳选择,因为一个简单的算法可以轻松地来回扫描以实现目标。但是,这更像是一个“技术演示”并且对我自己提出挑战。)
下图表示所有可能的选择。 0
表示向西北,1
表示向北,2
表示向东北等。请注意4
代表保持静止的选择。
0 1 2
3 4 5
6 7 8
观察函数返回特定半径“视觉”(.flatten()
ed)内瓦片的探索状态,而奖励函数只返回此半径内未探测的网格瓦片的数量。
在下图中,使用半径2
,█
表示已探索的图块,■
表示视野范围内的图块,o
表示资源管理器,x
表示所需的对象,而表示完全未开发的图块。
+--------+
|████████|
|██■■■█ |
|██■o■ |
| ■■■ |
| x|
+--------+
我使用的是以下型号。在我的实验中,我通常使用20x20网格,具有不同数量的16节点Dense
层(任意选择)。
model = Sequential()
model.add(LSTM(2, input_shape=(1,) + observation_shape))
# observation_shape is the number of tiles being returned by observation
for _ in range(nb_dense):
model.add(Dense(dense_output))
# nb_dense and dense_output are varied manually, for testing purposes
model.add(Dense(nb_actions)) # output shape = 9 (number of directions)
model.add(Activation("linear"))
print(model.summary())
memory = SequentialMemory(limit=50000, window_length=1)
policy = EpsGreedyQPolicy(eps=.1)
dqn = DQNAgent(
model=model,
nb_actions=nb_actions,
memory=memory,
nb_steps_warmup=10,
target_model_update=1e-2,
policy=policy
)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])
dqn.fit(env, nb_steps=50000, visualize=False, verbose=2)
dqn.test(env, nb_episodes=5, visualize=True)
不幸的是,即使经过大量测试,代理仍然无法在合理的时间内找到对象,如果有的话。
Dense
,LSTM
等等吗?)SequentialMemory
,EpsGreedyQPolicy
,DQNAgent
或.compile()
值是否不适合这种情况?一般情况下,我如何改进网络,以便它实际上能够在探索中成功,在相对较短的时间内找到对象,无论其位置如何?