实施LSTM time_step大小以进行强化学习

时间:2019-11-12 17:22:15

标签: python tensorflow keras lstm

我现在正在尝试为我的机器人和导航任务实现LSTM网络。我已经将DDQN与常规前馈NN结合使用,并希望将其与LSTM网络进行比较。我还以最简单的形式实现了LSTM,其样本和time_step大小为1,特征大小为364 =>(1,1,364)。根据我的研究,由于只有time_step和sample,因此这只是标准的FFNN。

这就是为什么我想将time_step的大小增加到10步。但是现在出现了另一个问题。在DDQN中,我应用了batch_size = 64的批处理学习。但是,如果我现在选择的time_step大小为10,那将不再起作用,因为LSTM网络现在希望在样本之上还有9个额外的时间步长。

这就是我提出问题的地方。如果我有一个随机批次,并且一个存储器包含一个时间点的信息(状态,next_state,动作,奖励,在特定时间t完成所有操作),我是否需要收集随机样本,然后选择9个数据点在那个样本之前,这样我的批次大小为(64,10,364)?

亲切的问候

最新代码:

def buildModel(self):
        model = Sequential()
        model.add(LSTM(64, input_shape=(1,364), return_sequences=True))
        model.add(LSTM(64))
        model.add(Dense(self.action_size, kernel_initializer='lecun_uniform'))
        model.add(Activation('linear'))
        model.compile(loss='mse', optimizer=RMSprop(lr=self.learning_rate, rho=0.9, epsilon=1e-06))
        model.summary()

培训代码:

def trainModel(self, target=False):
        mini_batch = random.sample(self.memory, self.batch_size)
        X_batch = np.empty((0, self.state_size), dtype=np.float64)
        Y_batch = np.empty((0, self.action_size), dtype=np.float64)
        Z_batch = np.empty((0, 1), dtype=np.float64)

        for i in range(self.batch_size):
            states = mini_batch[i][0]
            actions = mini_batch[i][1]
            rewards = mini_batch[i][2]
            next_states = mini_batch[i][3]
            dones = mini_batch[i][4]

            q_value = self.model.predict(states.reshape((1,1, len(states))))


            if target:
                next_target = self.target_model.predict(next_states.reshape((1,1, len(next_states))))


            else:
                next_target = self.model.predict(next_states.reshape((1,1, len(next_states))))

            next_q_value = self.getQvalue(rewards, next_target, dones)

            X_batch = np.append(X_batch, np.array([states.copy()]), axis=0)
            Y_sample = q_value.copy()

            Y_sample[0][actions] = next_q_value
            Y_batch = np.append(Y_batch, np.array([Y_sample[0]]), axis=0)


            if dones:
                X_batch = np.append(X_batch, np.array([next_states.copy()]), axis=0)
                Y_batch = np.append(Y_batch, np.array([[rewards] * self.action_size]), axis=0)

        X_batch = X_batch.reshape((len(Y_batch), 1, len(next_states)))

        self.model.fit(X_batch, Y_batch, batch_size=self.batch_size, epochs=1, verbose=0)

1 个答案:

答案 0 :(得分:0)

如果您使用的是LSTM,则想法是可以从序列中学到一些东西,而不是单个时间点,这使得最终的预测“更好”。因此,我相信您将需要构造输入数据,以使每个“样本”包含价值10个时间步长的要素数据。然后,可以通过添加下一时间步长并删除最早的时间步长(即滚动窗口)来创建下一个样本。可能还有其他方法可以实现相同的总体思路,但这只是一个建议。我希望我了解您的用例,但是我认为这是一个考虑的方向。我希望这有帮助。