Image Restoration: ProxTorch Logo via TV and TV-L1 Regularization#

Using ProxTorch’s TV_2D and TVL1_2D operators, this example demonstrates image restoration of a noisy ProxTorch logo through TV and TV-L1 regularization.

Dependencies: - torch, torch.nn, torch.optim - numpy - matplotlib - pytorch_lightning - proxtorch

Original, Noisy, TV Restored, TV-L1 Restored
/home/docs/checkouts/readthedocs.org/user_builds/proxtorch/envs/latest/lib/python3.11/site-packages/pytorch_lightning/trainer/connectors/logger_connector/logger_connector.py:67: UserWarning: Starting from v1.9.0, `tensorboardX` has been removed as a dependency of the `pytorch_lightning` package, due to potential conflicts with other packages in the ML ecosystem. For this reason, `logger=True` will use `CSVLogger` as the default logger, unless the `tensorboard` or `tensorboardX` packages are found. Please `pip install lightning[extra]` or one of them to enable TensorBoard support by default
  warning_cache.warn(
/home/docs/checkouts/readthedocs.org/user_builds/proxtorch/envs/latest/lib/python3.11/site-packages/pytorch_lightning/loops/fit_loop.py:281: PossibleUserWarning: The number of training batches (1) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.
  rank_zero_warn(

Training: 0it [00:00, ?it/s]
Training:   0%|          | 0/1 [00:00<?, ?it/s]
Epoch 0:   0%|          | 0/1 [00:00<?, ?it/s]
Epoch 0: 100%|██████████| 1/1 [00:00<00:00,  2.87it/s]
Epoch 0: 100%|██████████| 1/1 [00:00<00:00,  2.87it/s, v_num=0]
Epoch 0: 100%|██████████| 1/1 [00:00<00:00,  2.86it/s, v_num=0]
Epoch 0:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 1:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 1: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=0]
Epoch 1: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=0]
Epoch 1: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=0]
Epoch 1:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 2:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 2: 100%|██████████| 1/1 [00:00<00:00,  2.96it/s, v_num=0]
Epoch 2: 100%|██████████| 1/1 [00:00<00:00,  2.96it/s, v_num=0]
Epoch 2: 100%|██████████| 1/1 [00:00<00:00,  2.95it/s, v_num=0]
Epoch 2:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 3:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 3: 100%|██████████| 1/1 [00:00<00:00,  2.91it/s, v_num=0]
Epoch 3: 100%|██████████| 1/1 [00:00<00:00,  2.90it/s, v_num=0]
Epoch 3: 100%|██████████| 1/1 [00:00<00:00,  2.90it/s, v_num=0]
Epoch 3:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 4:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 4: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=0]
Epoch 4: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=0]
Epoch 4: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=0]
Epoch 4:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 5:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 5: 100%|██████████| 1/1 [00:00<00:00,  2.98it/s, v_num=0]
Epoch 5: 100%|██████████| 1/1 [00:00<00:00,  2.98it/s, v_num=0]
Epoch 5: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=0]
Epoch 5:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 6:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 6: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=0]
Epoch 6: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=0]
Epoch 6: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=0]
Epoch 6:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 7:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 7: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=0]
Epoch 7: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=0]
Epoch 7: 100%|██████████| 1/1 [00:00<00:00,  3.02it/s, v_num=0]
Epoch 7:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 8:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 8: 100%|██████████| 1/1 [00:00<00:00,  2.95it/s, v_num=0]
Epoch 8: 100%|██████████| 1/1 [00:00<00:00,  2.95it/s, v_num=0]
Epoch 8: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=0]
Epoch 8:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 9:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 9: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=0]
Epoch 9: 100%|██████████| 1/1 [00:00<00:00,  2.96it/s, v_num=0]
Epoch 9: 100%|██████████| 1/1 [00:00<00:00,  2.96it/s, v_num=0]
Epoch 9:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 10:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 10: 100%|██████████| 1/1 [00:00<00:00,  3.12it/s, v_num=0]
Epoch 10: 100%|██████████| 1/1 [00:00<00:00,  3.12it/s, v_num=0]
Epoch 10: 100%|██████████| 1/1 [00:00<00:00,  3.12it/s, v_num=0]
Epoch 10:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 11:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 11: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=0]
Epoch 11: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=0]
Epoch 11: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=0]
Epoch 11:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 12:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 12: 100%|██████████| 1/1 [00:00<00:00,  3.12it/s, v_num=0]
Epoch 12: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=0]
Epoch 12: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=0]
Epoch 12:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 13:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 13: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=0]
Epoch 13: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=0]
Epoch 13: 100%|██████████| 1/1 [00:00<00:00,  3.07it/s, v_num=0]
Epoch 13:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 14:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 14: 100%|██████████| 1/1 [00:00<00:00,  3.09it/s, v_num=0]
Epoch 14: 100%|██████████| 1/1 [00:00<00:00,  3.09it/s, v_num=0]
Epoch 14: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=0]
Epoch 14:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 15:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 15: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=0]
Epoch 15: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=0]
Epoch 15: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=0]
Epoch 15:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 16:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 16: 100%|██████████| 1/1 [00:00<00:00,  3.18it/s, v_num=0]
Epoch 16: 100%|██████████| 1/1 [00:00<00:00,  3.18it/s, v_num=0]
Epoch 16: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 16:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 17:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 17: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=0]
Epoch 17: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=0]
Epoch 17: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=0]
Epoch 17:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 18:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 18: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=0]
Epoch 18: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=0]
Epoch 18: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=0]
Epoch 18:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 19:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 19: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=0]
Epoch 19: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=0]
Epoch 19: 100%|██████████| 1/1 [00:00<00:00,  3.07it/s, v_num=0]
Epoch 19:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 20:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 20: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=0]
Epoch 20: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=0]
Epoch 20: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=0]
Epoch 20:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 21:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 21: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=0]
Epoch 21: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=0]
Epoch 21: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=0]
Epoch 21:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 22:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 22: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=0]
Epoch 22: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=0]
Epoch 22: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=0]
Epoch 22:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 23:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 23: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 23: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=0]
Epoch 23: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=0]
Epoch 23:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 24:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 24: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=0]
Epoch 24: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=0]
Epoch 24: 100%|██████████| 1/1 [00:00<00:00,  3.15it/s, v_num=0]
Epoch 24:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 25:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 25: 100%|██████████| 1/1 [00:00<00:00,  3.20it/s, v_num=0]
Epoch 25: 100%|██████████| 1/1 [00:00<00:00,  3.19it/s, v_num=0]
Epoch 25: 100%|██████████| 1/1 [00:00<00:00,  3.19it/s, v_num=0]
Epoch 25:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 26:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 26: 100%|██████████| 1/1 [00:00<00:00,  3.26it/s, v_num=0]
Epoch 26: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=0]
Epoch 26: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=0]
Epoch 26:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 27:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 27: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 27: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 27: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 27:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 28:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 28: 100%|██████████| 1/1 [00:00<00:00,  3.20it/s, v_num=0]
Epoch 28: 100%|██████████| 1/1 [00:00<00:00,  3.20it/s, v_num=0]
Epoch 28: 100%|██████████| 1/1 [00:00<00:00,  3.20it/s, v_num=0]
Epoch 28:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 29:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 29: 100%|██████████| 1/1 [00:00<00:00,  3.27it/s, v_num=0]
Epoch 29: 100%|██████████| 1/1 [00:00<00:00,  3.26it/s, v_num=0]
Epoch 29: 100%|██████████| 1/1 [00:00<00:00,  3.26it/s, v_num=0]
Epoch 29:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 30:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 30: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 30: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 30: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 30:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 31:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 31: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=0]
Epoch 31: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=0]
Epoch 31: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=0]
Epoch 31:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 32:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 32: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 32: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 32: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 32:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 33:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 33: 100%|██████████| 1/1 [00:00<00:00,  3.19it/s, v_num=0]
Epoch 33: 100%|██████████| 1/1 [00:00<00:00,  3.19it/s, v_num=0]
Epoch 33: 100%|██████████| 1/1 [00:00<00:00,  3.19it/s, v_num=0]
Epoch 33:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 34:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 34: 100%|██████████| 1/1 [00:00<00:00,  3.21it/s, v_num=0]
Epoch 34: 100%|██████████| 1/1 [00:00<00:00,  3.20it/s, v_num=0]
Epoch 34: 100%|██████████| 1/1 [00:00<00:00,  3.20it/s, v_num=0]
Epoch 34:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 35:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 35: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=0]
Epoch 35: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=0]
Epoch 35: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=0]
Epoch 35:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 36:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 36: 100%|██████████| 1/1 [00:00<00:00,  3.31it/s, v_num=0]
Epoch 36: 100%|██████████| 1/1 [00:00<00:00,  3.31it/s, v_num=0]
Epoch 36: 100%|██████████| 1/1 [00:00<00:00,  3.30it/s, v_num=0]
Epoch 36:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 37:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 37: 100%|██████████| 1/1 [00:00<00:00,  3.19it/s, v_num=0]
Epoch 37: 100%|██████████| 1/1 [00:00<00:00,  3.19it/s, v_num=0]
Epoch 37: 100%|██████████| 1/1 [00:00<00:00,  3.19it/s, v_num=0]
Epoch 37:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 38:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 38: 100%|██████████| 1/1 [00:00<00:00,  3.29it/s, v_num=0]
Epoch 38: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 38: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 38:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 39:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 39: 100%|██████████| 1/1 [00:00<00:00,  3.22it/s, v_num=0]
Epoch 39: 100%|██████████| 1/1 [00:00<00:00,  3.21it/s, v_num=0]
Epoch 39: 100%|██████████| 1/1 [00:00<00:00,  3.21it/s, v_num=0]
Epoch 39:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 40:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 40: 100%|██████████| 1/1 [00:00<00:00,  3.29it/s, v_num=0]
Epoch 40: 100%|██████████| 1/1 [00:00<00:00,  3.29it/s, v_num=0]
Epoch 40: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 40:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 41:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 41: 100%|██████████| 1/1 [00:00<00:00,  3.27it/s, v_num=0]
Epoch 41: 100%|██████████| 1/1 [00:00<00:00,  3.27it/s, v_num=0]
Epoch 41: 100%|██████████| 1/1 [00:00<00:00,  3.26it/s, v_num=0]
Epoch 41:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 42:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 42: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 42: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 42: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 42:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 43:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 43: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 43: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 43: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=0]
Epoch 43:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 44:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 44: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=0]
Epoch 44: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=0]
Epoch 44: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=0]
Epoch 44:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 45:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 45: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=0]
Epoch 45: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=0]
Epoch 45: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=0]
Epoch 45:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 46:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 46: 100%|██████████| 1/1 [00:00<00:00,  3.18it/s, v_num=0]
Epoch 46: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 46: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=0]
Epoch 46:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 47:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 47: 100%|██████████| 1/1 [00:00<00:00,  3.27it/s, v_num=0]
Epoch 47: 100%|██████████| 1/1 [00:00<00:00,  3.26it/s, v_num=0]
Epoch 47: 100%|██████████| 1/1 [00:00<00:00,  3.26it/s, v_num=0]
Epoch 47:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 48:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 48: 100%|██████████| 1/1 [00:00<00:00,  3.33it/s, v_num=0]
Epoch 48: 100%|██████████| 1/1 [00:00<00:00,  3.33it/s, v_num=0]
Epoch 48: 100%|██████████| 1/1 [00:00<00:00,  3.33it/s, v_num=0]
Epoch 48:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 49:   0%|          | 0/1 [00:00<?, ?it/s, v_num=0]
Epoch 49: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=0]
Epoch 49: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=0]
Epoch 49: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=0]
Epoch 49: 100%|██████████| 1/1 [00:00<00:00,  3.18it/s, v_num=0]

