我想知道在最初不知道输入的情况下是否有可能在Theano中实施经常性网络。 具体来说,我想到了“视觉注意的复发模型”论文(http://arxiv.org/abs/1406.6247)以及有关游戏的部分。在这种情况下,每个游戏图像仅在网络输出动作后才可用。
据我所知,Theano中的RNN是使用theano.scan函数实现的,该函数需要序列作为输入。显然,如果不运行完整的循环循环并记录将要生成的动作,我就无法生成这样的游戏图像序列。而且我无法运行循环并生成动作序列,因为我没有将游戏图像序列作为输入传递。
因此,似乎在这些条件下我无法使用正确的反向传播并正确训练网络。我可以手动运行循环的每次迭代,但之后就没有BPTT。
我在这里缺少什么? 是否有可能在描述Theano游戏部分的论文中实现该算法(我已经看过数字分类部分的实现,但它更容易,因为输入永远不会改变)?
感谢。
答案 0 :(得分:1)
如果我理解正确(假设您指的是“捕获”的简单游戏),我认为没有任何问题。
在第一时间步骤中可以提供给网络的游戏的初始状态(即球拍的初始位置和球的初始位置)。网络预测要执行的动作,并且基于所选择的动作更新游戏状态。然后在第二时间步骤中将更新的游戏状态作为输入提供给网络。
以下是一些示例代码,展示了如何使用较早时间步的输出来更新theano.scan
操作中的状态。
import theano
import theano.tensor as tt
def choose_action(s):
# TODO: Given the game state s, choose which action to perform
return s.argmax()
def update_state(s, y):
# TODO: Update game state s given action y
return s + y
def is_end_state(s):
# TODO: Determine whether game state s is an end-game state
return s.max() > 100
def step(s_tm1):
y_tm1 = choose_action(s_tm1)
s_t = update_state(s_tm1, y_tm1)
return (y_tm1, s_t), theano.scan_module.until(is_end_state(s_t))
def main():
theano.config.compute_test_value = 'raise'
initial_state = tt.matrix()
initial_state.tag.test_value = [[0, 2, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]]
(action_sequence, state_sequence), _ = theano.scan(step, outputs_info=[None, initial_state], n_steps=1000)
state_sequence = tt.concatenate([[initial_state], state_sequence])
f = theano.function([initial_state], outputs=[action_sequence, state_sequence])
main()