我的目標是開發(fā)一個DQN代理,它將根據(jù)特定的策略/策略選擇其操作。我以前使用OpenAi健身房環(huán)境,但現(xiàn)在我想創(chuàng)建自己的RL環(huán)境。在此階段,代理應(yīng)選擇隨機操作或根據(jù)深度神經(jīng)網(wǎng)絡(luò)(在DQN類中定義)給出的預(yù)測選擇其操作。到目前為止,我已經(jīng)設(shè)置了神經(jīng)網(wǎng)絡(luò)模型和我的環(huán)境。NN 應(yīng)接收狀態(tài)作為其輸入。這些狀態(tài)表示 11 個可能的標量值,范圍從 9.5 到 10.5(9.5、9.6、...、10.4、10.5)。由于我們正在處理RL,因此代理在訓(xùn)練過程中生成其數(shù)據(jù)。輸出應(yīng)為 0 和 1,對應(yīng)于建議的操作。現(xiàn)在,我想給我的代理一個標量值:例如,一個樣本狀態(tài)x = 10,讓他決定要執(zhí)行的操作(調(diào)用Agent.select_action()),我遇到了與輸入形狀/輸入維度相關(guān)的問題。代碼如下:1. DQN 類:class DQN(): def __init__(self, state_size, action_size, lr): self.state_size = state_size self.action_size = action_size self.lr = lr self.model = Sequential() self.model.add(Dense(128, input_dim=self.state_size, activation='relu')) self.model.add(Dense(128, activation='relu')) self.model.add(Dense(self.action_size, activation='linear')) self.model.compile(optimizer=Adam(lr=self.lr), loss='mse') self.model.summary() def model_info(self): model_description = '\n\n---Model_INFO Summary: The model was passed {} state sizes,\ \n {} action sizes and a learning rate of {} -----'\ .format(self.state_size, self.action_size, self.lr) return model_description def predict(self, state): return self.model.predict(state) def train(self, state, q_values): self.state = state self.q_values = q_values return self.model.fit(state, q_values, verbose=0) def load_weights(self, path): self.model.load_weights(path) def save_weights(self, path): self.model.save_weights(path)2. 代理類:NUM_EPISODES = 100MAX_STEPS_PER_EPISODE = 100EPSILON = 0.5 EPSILON_DECAY_RATE = 0.001EPSILON_MIN = 0.01EPSILON_MAX = 1DISCOUNT_FACTOR = 0.99REPLAY_MEMORY_SIZE = 50000BATCH_SIZE = 50TRAIN_START = 100ACTION_SPACE = [0, 1]STATE_SIZE = 11 LEARNING_RATE = 0.01
1 回答

大話西游666
TA貢獻1817條經(jīng)驗 獲得超14個贊
這里有幾個問題。首先,您所說的實際上是一個狀態(tài)空間,即您的代理可以處于的所有可能狀態(tài)的集合。狀態(tài)大小實際上是 1,因為只有一個參數(shù)要作為狀態(tài)傳遞。state_size
在此處定義輸入圖層時:
self.model.add(Dense(128, input_dim=self.state_size, activation='relu'))
您說輸入維度將等于 11,但當(dāng)您調(diào)用預(yù)測時,您將它傳遞給 1 個數(shù)字 (10)。
因此,您要么需要修改以僅接收一個數(shù)字,要么可以定義狀態(tài)向量,例如,每個數(shù)字對應(yīng)于一個可能的狀態(tài)(從9.5到10.5)。因此,當(dāng)狀態(tài)為 9.5 時,您的狀態(tài)向量為 9.5,依此類推。input_dim
state = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
[1, 0, 0, ...0]
第二個問題是,當(dāng)你定義你的狀態(tài)時,你應(yīng)該把方括號
state = np.array([10])
否則數(shù)組的形狀是(),我相信你已經(jīng)發(fā)現(xiàn)了。
希望它有幫助!如果您需要任何澄清,請告訴我。
添加回答
舉報
0/150
提交
取消