[英]How to predict while training?
我正在開展一個強化學習項目,其中代理是負載均衡器,用於觀察服務請求和服務器的狀態。 代理應該在積累一些觀察/動作(將請求分配給服務服務器)/獎勵(請求是否得到妥善處理,即及時/正確)后進行一些批處理訓練。
我不希望代理在進行批量訓練時停機。
所以我嘗試使用python的多處理來啟動另一個過程來訓練傳遞當前模型的權重並在訓練后替換代理的model。
問題是,訓練過程掛在該復制模型上的預測調用(與代理模型具有相同權重的新實例)。 我在新的 model 上調用 predict() 用於強化學習。 fit() 是訓練過程的主要目的。 但是,無論如何它都停留在 predict() 上。
我嘗試了一些谷歌搜索,發現一些帖子說 keras 在與多處理一起使用時表現出一些奇怪的行為,但我找不到適合我的解決方案。
我還嘗試了更一般的搜索查詢,例如我的問題的標題。 令人驚訝的是,這方面的信息更少。
下面是一些抽象的代碼
def batch_train(self, weights, ret):
model = self.build_model()
model.set_weights(weights)
batch = self.memory[:self.batch_size]
with threading.Lock():
self.memory = self.memory[self.batch_size:]
X = []
Y = []
for state, action, next_state, reward in batch:
print(state, action, next_state, reward)
print(model)
print(model.predict(next_state)[0])
print('2')
reward = reward + self.discount_factor * np.amax([0])
target = model.predict(state)[0]
print('3')
target[action] = reward
X.append(state)
Y.append(target)
X = np.array(X)
Y = np.array(Y)
model.fit(X, Y, epochs=1)# , verbose=0)
print('finish training...')
ret.put(model)
def run and train():
model = self.build_model()
print(model)
p_train = None
ret = Queue()
for t in range(self.batch_size):
time.sleep(self.observation_interval)
state = get_state()
action = get_action()
reward = get_reward()
with threading.Lock():
self.memory.append((prev_state, prev_action, state, reward))
prev_state = state
prev_action = action
# start a thread to batch training a new model
# replace current model with new model upon completion
if p_train is not None:
model = ret.get()
print('waiting for join')
p_train.join()
print('calling batch_train...')
p_train = Process(target=self.batch_train, args=(model.get_weights(), ret))
p_train.start()
不知道為什么,但是在每個進程中分別導入 keras 可以解決問題。
這里提到了。 如何使用 Keras 在深度學習中利用多處理和多線程?
所以我只是重組了我的代碼,從與 Pipe() 通信的一開始就並行運行訓練進程和服務進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.