Training: 0it [00:00, ?it/s]
Training:   0%|          | 0/1 [00:00<?, ?it/s]
Epoch 0:   0%|          | 0/1 [00:00<?, ?it/s]
Epoch 0: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s]
Epoch 0: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 0: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 0:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 1:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 1: 100%|██████████| 1/1 [00:00<00:00,  2.92it/s, v_num=1]
Epoch 1: 100%|██████████| 1/1 [00:00<00:00,  2.92it/s, v_num=1]
Epoch 1: 100%|██████████| 1/1 [00:00<00:00,  2.92it/s, v_num=1]
Epoch 1:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 2:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 2: 100%|██████████| 1/1 [00:00<00:00,  2.92it/s, v_num=1]
Epoch 2: 100%|██████████| 1/1 [00:00<00:00,  2.92it/s, v_num=1]
Epoch 2: 100%|██████████| 1/1 [00:00<00:00,  2.92it/s, v_num=1]
Epoch 2:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 3:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 3: 100%|██████████| 1/1 [00:00<00:00,  2.89it/s, v_num=1]
Epoch 3: 100%|██████████| 1/1 [00:00<00:00,  2.89it/s, v_num=1]
Epoch 3: 100%|██████████| 1/1 [00:00<00:00,  2.88it/s, v_num=1]
Epoch 3:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 4:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 4: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 4: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 4: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 4:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 5:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 5: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 5: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 5: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 5:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 6:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 6: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 6: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 6: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 6:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 7:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 7: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=1]
Epoch 7: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=1]
Epoch 7: 100%|██████████| 1/1 [00:00<00:00,  2.97it/s, v_num=1]
Epoch 7:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 8:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 8: 100%|██████████| 1/1 [00:00<00:00,  2.91it/s, v_num=1]
Epoch 8: 100%|██████████| 1/1 [00:00<00:00,  2.91it/s, v_num=1]
Epoch 8: 100%|██████████| 1/1 [00:00<00:00,  2.91it/s, v_num=1]
Epoch 8:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 9:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 9: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=1]
Epoch 9: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=1]
Epoch 9: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=1]
Epoch 9:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 10:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 10: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 10: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 10: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 10:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 11:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 11: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 11: 100%|██████████| 1/1 [00:00<00:00,  2.92it/s, v_num=1]
Epoch 11: 100%|██████████| 1/1 [00:00<00:00,  2.92it/s, v_num=1]
Epoch 11:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 12:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 12: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=1]
Epoch 12: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=1]
Epoch 12: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 12:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 13:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 13: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=1]
Epoch 13: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=1]
Epoch 13: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=1]
Epoch 13:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 14:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 14: 100%|██████████| 1/1 [00:00<00:00,  3.01it/s, v_num=1]
Epoch 14: 100%|██████████| 1/1 [00:00<00:00,  3.00it/s, v_num=1]
Epoch 14: 100%|██████████| 1/1 [00:00<00:00,  3.00it/s, v_num=1]
Epoch 14:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 15:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 15: 100%|██████████| 1/1 [00:00<00:00,  3.06it/s, v_num=1]
Epoch 15: 100%|██████████| 1/1 [00:00<00:00,  3.06it/s, v_num=1]
Epoch 15: 100%|██████████| 1/1 [00:00<00:00,  3.05it/s, v_num=1]
Epoch 15:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 16:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 16: 100%|██████████| 1/1 [00:00<00:00,  3.02it/s, v_num=1]
Epoch 16: 100%|██████████| 1/1 [00:00<00:00,  3.02it/s, v_num=1]
Epoch 16: 100%|██████████| 1/1 [00:00<00:00,  3.01it/s, v_num=1]
Epoch 16:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 17:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 17: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=1]
Epoch 17: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=1]
Epoch 17: 100%|██████████| 1/1 [00:00<00:00,  2.93it/s, v_num=1]
Epoch 17:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 18:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 18: 100%|██████████| 1/1 [00:00<00:00,  3.06it/s, v_num=1]
Epoch 18: 100%|██████████| 1/1 [00:00<00:00,  3.06it/s, v_num=1]
Epoch 18: 100%|██████████| 1/1 [00:00<00:00,  3.05it/s, v_num=1]
Epoch 18:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 19:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 19: 100%|██████████| 1/1 [00:00<00:00,  2.95it/s, v_num=1]
Epoch 19: 100%|██████████| 1/1 [00:00<00:00,  2.95it/s, v_num=1]
Epoch 19: 100%|██████████| 1/1 [00:00<00:00,  2.94it/s, v_num=1]
Epoch 19:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 20:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 20: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 20: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 20: 100%|██████████| 1/1 [00:00<00:00,  3.09it/s, v_num=1]
Epoch 20:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 21:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 21: 100%|██████████| 1/1 [00:00<00:00,  2.99it/s, v_num=1]
Epoch 21: 100%|██████████| 1/1 [00:00<00:00,  2.99it/s, v_num=1]
Epoch 21: 100%|██████████| 1/1 [00:00<00:00,  2.99it/s, v_num=1]
Epoch 21:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 22:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 22: 100%|██████████| 1/1 [00:00<00:00,  3.23it/s, v_num=1]
Epoch 22: 100%|██████████| 1/1 [00:00<00:00,  3.22it/s, v_num=1]
Epoch 22: 100%|██████████| 1/1 [00:00<00:00,  3.22it/s, v_num=1]
Epoch 22:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 23:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 23: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 23: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 23: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 23:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 24:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 24: 100%|██████████| 1/1 [00:00<00:00,  3.18it/s, v_num=1]
Epoch 24: 100%|██████████| 1/1 [00:00<00:00,  3.18it/s, v_num=1]
Epoch 24: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=1]
Epoch 24:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 25:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 25: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 25: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 25: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 25:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 26:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 26: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=1]
Epoch 26: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=1]
Epoch 26: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=1]
Epoch 26:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 27:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 27: 100%|██████████| 1/1 [00:00<00:00,  3.01it/s, v_num=1]
Epoch 27: 100%|██████████| 1/1 [00:00<00:00,  3.01it/s, v_num=1]
Epoch 27: 100%|██████████| 1/1 [00:00<00:00,  3.00it/s, v_num=1]
Epoch 27:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 28:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 28: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=1]
Epoch 28: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=1]
Epoch 28: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=1]
Epoch 28:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 29:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 29: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 29: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 29: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 29:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 30:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 30: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 30: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 30: 100%|██████████| 1/1 [00:00<00:00,  3.15it/s, v_num=1]
Epoch 30:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 31:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 31: 100%|██████████| 1/1 [00:00<00:00,  3.09it/s, v_num=1]
Epoch 31: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=1]
Epoch 31: 100%|██████████| 1/1 [00:00<00:00,  3.08it/s, v_num=1]
Epoch 31:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 32:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 32: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=1]
Epoch 32: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=1]
Epoch 32: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=1]
Epoch 32:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 33:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 33: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 33: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 33: 100%|██████████| 1/1 [00:00<00:00,  3.15it/s, v_num=1]
Epoch 33:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 34:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 34: 100%|██████████| 1/1 [00:00<00:00,  3.15it/s, v_num=1]
Epoch 34: 100%|██████████| 1/1 [00:00<00:00,  3.15it/s, v_num=1]
Epoch 34: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=1]
Epoch 34:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 35:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 35: 100%|██████████| 1/1 [00:00<00:00,  3.12it/s, v_num=1]
Epoch 35: 100%|██████████| 1/1 [00:00<00:00,  3.12it/s, v_num=1]
Epoch 35: 100%|██████████| 1/1 [00:00<00:00,  3.12it/s, v_num=1]
Epoch 35:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 36:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 36: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=1]
Epoch 36: 100%|██████████| 1/1 [00:00<00:00,  3.04it/s, v_num=1]
Epoch 36: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=1]
Epoch 36:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 37:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 37: 100%|██████████| 1/1 [00:00<00:00,  2.90it/s, v_num=1]
Epoch 37: 100%|██████████| 1/1 [00:00<00:00,  2.90it/s, v_num=1]
Epoch 37: 100%|██████████| 1/1 [00:00<00:00,  2.89it/s, v_num=1]
Epoch 37:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 38:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 38: 100%|██████████| 1/1 [00:00<00:00,  3.18it/s, v_num=1]
Epoch 38: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=1]
Epoch 38: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=1]
Epoch 38:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 39:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 39: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=1]
Epoch 39: 100%|██████████| 1/1 [00:00<00:00,  3.17it/s, v_num=1]
Epoch 39: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 39:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 40:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 40: 100%|██████████| 1/1 [00:00<00:00,  3.06it/s, v_num=1]
Epoch 40: 100%|██████████| 1/1 [00:00<00:00,  3.06it/s, v_num=1]
Epoch 40: 100%|██████████| 1/1 [00:00<00:00,  3.06it/s, v_num=1]
Epoch 40:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 41:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 41: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 41: 100%|██████████| 1/1 [00:00<00:00,  3.10it/s, v_num=1]
Epoch 41: 100%|██████████| 1/1 [00:00<00:00,  3.09it/s, v_num=1]
Epoch 41:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 42:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 42: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=1]
Epoch 42: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=1]
Epoch 42: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=1]
Epoch 42:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 43:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 43: 100%|██████████| 1/1 [00:00<00:00,  3.16it/s, v_num=1]
Epoch 43: 100%|██████████| 1/1 [00:00<00:00,  3.15it/s, v_num=1]
Epoch 43: 100%|██████████| 1/1 [00:00<00:00,  3.15it/s, v_num=1]
Epoch 43:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 44:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 44: 100%|██████████| 1/1 [00:00<00:00,  3.15it/s, v_num=1]
Epoch 44: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=1]
Epoch 44: 100%|██████████| 1/1 [00:00<00:00,  3.14it/s, v_num=1]
Epoch 44:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 45:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 45: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=1]
Epoch 45: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=1]
Epoch 45: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=1]
Epoch 45:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 46:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 46: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=1]
Epoch 46: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=1]
Epoch 46: 100%|██████████| 1/1 [00:00<00:00,  3.11it/s, v_num=1]
Epoch 46:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 47:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 47: 100%|██████████| 1/1 [00:00<00:00,  3.25it/s, v_num=1]
Epoch 47: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=1]
Epoch 47: 100%|██████████| 1/1 [00:00<00:00,  3.24it/s, v_num=1]
Epoch 47:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 48:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 48: 100%|██████████| 1/1 [00:00<00:00,  3.28it/s, v_num=1]
Epoch 48: 100%|██████████| 1/1 [00:00<00:00,  3.27it/s, v_num=1]
Epoch 48: 100%|██████████| 1/1 [00:00<00:00,  3.27it/s, v_num=1]
Epoch 48:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 49:   0%|          | 0/1 [00:00<?, ?it/s, v_num=1]
Epoch 49: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=1]
Epoch 49: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=1]
Epoch 49: 100%|██████████| 1/1 [00:00<00:00,  3.03it/s, v_num=1]
Epoch 49: 100%|██████████| 1/1 [00:00<00:00,  3.01it/s, v_num=1]
TV loss: 0.011123144324086474
TV-L1 loss: 0.011258230608062036

