агент keras dqn ожидает больше измерений

#python #tensorflow #keras #reinforcement-learning

#python #тензорный поток #keras #подкрепление-обучение

Вопрос:

Я создал пользовательскую среду на основе OpenAI gym, в которой я планирую обучить агента DQN.

В этой среде каждое пространство наблюдения состоит из одной строки и 75 столбцов, и так далее.

 env.observation_space.shape

(75,)
 

Когда я создаю модель, я использую следующее:

 def build_model(states, actions):
    model = Sequential()
    model.add(Dense(75, activation = 'relu', input_dim = 75))
    model.add(Dense(75, activation = 'relu'))
    model.add(Dense(actions, activation = 'relu'))
    return model
 

С формой вывода первого слоя (none, 75) и формой вывода последнего слоя (none, 3) для каждого из трех возможных действий.

При создании моего агента я использую:

 def build_agent(model, actions):
    policy = BoltzmannQPolicy()
    memory = SequentialMemory(limit=50000, window_length=1)
    dqn = DQNAgent(model=model, memory=memory, policy=policy, 
                  nb_actions=actions, nb_steps_warmup=10, target_model_update=1e-2)
    return dqn
 

Однако установка агента выдает следующую ошибку:

 dqn = build_agent(model, actions)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])
dqn.fit(env, nb_steps=50000, visualize=False, verbose=1)

Error when checking input: expected dense_58_input to have 2 dimensions, but got array with shape (1, 1, 75)
 

Я не понимаю, как можно было ожидать дополнительного измерения, учитывая, что мои данные наблюдений состоят из 75 столбцов. Нужно ли мне изменить мои входные данные или переопределить входной слой моей модели?

Комментарии:

1. Какую библиотеку вы используете для DQNAgent, SequentialMemory, BoltzmannPolicy и т. Д.? Я предполагаю, что это может быть связано с тем, как сети инициализируются в этой библиотеке с использованием атрибута gym.observation_space в среде.

2. в настоящее время используется rl.agents. Позже я исправил эту проблему, используя слой выравнивания в качестве первого.

3. Не могли бы вы поделиться своим кодом целиком? Похоже, что вы используете relu в своем последнем слое, что кажется неправильным.

Ответ №1:

Из раздела комментариев в интересах сообщества.

в настоящее время используется rl.agents . Я исправил эту проблему, используя слой выравнивания в качестве первого слоя.

Комментарии:

1. Ага, и как именно сплющенный слой решил проблему? Я бы все равно ожидал начать с плотного слоя или явно определить входной слой с помощью input_shape, который напоминает пространство наблюдения.

Ответ №2:

Я вижу, что вы используете активацию relu в своем последнем слое. DQN обычно выполняет регрессию для прогнозирования q-значений для каждого действия, и использование активации relu предотвратит достижение оценками их истинных значений. Если бы вы могли поделиться своим кодом целиком, сообщество могло бы предоставить больше информации.