Note
Go to the end to download the full example code
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

/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)