import matplotlib.pyplot as plt
import numpy as np
import pytorch_lightning as pl
import torch
import torch.optim as optim
from pytorch_lightning import seed_everything
from torch.utils.data import DataLoader, TensorDataset

from proxtorch.operators import TVL1_2D

# Set seed
seed_everything(42)

# Load ProxTorch Logo as jpg then convert to grayscale numpy array
proxtorch_logo = plt.imread("../proxtorch-logo.jpg")
# Downsample to 64x64
proxtorch_logo = proxtorch_logo[::4, ::4]
proxtorch_logo = 1 - np.mean(proxtorch_logo, axis=2)
# Normalize to [0, 1]
proxtorch_logo = (proxtorch_logo - np.min(proxtorch_logo)) / (
    np.max(proxtorch_logo) - np.min(proxtorch_logo)
)


class TVL1Restoration(pl.LightningModule):
    def __init__(self, alpha, l1_ratio):
        super().__init__()
        self.restored = torch.nn.Parameter(torch.zeros(proxtorch_logo.shape))
        self.tvl1_prox = TVL1_2D(alpha=alpha, l1_ratio=l1_ratio)
        self.automatic_optimization = False

    def forward(self, x):
        return self.restored

    def training_step(self, batch, _):
        opt = self.optimizers()
        opt.zero_grad()
        noisy, original = batch
        y_hat = self.restored
        loss = torch.sum((y_hat - noisy) ** 2)
        tv_loss = self.tvl1_prox(self.restored)
        self.manual_backward(loss)
        opt.step()
        with torch.no_grad():
            optimizer = self.trainer.optimizers[0]
            self.restored.data = self.tvl1_prox.prox(
                self.restored.data, optimizer.param_groups[0]["lr"]
            )

    def configure_optimizers(self):
        return optim.SGD(self.parameters(), lr=0.01)


