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