【问题标题】:How to define output layer shape of DQN model in Keras如何在 Keras 中定义 DQN 模型的输出层形状
【发布时间】:2019-07-23 16:16:17
【问题描述】:

我正在尝试学习 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)

这是电路板预处理(一次热编码)

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

【问题讨论】:

    标签: python keras deep-learning reinforcement-learning q-learning


    【解决方案1】:

    好吧,经过几次尝试后,我发现我的输入已被转置,因此我将 input_dim 设置为 ((BOARD_SIZE^2)*3) 并将 input_board 重新整形为 (1, (BOARD_SIZE^2)*3) 固定问题。希望它会在未来对其他人有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2018-09-06
      • 2020-08-17
      相关资源
      最近更新 更多