#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 предотвратит достижение оценками их истинных значений. Если бы вы могли поделиться своим кодом целиком, сообщество могло бы предоставить больше информации.