设置verbose=0未生效:Deep Q-Learning训练仍输出日志
解决Keras model.fit(verbose=0)仍输出训练信息的问题
你看到的输出并非来自model.fit(),而是循环中两次model.predict()调用产生的——Keras的predict()方法默认verbose=1,会打印单batch的进度条信息。
解决方案
在所有model.predict()调用中添加verbose=0参数,即可抑制该输出:
修改replay()函数中的predict代码:
def replay(self, batch_size): # training if len(self.memory) < batch_size: return mini_batch = random.sample(self.memory, batch_size) for state, action, reward, next_state, done in mini_batch: if done: target = reward else: # 给predict添加verbose=0 target = reward + self.gamma * np.amax(self.model.predict(next_state, verbose=0)[0]) # 给predict添加verbose=0 train_target = self.model.predict(state, verbose=0) train_target[0][action] = target self.model.fit(state, train_target, epochs=1, verbose=0)
额外优化建议
当前循环中每次迭代都单独调用predict和fit,效率较低。可以尝试批量处理所有样本的state和next_state,一次性完成predict操作,既减少冗余的IO输出,也能提升训练速度:
def replay(self, batch_size): if len(self.memory) < batch_size: return mini_batch = random.sample(self.memory, batch_size) # 批量提取state、next_state states = np.array([x[0] for x in mini_batch]) next_states = np.array([x[3] for x in mini_batch]) # 一次性批量predict state_preds = self.model.predict(states, verbose=0) next_state_preds = self.model.predict(next_states, verbose=0) for i, (state, action, reward, next_state, done) in enumerate(mini_batch): if done: target = reward else: target = reward + self.gamma * np.amax(next_state_preds[i]) state_preds[i][action] = target # 批量fit self.model.fit(states, state_preds, epochs=1, verbose=0)
内容的提问来源于stack exchange,提问作者Don Coder
相关产品推荐
相关产品推荐

