Я использую собственную параллельную EnvBase и LSTMModule, завернутую в QValueActor. Я использую SliceSampler, чтобы гарантировать получение смежных последовательностей для LSTM.
Мой env возвращает на каждом этапе такой тензорный запрос:
Код: Выделить всё
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)
У меня есть объект политики, который определяет мою действующую политику следующим образом (вызов этого объекта с помощью тензордиктов активирует политику актера).
Код: Выделить всё
input_wrapper = InputWrapper(in_keys=["observation"], out_keys=["flattened_observation"])
self.lstm = LSTMModule(
input_size=self.k * 2,
hidden_size=self.hidden_size,
num_layers=self.layers_n,
device=self.device,
in_key="flattened_observation",
out_key="embed",
)
mlp = MLP(
in_features=self.hidden_size,
out_features=self.k,
num_cells=[64],
device=self.device,
)
mlp[-1].bias.data.fill_(0.0)
mlp_module = TensorDictModule(mlp, in_keys=["embed"], out_keys=["action_value"])
net = TensorDictSequential(
input_wrapper,
self.lstm,
mlp_module,
).to(self.device)
self.actor = QValueActor(
module=net,
spec=self.action_spec,
action_mask_key="valid_action_mask",
)
Код: Выделить всё
policy = LSTMPolicy(
num_envs=num_envs,
layers_n=layers_n,
hidden_size=hidden_size,
exploration=True,
device=self.device,
)
env = SingleHighcardEnv.setup_single_env(
num_envs, self.device, seed
)
env.append_transform(policy.lstm.make_tensordict_primer())
env.reset()
buffer = TensorDictReplayBuffer(
storage=LazyMemmapStorage(replay_buffer_capacity),
sampler=SliceSampler(
slice_len=episode_length,
end_key=("next", "done"),
strict_length=False,
),
batch_size=minibatch_size,
)
collector = SyncDataCollector(
env,
policy=policy,
frames_per_batch=num_envs * episode_length,
total_frames=epochs * num_envs * episode_length,
device=self.device,
trust_policy=True,
replay_buffer=buffer,
)
for i, _ in enumerate(collector):
if len(buffer) >= minibatch_size:
batch = buffer.sample().to(self.device)
...training
Код: Выделить всё
RuntimeError: Expected the end-of-trajectory signal to be 1-dimensional. Got a tensor with shape[1]=2 insteadЛюбая помощь в том, как правильно выполнить это рекуррентное обучение, будет принята с благодарностью.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... in-torchrl