Downloads · 30 days
8
6% of all-time downloads
BrutalCaesar/act_so101_cubcyl_poshold_chunk50_cvae_3cam
act_so101_cubcyl_poshold_chunk50_cvae_3cam is a robotics model from BrutalCaesar. Use it for the robotics task on the model card, and read the license before you ship it in a product. It is set up for lerobot. The card lists the license as apache-2.0.
Action Chunking Transformer with the standard CVAE objective (usevae=true, klweight=10.0), trained on all three camera feeds, with LeRobot 0.6.0. 51.57M parameters.
Downloads · 30 days
8
6% of all-time downloads
All-time downloads
132
Public
Parameters
51.6M
207 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors207 MB · 100%
From the Hugging Face model README
Action Chunking Transformer with the standard CVAE objective (use_vae=true, kl_weight=10.0),
trained on all three camera feeds, with LeRobot 0.6.0.
51.57M parameters.
Task: pick up one of three objects (red 25 mm cube, yellow cylinder, white 45 mm cube) and place it in whichever container is on the table.
Final eval_loss on the held-out 30 episodes: 0.2006 — the second-lowest of six variants, and within noise of all of them.
Paired baseline: act_so101_cubcyl_poshold_chunk50_bc_3cam,
identical except use_vae=false.
A β sweep at kl_weight = 10, 1 and 0.1 all finished with train loss 0.056-0.057 — identical to the
BC run's 0.059, which has no KL term at all. At β=0.1 a KL of 1 nat would add 0.1 to the loss and
nothing of the sort appears, putting the KL under roughly 0.02 nats regardless of β.
So collapse is not caused by the penalty. The likely reason is that observation.state already
discloses which grasp approach is underway for most frames: the demonstrations are multimodal at the
task level but close to deterministic per-observation, which is what the encoder conditions on.
Treat this as a near-deterministic chunk regressor. Do not expect behavioural diversity from the latent.
| Physical camera | Observation key |
|---|---|
| wrist (gripper module) | observation.images.wrist |
| front (desk-level Brio 101) | observation.images.front |
| top (overhead, boom arm) | observation.images.top |
This policy will not run without the overhead camera connected. Its two-camera sibling
(..._chunk50_cvae) takes wrist+front only.
Keys verified against pixels at episodes 8, 39 and 67 of the source dataset. Do not apply the
transposed mapping from the 8bin models.
[0,1,2,3,4, 20,21,22,23,24, 45,46,47,48,49, 65,66,67,68,69, 90,91,92,93,94, 110,111,112,113,114]
5 episodes from each of the 6 object x container blocks. By episode_index: red cube (25 mm) 0-39,
yellow cylinder 40-79, white cube (45 mm) 80-119; cardboard box in the first 20 of each block, white
3D-printed bin in the second 20. Only one container was on the table at a time, so the visible bin
is always the target.
| Shape | |
|---|---|
observation.images.wrist | (3, 480, 640) |
observation.images.front | (3, 480, 640) |
observation.images.top | (3, 480, 640) |
observation.state | (6,) |
| action | (50, 6) — 50-step chunk, 1.67 s at 30 fps, all executed |
903 encoder tokens (301 per camera at 640x480, plus latent and state), against 602 for the two-camera
variants. Normalization ships as LeRobot 0.6.0 processor files, not baked into the weights — load via
ACTPolicy.from_pretrained.
| Variant | cameras | latent | eval_loss @100k |
|---|---|---|---|
| cvae | 2 | CVAE β=10 | 0.2041 |
| bc | 2 | none | 0.1988 |
| cvae_kl1 | 2 | CVAE β=1 | 0.2014 |
| cvae_kl0p1 | 2 | CVAE β=0.1 | 0.2018 |
| cvae_3cam | 3 | CVAE β=10 | 0.2006 |
| bc_3cam | 3 | none | 0.2067 |
The full spread is 0.0079. A single run's eval_loss bounces by ~0.008 between consecutive
checkpoints. The between-model differences do not exceed the within-model noise.
And the metric is biased for this data: the demonstrations contain roughly three distinct grasp approaches per object, so held-out L1 rewards a policy that averages them over one that commits to a single valid approach. A worse number here may be a better policy on the robot.
Only scored rollouts can rank these.
| Dataset | phi_so101_cubes_cylinder_v1, 90 of 120 episodes, 49,969 frames |
| Steps / batch / seed | 100,000 / 8 / 1000 (16.0 epochs) |
| Optimizer | AdamW, lr 1e-5, backbone lr 1e-5, weight decay 1e-4 |
| Backbone | ResNet-18 per camera, ImageNet-pretrained, not frozen |
n_obs_steps | 1 — single frame, no history |
| Hardware | 1x H200, 2 h 00 m wall, 5.7 GB VRAM |
eval_loss is flat from step 60,000 to 100,000, so no overfitting penalty; this is the
100,000-step checkpoint.
n_obs_steps=1, so no velocity information.