def train_encoder(
train_input,
test_input,
- depth=3,
+ depth=2,
dim_hidden=48,
nb_bits_per_token=8,
lr_start=1e-3,
lr_end=1e-4,
nb_epochs=10,
batch_size=25,
+ logger=None,
device=torch.device("cpu"),
):
+ if logger is None:
+ logger = lambda s: print(s)
+
mu, std = train_input.float().mean(), train_input.float().std()
def encoder_core(depth, dim):
nb_parameters = sum(p.numel() for p in model.parameters())
- print(f"nb_parameters {nb_parameters}")
+ logger(f"nb_parameters {nb_parameters}")
model.to(device)
train_loss = acc_train_loss / train_input.size(0)
test_loss = acc_test_loss / test_input.size(0)
- print(f"train_ae {k} lr {lr} train_loss {train_loss} test_loss {test_loss}")
+ logger(f"train_ae {k} lr {lr} train_loss {train_loss} test_loss {test_loss}")
sys.stdout.flush()
return encoder, quantizer, decoder
def generate_episodes(nb, steps):
- all_frames = []
+ all_frames, all_actions = [], []
for n in tqdm.tqdm(range(nb), dynamic_ncols=True, desc="world-data"):
frames, actions = generate_episode(steps)
all_frames += frames
- return torch.cat(all_frames, 0).contiguous()
+ all_actions += [actions[None, :]]
+ return torch.cat(all_frames, 0).contiguous(), torch.cat(all_actions, 0)
+
+
+def create_data_and_processors(
+ nb_train_samples,
+ nb_test_samples,
+ mode,
+ nb_steps,
+ nb_epochs=10,
+ device=torch.device("cpu"),
+ logger=None,
+):
+ assert mode in ["first_last"]
+ if mode == "first_last":
+ steps = [True] + [False] * (nb_steps + 1) + [True]
-def create_data_and_processors(nb_train_samples, nb_test_samples, nb_epochs=10):
- steps = [True] + [False] * 30 + [True]
- train_input = generate_episodes(nb_train_samples, steps)
- test_input = generate_episodes(nb_test_samples, steps)
+ train_input, train_actions = generate_episodes(nb_train_samples, steps)
+ train_input, train_actions = train_input.to(device), train_actions.to(device)
+ test_input, test_actions = generate_episodes(nb_test_samples, steps)
+ test_input, test_actions = test_input.to(device), test_actions.to(device)
encoder, quantizer, decoder = train_encoder(
- train_input, test_input, nb_epochs=nb_epochs
+ train_input, test_input, nb_epochs=nb_epochs, logger=logger, device=device
)
encoder.train(False)
quantizer.train(False)
return torch.cat(frames, dim=0)
- return train_input, test_input, frame2seq, seq2frame
+ return train_input, train_actions, test_input, test_actions, frame2seq, seq2frame
######################################################################
if __name__ == "__main__":
- train_input, test_input, frame2seq, seq2frame = create_data_and_processors(
+ (
+ train_input,
+ train_actions,
+ test_input,
+ test_actions,
+ frame2seq,
+ seq2frame,
+ ) = create_data_and_processors(
# 10000, 1000,
- 100, 100, nb_epochs=2,
+ 100,
+ 100,
+ nb_epochs=2,
+ mode="first_last",
+ nb_steps=20,
)
input = test_input[:64]