Я реализую следующую оболочку, обычно используемую в OpenAI Gym для пропуска кадров. Его можно найти в dqn / atari_wrappers.py
Меня очень смущает следующая строка:
max_frame = np.max (np.stack (self._obs_buffer), axis = 0 )
Я добавил комментарии по всему коду для частей, которые я понимаю, и чтобы помочь любому, кто может помочь.
np.stack (self._obs_buffer) складывает два состояния в _obs_buffer .
np.max возвращает максимум по оси 0.
Но я не понимаю, зачем мы это делаем или что на самом деле.
class MaxAndSkipEnv(gym.Wrapper):
"""Return only every 4th frame"""
def __init__(self, env=None, skip=4):
super(MaxAndSkipEnv, self).__init__(env)
# Initialise a double ended queue that can store a maximum of two states
self._obs_buffer = deque(maxlen=2)
# _skip = 4
self._skip = skip
def _step(self, action):
total_reward = 0.0
done = None
for _ in range(self._skip):
# Take a step
obs, reward, done, info = self.env.step(action)
# Append the new state to the double ended queue buffer
self._obs_buffer.append(obs)
# Update the total reward by summing the (reward obtained from the step taken) + (the current
# total reward)
total_reward += reward
# If the game ends, break the for loop
if done:
break
max_frame = np.max(np.stack(self._obs_buffer), axis=0)
return max_frame, total_reward, done, info