From 473345fdf671f93907b0ddcbb3346732bda830f8 Mon Sep 17 00:00:00 2001 From: Alexander Soare Date: Thu, 9 May 2024 15:16:47 +0100 Subject: [PATCH] Fix stats override in ACT config (#161) --- lerobot/configs/policy/act.yaml | 12 ++++---- lerobot/configs/policy/diffusion.yaml | 28 +++++++++--------- .../aloha_act/actions.safetensors | Bin 5104 -> 5104 bytes .../aloha_act/grad_stats.safetensors | Bin 31688 -> 31688 bytes .../aloha_act/output_dict.safetensors | Bin 196 -> 196 bytes .../aloha_act/param_stats.safetensors | Bin 33408 -> 33408 bytes 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lerobot/configs/policy/act.yaml b/lerobot/configs/policy/act.yaml index a49a97f8..15efcce8 100644 --- a/lerobot/configs/policy/act.yaml +++ b/lerobot/configs/policy/act.yaml @@ -3,6 +3,12 @@ seed: 1000 dataset_repo_id: lerobot/aloha_sim_insertion_human +override_dataset_stats: + observation.images.top: + # stats from imagenet, since we use a pretrained vision model + mean: [[[0.485]], [[0.456]], [[0.406]]] # (c,1,1) + std: [[[0.229]], [[0.224]], [[0.225]]] # (c,1,1) + training: offline_steps: 80000 online_steps: 0 @@ -18,12 +24,6 @@ training: grad_clip_norm: 10 online_steps_between_rollouts: 1 - override_dataset_stats: - observation.images.top: - # stats from imagenet, since we use a pretrained vision model - mean: [[[0.485]], [[0.456]], [[0.406]]] # (c,1,1) - std: [[[0.229]], [[0.224]], [[0.225]]] # (c,1,1) - delta_timestamps: action: "[i / ${fps} for i in range(${policy.chunk_size})]" diff --git a/lerobot/configs/policy/diffusion.yaml b/lerobot/configs/policy/diffusion.yaml index 9a4aeb2a..7278985e 100644 --- a/lerobot/configs/policy/diffusion.yaml +++ b/lerobot/configs/policy/diffusion.yaml @@ -7,6 +7,20 @@ seed: 100000 dataset_repo_id: lerobot/pusht +override_dataset_stats: + # TODO(rcadene, alexander-soare): should we remove image stats as well? do we use a pretrained vision model? + observation.image: + mean: [[[0.5]], [[0.5]], [[0.5]]] # (c,1,1) + std: [[[0.5]], [[0.5]], [[0.5]]] # (c,1,1) + # TODO(rcadene, alexander-soare): we override state and action stats to use the same as the pretrained model + # from the original codebase, but we should remove these and train our own pretrained model + observation.state: + min: [13.456424, 32.938293] + max: [496.14618, 510.9579] + action: + min: [12.0, 25.0] + max: [511.0, 511.0] + training: offline_steps: 200000 online_steps: 0 @@ -34,20 +48,6 @@ eval: n_episodes: 50 batch_size: 50 -override_dataset_stats: - # TODO(rcadene, alexander-soare): should we remove image stats as well? do we use a pretrained vision model? - observation.image: - mean: [[[0.5]], [[0.5]], [[0.5]]] # (c,1,1) - std: [[[0.5]], [[0.5]], [[0.5]]] # (c,1,1) - # TODO(rcadene, alexander-soare): we override state and action stats to use the same as the pretrained model - # from the original codebase, but we should remove these and train our own pretrained model - observation.state: - min: [13.456424, 32.938293] - max: [496.14618, 510.9579] - action: - min: [12.0, 25.0] - max: [511.0, 511.0] - policy: name: diffusion diff --git a/tests/data/save_policy_to_safetensors/aloha_act/actions.safetensors b/tests/data/save_policy_to_safetensors/aloha_act/actions.safetensors index 70c9b6d811a396f7e554b424beb0b0ced73048d0..7e7ad8e1df015d0ff52d689b317b8d77b3f380fa 100644 GIT binary patch literal 5104 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 literal 5104 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 diff --git a/tests/data/save_policy_to_safetensors/aloha_act/grad_stats.safetensors b/tests/data/save_policy_to_safetensors/aloha_act/grad_stats.safetensors index 2e8451891e477a10a94c36901734822c69470a04..5188d8f428cdddf509da7f91f29950d9c80ad309 100644 GIT binary patch delta 1242 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