这是使用Keras库创建模型的代码片段:
for state, action, reward, next_state, done in minibatch:
target = reward
if not done:
target = (reward + self.gamma *
np.amax(self.model.predict(next_state)[0]))
target_f = self.model.predict(state)
#print (target_f)
target_f[0][action] = target
self.model.fit(state, target_f, epochs=1, verbose=0)
我正在尝试将其向量化。我认为要做的唯一方法是: 1.创建一个numpy表,每行=(状态,操作,奖励,next_state,完成,目标)。因此,将有“小批量”行数。 2.根据其他列将目标列更新为(使用掩码数组):
target[done==True] ==reward
target[done==False] == reward + self.gamma
*np.amax(self.model.predict(next_state)[0])
NB:状态为8-D,所以状态向量有8个元素。
尽管付出了数小时的努力,但我仍然无法对此进行正确编码。 实际上可以对这段代码进行矢量化处理吗?
答案 0 :(得分:2)
您非常亲密!假设minibatch
是np.array
:
首先找到done
为真的所有索引。假设done
是索引号4。
minibatch_done=minibatch[np.where(minibatch[:,4]==True)]
minibatch_not_done=minibatch[np.where(minibatch[:,4]==False)]
现在,我们使用它来有条件地更新minibatch
矩阵。假设索引2为reward
,索引3为next_state
target=np.empty((minibatch.shape[0]))
target=minibatch_done[:,2]+self.gamma*np.amax(self.model.predict(minibatch_done[:,3]))
target=minibatch_not_done[:,2]
在那里,你有:)