Я реализую среду обучения с подкреплением, используя torchl, где агент использует политику на основе LSTM. Моя цель — обучить агента на последовательностях, выбранных из буфера воспроизведения. Хотя у меня все компоненты работают, я не уверен, как правильно проводить обучение буфера воспроизведения. Я пытался следовать руководству по pytorch, но это не совсем сработало.
Я использую собственную параллельную EnvBase и LSTMModule, завернутую в QValueActor. Я использую SliceSampler, чтобы гарантировать получение смежных последовательностей для LSTM.
Мой env возвращает на каждом этапе такой тензорный запрос:
Мой размер пакета равен 5 (т. е. у меня есть 5 параллельных окружений). Возможно, важно: все мои эпизоды имеют одинаковую фиксированную длину эпизода_длины , т.е. Done всегда для всех одно и то же.
У меня есть объект политики, который определяет мою действующую политику следующим образом (вызов этого объекта с помощью тензордиктов активирует политику актера).
RuntimeError: Expected the end-of-trajectory signal to be 1-dimensional. Got a tensor with shape[1]=2 instead
Для меня это не имеет особого смысла - глядя на тензорный запрос, выведенный в _step моей среды, готовый тензор имеет правильный размер пакета x 1 .
Любая помощь в том, как правильно выполнить это рекуррентное обучение, будет принята с благодарностью.>
Я реализую среду обучения с подкреплением, используя torchl, где агент использует политику на основе LSTM. Моя цель — обучить агента на последовательностях, выбранных из буфера воспроизведения. Хотя у меня все компоненты работают, я не уверен, как правильно проводить обучение буфера воспроизведения. Я пытался следовать руководству по pytorch, но это не совсем сработало. Я использую собственную параллельную EnvBase и LSTMModule, завернутую в QValueActor. Я использую SliceSampler, чтобы гарантировать получение смежных последовательностей для LSTM. Мой env возвращает на каждом этапе такой тензорный запрос: [code]TensorDict( fields={ done: Tensor(shape=torch.Size([5, 1]), device=cpu, dtype=torch.bool, is_shared=False), is_init: Tensor(shape=torch.Size([5, 1]), device=cpu, dtype=torch.bool, is_shared=False), observation: Tensor(shape=torch.Size([5, 2, 3]), device=cpu, dtype=torch.int8, is_shared=False), outcome_observation: Tensor(shape=torch.Size([5, 2, 3]), device=cpu, dtype=torch.int8, is_shared=False), reward: Tensor(shape=torch.Size([5, 1]), device=cpu, dtype=torch.float32, is_shared=False), state: Tensor(shape=torch.Size([5, 10, 3, 2, 3]), device=cpu, dtype=torch.int8, is_shared=False), valid_action_mask: Tensor(shape=torch.Size([5, 3]), device=cpu, dtype=torch.bool, is_shared=False)}, batch_size=torch.Size([5]), device=cpu, is_shared=False) [/code] Мой размер пакета равен 5 (т. е. у меня есть 5 параллельных окружений). Возможно, важно: все мои эпизоды имеют одинаковую фиксированную длину эпизода_длины , т.е. Done всегда для всех одно и то же. У меня есть объект политики, который определяет мою действующую политику следующим образом (вызов этого объекта с помощью тензордиктов активирует политику актера). [code] input_wrapper = InputWrapper(in_keys=["observation"], out_keys=["flattened_observation"])
batch = buffer.sample().to(self.device) ...training [/code] Очевидно, что эта настройка не на 100% правильна, потому что из примера шага я получаю:
[code]RuntimeError: Expected the end-of-trajectory signal to be 1-dimensional. Got a tensor with shape[1]=2 instead[/code] Для меня это не имеет особого смысла - глядя на тензорный запрос, выведенный в _step моей среды, готовый тензор имеет правильный размер пакета x 1 . Любая помощь в том, как правильно выполнить это рекуррентное обучение, будет принята с благодарностью.>