在Theano的每个时间步都有动态输入的RNN

时间:2015-09-28 13:35:46

标签: python theano

我想知道在最初不知道输入的情况下是否有可能在Theano中实施经常性网络。 具体来说,我想到了“视觉注意的复发模型”论文(http://arxiv.org/abs/1406.6247)以及有关游戏的部分。在这种情况下,每个游戏图像仅在网络输出动作后才可用。

据我所知,Theano中的RNN是使用theano.scan函数实现的,该函数需要序列作为输入。显然,如果不运行完整的循环循环并记录将要生成的动作,我就无法生成这样的游戏图像序列。而且我无法运行循环并生成动作序列,因为我没有将游戏图像序列作为输入传递。

因此,似乎在这些条件下我无法使用正确的反向传播并正确训练网络。我可以手动运行循环的每次迭代,但之后就没有BPTT。

我在这里缺少什么? 是否有可能在描述Theano游戏部分的论文中实现该算法(我已经看过数字分类部分的实现,但它更容易,因为输入永远不会改变)?

感谢。

1 个答案:

答案 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()