#python #keras #openai-gym #keras-rl
#python #keras #openai-тренажерный зал #keras-rl
Вопрос:
Ну, я пытаюсь предоставить в качестве входных данных список из 10 целых чисел для модели для keras-rl
, но, поскольку я использую новую среду OpenAI-Gym
, мне нужно настроить класс моего процессора так, как я хочу. Мой класс процессора выглядит следующим образом:
class RecoProcessor(Processor):
def process_observation(self, observation):
print("Observation:")
# print(observation.shape)
look_back = 10
if observation is None:
X=np.zeros(10)
else:
X=np.array(observation, dtype='float32')
# X.append(np.zeros{look_back - len(X)})
print(X.shape)
return X
def process_state_batch(self, batch):
print("Batch:")
print(batch.shape)
return batch
def process_reward(self, reward):
return reward
def process_demo_data(self, demo_data):
for step in demo_data:
step[0] = self.process_observation(step[0])
step[2] = self.process_reward(step[2])
return demo_data
И мой агент и модель похожи на это:
window_length = 1
emb_size = 100
look_back = 10
# "Expert" (regular dqn) model architecture
expert_model = Sequential()
# expert_model.add(Input(shape=(look_back,window_length)))
expert_model.add(Embedding(env.action_space.n 1, emb_size, input_length=look_back,mask_zero=True))
expert_model.add(LSTM(64, input_shape=(look_back,window_length)))
expert_model.add(Dense(env.action_space.n, activation='softmax'))
# try using different optimizers and different optimizer configs
expert_model.compile(loss='mse',
optimizer='adam',
metrics=['acc'])
# memory
memory = PrioritizedMemory(limit=5000, window_length=window_length)
# policy
policy = BoltzmannQPolicy()
# agent
dqn = DQNAgent(model=expert_model, nb_actions=env.action_space.n, policy=policy, memory=memory,
enable_double_dqn=False, enable_dueling_network=False, gamma=.6,
target_model_update=1e-2, nb_steps_warmup=100, processor = RecoProcessor())
Но когда y пытается выполнить это, я вижу, что результат выглядит следующим образом:
Training for 50000 steps ...
CCCCCCCCCCCC
(10,)
Interval 1 (0 steps performed)
AAAAAAAAAAAAAAA
(1, 1, 10)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-29-4d8fdf0e849e> in <module>
32 dqn.compile(Adam(lr), metrics=['mae'])
33
---> 34 train = dqn.fit(env, nb_steps=50000, visualize=False, verbose=1, nb_max_episode_steps = None)
35 np.savetxt(fichero_train_history,
36 np.array(train.history["episode_reward"]), delimiter=",")
c:users...srckeras-rlrlcore.py in fit(self, env, nb_steps, action_repetition, callbacks, verbose, visualize, nb_max_start_steps, start_step_policy, log_interval, nb_max_episode_steps)
167 # This is were all of the work happens. We first perceive and compute the action
168 # (forward step) and then use the reward to improve (backward step).
--> 169 action = self.forward(observation)
170 if self.processor is not None:
171 action = self.processor.process_action(action)
c:users...srckeras-rlrlagentsdqn.py in forward(self, observation)
87 # Select an action.
88 state = self.memory.get_recent_state(observation)
---> 89 q_values = self.compute_q_values(state)
90 if self.training:
91 action = self.policy.select_action(q_values=q_values)
c:users...srckeras-rlrlagentsdqn.py in compute_q_values(self, state)
67
68 def compute_q_values(self, state):
---> 69 q_values = self.compute_batch_q_values([state]).flatten()
70 assert q_values.shape == (self.nb_actions,)
71 return q_values
c:users...srckeras-rlrlagentsdqn.py in compute_batch_q_values(self, state_batch)
62 def compute_batch_q_values(self, state_batch):
63 batch = self.process_state_batch(state_batch)
---> 64 q_values = self.model.predict_on_batch(batch)
65 assert q_values.shape == (len(state_batch), self.nb_actions)
66 return q_values
~AppDataLocalContinuumanaconda3libsite-packageskeras-2.2.4-py3.7.eggkerasenginetraining.py in predict_on_batch(self, x)
1266 Numpy array(s) of predictions.
1267
-> 1268 x, _, _ = self._standardize_user_data(x)
1269 if self._uses_dynamic_learning_phase():
1270 ins = x [0.]
~AppDataLocalContinuumanaconda3libsite-packageskeras-2.2.4-py3.7.eggkerasenginetraining.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
749 feed_input_shapes,
750 check_batch_axis=False, # Don't enforce the batch size.
--> 751 exception_prefix='input')
752
753 if y is not None:
~AppDataLocalContinuumanaconda3libsite-packageskeras-2.2.4-py3.7.eggkerasenginetraining_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
126 ': expected ' names[i] ' to have '
127 str(len(shape)) ' dimensions, but got array '
--> 128 'with shape ' str(data_shape))
129 if not check_batch_axis:
130 data_shape = data_shape[1:]
ValueError: Error when checking input: expected embedding_12_input to have 2 dimensions, but got array with shape (1, 1, 10)
Как вы можете видеть, форма, которую я получаю, является формой пакетной обработки, и я не знаю, как ее решить. На всякий случай, если вы захотите провести несколько испытаний, среда, которую я использую, RecoGym
(версия 1).
Ответ №1:
Вы можете удалить ненужные измерения, используя свой собственный процессор.
from rl.core import Processor
class CustomProcessor(Processor):
'''
acts as a coupling mechanism between the agent and the environment
'''
def process_state_batch(self, batch):
'''
Given a state batch, I want to remove the second dimension, because it's
useless and prevents me from feeding the tensor into my CNN
'''
return numpy.squeeze(batch, axis=1)
А затем передайте его своему агенту, что-то вроде:
agent = DQNAgent(... , processor=CustomProcessor())
Получил ответ с этого форума:https://github.com/keras-rl/keras-rl/issues/113