如何在 Keras 中定义 DQN 模型的输出层形状
How to define output layer shape of DQN model in Keras
我正在尝试学习 DQN 代理以使用 Keras 玩井字游戏。问题是我的输出形状与我预期的不同。
详情:
输入形状:(BOARD_SIZE ^ 2) * 3
--> 这是一个热编码的游戏板
输出形状:我希望输出将是大小为 (BOARD_SIZE^2)
的列表,因为它应该有可用操作数
问题:
输出具有形状输入层的大小[(BOARD_SIZE ^ 2) *3] * Number of actions (BOARD_SIZE^2)
我试图寻找解决方案,但 Keras 文档很差。请帮忙
这是我的模特
def create_model(self, game: GameController) -> Sequential:
input_size = (game.shape ** 2) * 3
model = Sequential()
model.add(Dense(input_size, input_dim=1, activation='relu'))
model.add(Dense(int(input_size / 2), activation='relu'))
model.add(Dense(int(input_size / 2), activation='relu'))
model.add(Dense((game.shape ** 2), activation='linear'))
model.compile(loss="mean_squared_error", optimizer=Adam(self.alpha))
return model
这就是我尝试获取输出的方式
q_values = self.model.predict(processed_input)
这是 BOAD 预处理(一次热编码)
def preprocess_input(self, game: GameController) -> list:
encoded_x = copy.deepcopy(game.board)
encoded_o = copy.deepcopy(game.board)
encoded_blank = copy.deepcopy(game.board)
for row in range(game.shape):
for col in range(game.shape):
if encoded_x[row][col] == 'X':
encoded_x[row][col] = 1
else:
encoded_x[row][col] = 0
if encoded_o[row][col] == 'O':
encoded_o[row][col] = 1
else:
encoded_o[row][col] = 0
if encoded_blank[row][col] == '-':
encoded_blank[row][col] = 1
else:
encoded_blank[row][col] = 0
chained_x = list(chain.from_iterable(encoded_x))
chained_o = list(chain.from_iterable(encoded_o))
chained_blank = list(chain.from_iterable(encoded_blank))
string_board = list(chain(chained_x, chained_o, chained_blank))
board_to_int = [int(element) for element in string_board]
return board_to_int
好吧,经过几次尝试,我发现我的输入已被转置,所以我将 input_dim 设置为 ((BOARD_SIZE^2)*3) 并将 input_board 重塑为(1, (BOARD_SIZE^2)*3) 修复了问题。希望以后对其他人有帮助:)
我正在尝试学习 DQN 代理以使用 Keras 玩井字游戏。问题是我的输出形状与我预期的不同。
详情:
输入形状:(BOARD_SIZE ^ 2) * 3
--> 这是一个热编码的游戏板
输出形状:我希望输出将是大小为 (BOARD_SIZE^2)
的列表,因为它应该有可用操作数
问题:
输出具有形状输入层的大小[(BOARD_SIZE ^ 2) *3] * Number of actions (BOARD_SIZE^2)
我试图寻找解决方案,但 Keras 文档很差。请帮忙
这是我的模特
def create_model(self, game: GameController) -> Sequential:
input_size = (game.shape ** 2) * 3
model = Sequential()
model.add(Dense(input_size, input_dim=1, activation='relu'))
model.add(Dense(int(input_size / 2), activation='relu'))
model.add(Dense(int(input_size / 2), activation='relu'))
model.add(Dense((game.shape ** 2), activation='linear'))
model.compile(loss="mean_squared_error", optimizer=Adam(self.alpha))
return model
这就是我尝试获取输出的方式
q_values = self.model.predict(processed_input)
这是 BOAD 预处理(一次热编码)
def preprocess_input(self, game: GameController) -> list:
encoded_x = copy.deepcopy(game.board)
encoded_o = copy.deepcopy(game.board)
encoded_blank = copy.deepcopy(game.board)
for row in range(game.shape):
for col in range(game.shape):
if encoded_x[row][col] == 'X':
encoded_x[row][col] = 1
else:
encoded_x[row][col] = 0
if encoded_o[row][col] == 'O':
encoded_o[row][col] = 1
else:
encoded_o[row][col] = 0
if encoded_blank[row][col] == '-':
encoded_blank[row][col] = 1
else:
encoded_blank[row][col] = 0
chained_x = list(chain.from_iterable(encoded_x))
chained_o = list(chain.from_iterable(encoded_o))
chained_blank = list(chain.from_iterable(encoded_blank))
string_board = list(chain(chained_x, chained_o, chained_blank))
board_to_int = [int(element) for element in string_board]
return board_to_int
好吧,经过几次尝试,我发现我的输入已被转置,所以我将 input_dim 设置为 ((BOARD_SIZE^2)*3) 并将 input_board 重塑为(1, (BOARD_SIZE^2)*3) 修复了问题。希望以后对其他人有帮助:)