# Data Preparation
noisy_logo = proxtorch_logo + np.random.normal(
    loc=0, scale=0.1, size=proxtorch_logo.shape
)
dataset = TensorDataset(
    torch.tensor(noisy_logo).unsqueeze(0), torch.tensor(proxtorch_logo).unsqueeze(0)
)
loader = DataLoader(dataset, batch_size=1)

# Model Initialization
tv_l1_model = TVL1Restoration(alpha=0.2, l1_ratio=0.05)
tv_model = TVL1Restoration(alpha=0.2, l1_ratio=0.0)

# Training
trainer = pl.Trainer(max_epochs=50)
trainer.fit(tv_model, loader)
trainer = pl.Trainer(max_epochs=50)
trainer.fit(tv_l1_model, loader)


# Evaluation
def evaluate(model, label):
    model.eval()
    loss = torch.mean((model.restored - torch.tensor(proxtorch_logo).unsqueeze(0)) ** 2)
    print(f"{label} loss: {loss.item()}")


evaluate(tv_model, "TV")
evaluate(tv_l1_model, "TV-L1")

# Determine the global min and max across all images to set a consistent colorscale
global_min = 0
global_max = 1

# Visualization
fig, ax = plt.subplots(1, 4, figsize=(20, 5))

# Original Image
ax[0].imshow(proxtorch_logo, cmap="gray", vmin=global_min, vmax=global_max)
ax[0].set_title("Original")

# Noisy Image
ax[1].imshow(noisy_logo, cmap="gray", vmin=global_min, vmax=global_max)
ax[1].set_title("Noisy")

# TV Restored Image
tv_restored_image = tv_model.restored.detach().numpy()
ax[2].imshow(tv_restored_image, cmap="gray", vmin=global_min, vmax=global_max)
ax[2].set_title("TV Restored")

# TV-L1 Restored Image
tv_l1_restored_image = tv_l1_model.restored.detach().numpy()
ax[3].imshow(tv_l1_restored_image, cmap="gray", vmin=global_min, vmax=global_max)
ax[3].set_title("TV-L1 Restored")

plt.tight_layout()
plt.show()

Total running time of the script: (0 minutes 33.501 seconds)

Gallery generated by Sphinx-Gallery