Note
Click here to download the full example code
Deep CCA for more than 2 viewsΒΆ
This example demonstrates how to easily train Deep CCA models and variants
import numpy as np
import pytorch_lightning as pl
from torch.utils.data import Subset
from cca_zoo.data import Split_MNIST_Dataset
from cca_zoo.deepmodels import (
DCCA,
CCALightning,
get_dataloaders,
architectures,
objectives,
DTCCA,
)
n_train = 500
n_val = 100
train_dataset = Split_MNIST_Dataset(mnist_type="MNIST", train=True)
val_dataset = Subset(train_dataset, np.arange(n_train, n_train + n_val))
train_dataset = Subset(train_dataset, np.arange(n_train))
train_loader, val_loader = get_dataloaders(train_dataset, val_dataset)
# The number of latent dimensions across models
latent_dims = 2
# number of epochs for deep models
epochs = 10
encoder_1 = architectures.Encoder(latent_dims=latent_dims, feature_size=392)
encoder_2 = architectures.Encoder(latent_dims=latent_dims, feature_size=392)
Deep MCCA
dcca = DCCA(
latent_dims=latent_dims, encoders=[encoder_1, encoder_2], objective=objectives.MCCA
)
dcca = CCALightning(dcca)
trainer = pl.Trainer(max_epochs=epochs, enable_checkpointing=False)
trainer.fit(dcca, train_loader, val_loader)
Out:
Validation sanity check: 0it [00:00, ?it/s]
Validation sanity check: 0%| | 0/1 [00:00<?, ?it/s]
/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/pytorch_lightning/trainer/data_loading.py:408: UserWarning: The number of training samples (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.
f"The number of training samples ({self.num_training_batches}) is smaller than the logging interval"
Training: 0it [00:00, ?it/s]
Training: 0%| | 0/2 [00:00<?, ?it/s]
Epoch 0: 0%| | 0/2 [00:00<?, ?it/s]
Epoch 0: 50%|##### | 1/2 [00:00<00:00, 44.41it/s, loss=-0.418, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 0: 100%|##########| 2/2 [00:00<00:00, 55.86it/s, loss=-0.418, v_num=1]
Epoch 0: 0%| | 0/2 [00:00<?, ?it/s, loss=-0.418, v_num=1]
Epoch 1: 0%| | 0/2 [00:00<?, ?it/s, loss=-0.418, v_num=1]
Epoch 1: 50%|##### | 1/2 [00:00<00:00, 43.58it/s, loss=-0.772, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 1: 100%|##########| 2/2 [00:00<00:00, 54.79it/s, loss=-0.772, v_num=1]
Epoch 1: 0%| | 0/2 [00:00<?, ?it/s, loss=-0.772, v_num=1]
Epoch 2: 0%| | 0/2 [00:00<?, ?it/s, loss=-0.772, v_num=1]
Epoch 2: 50%|##### | 1/2 [00:00<00:00, 44.23it/s, loss=-1, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 2: 100%|##########| 2/2 [00:00<00:00, 55.70it/s, loss=-1, v_num=1]
Epoch 2: 0%| | 0/2 [00:00<?, ?it/s, loss=-1, v_num=1]
Epoch 3: 0%| | 0/2 [00:00<?, ?it/s, loss=-1, v_num=1]
Epoch 3: 50%|##### | 1/2 [00:00<00:00, 45.51it/s, loss=-1.16, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 3: 100%|##########| 2/2 [00:00<00:00, 56.93it/s, loss=-1.16, v_num=1]
Epoch 3: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.16, v_num=1]
Epoch 4: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.16, v_num=1]
Epoch 4: 50%|##### | 1/2 [00:00<00:00, 44.67it/s, loss=-1.27, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 4: 100%|##########| 2/2 [00:00<00:00, 56.14it/s, loss=-1.27, v_num=1]
Epoch 4: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.27, v_num=1]
Epoch 5: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.27, v_num=1]
Epoch 5: 50%|##### | 1/2 [00:00<00:00, 45.18it/s, loss=-1.35, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 5: 100%|##########| 2/2 [00:00<00:00, 56.64it/s, loss=-1.35, v_num=1]
Epoch 5: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.35, v_num=1]
Epoch 6: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.35, v_num=1]
Epoch 6: 50%|##### | 1/2 [00:00<00:00, 45.07it/s, loss=-1.42, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 6: 100%|##########| 2/2 [00:00<00:00, 55.89it/s, loss=-1.42, v_num=1]
Epoch 6: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.42, v_num=1]
Epoch 7: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.42, v_num=1]
Epoch 7: 50%|##### | 1/2 [00:00<00:00, 44.58it/s, loss=-1.47, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 7: 100%|##########| 2/2 [00:00<00:00, 55.61it/s, loss=-1.47, v_num=1]
Epoch 7: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.47, v_num=1]
Epoch 8: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.47, v_num=1]
Epoch 8: 50%|##### | 1/2 [00:00<00:00, 45.53it/s, loss=-1.51, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 8: 100%|##########| 2/2 [00:00<00:00, 56.87it/s, loss=-1.51, v_num=1]
Epoch 8: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.51, v_num=1]
Epoch 9: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.51, v_num=1]
Epoch 9: 50%|##### | 1/2 [00:00<00:00, 44.05it/s, loss=-1.54, v_num=1]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 9: 100%|##########| 2/2 [00:00<00:00, 54.91it/s, loss=-1.54, v_num=1]
Epoch 9: 100%|##########| 2/2 [00:00<00:00, 35.68it/s, loss=-1.54, v_num=1]
Deep GCCA
dcca = DCCA(
latent_dims=latent_dims, encoders=[encoder_1, encoder_2], objective=objectives.GCCA
)
dcca = CCALightning(dcca)
trainer = pl.Trainer(max_epochs=epochs, enable_checkpointing=False)
trainer.fit(dcca, train_loader, val_loader)
Out:
Validation sanity check: 0it [00:00, ?it/s]
Validation sanity check: 0%| | 0/1 [00:00<?, ?it/s]
/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/pytorch_lightning/trainer/data_loading.py:408: UserWarning: The number of training samples (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.
f"The number of training samples ({self.num_training_batches}) is smaller than the logging interval"
Training: 0it [00:00, ?it/s]
Training: 0%| | 0/2 [00:00<?, ?it/s]
Epoch 0: 0%| | 0/2 [00:00<?, ?it/s]
Epoch 0: 50%|##### | 1/2 [00:00<00:00, 23.48it/s, loss=-1.88, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 0: 100%|##########| 2/2 [00:00<00:00, 35.45it/s, loss=-1.88, v_num=2]
Epoch 0: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.88, v_num=2]
Epoch 1: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.88, v_num=2]
Epoch 1: 50%|##### | 1/2 [00:00<00:00, 25.22it/s, loss=-1.86, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 1: 100%|##########| 2/2 [00:00<00:00, 36.83it/s, loss=-1.86, v_num=2]
Epoch 1: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.86, v_num=2]
Epoch 2: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.86, v_num=2]
Epoch 2: 50%|##### | 1/2 [00:00<00:00, 25.99it/s, loss=-1.88, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 2: 100%|##########| 2/2 [00:00<00:00, 38.07it/s, loss=-1.88, v_num=2]
Epoch 2: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.88, v_num=2]
Epoch 3: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.88, v_num=2]
Epoch 3: 50%|##### | 1/2 [00:00<00:00, 26.10it/s, loss=-1.89, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 3: 100%|##########| 2/2 [00:00<00:00, 37.99it/s, loss=-1.89, v_num=2]
Epoch 3: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.89, v_num=2]
Epoch 4: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.89, v_num=2]
Epoch 4: 50%|##### | 1/2 [00:00<00:00, 25.93it/s, loss=-1.9, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 4: 100%|##########| 2/2 [00:00<00:00, 37.93it/s, loss=-1.9, v_num=2]
Epoch 4: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.9, v_num=2]
Epoch 5: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.9, v_num=2]
Epoch 5: 50%|##### | 1/2 [00:00<00:00, 25.37it/s, loss=-1.9, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 5: 100%|##########| 2/2 [00:00<00:00, 37.42it/s, loss=-1.9, v_num=2]
Epoch 5: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.9, v_num=2]
Epoch 6: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.9, v_num=2]
Epoch 6: 50%|##### | 1/2 [00:00<00:00, 26.28it/s, loss=-1.91, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 6: 100%|##########| 2/2 [00:00<00:00, 38.49it/s, loss=-1.91, v_num=2]
Epoch 6: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.91, v_num=2]
Epoch 7: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.91, v_num=2]
Epoch 7: 50%|##### | 1/2 [00:00<00:00, 26.46it/s, loss=-1.92, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 7: 100%|##########| 2/2 [00:00<00:00, 38.35it/s, loss=-1.92, v_num=2]
Epoch 7: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.92, v_num=2]
Epoch 8: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.92, v_num=2]
Epoch 8: 50%|##### | 1/2 [00:00<00:00, 26.21it/s, loss=-1.92, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 8: 100%|##########| 2/2 [00:00<00:00, 38.26it/s, loss=-1.92, v_num=2]
Epoch 8: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.92, v_num=2]
Epoch 9: 0%| | 0/2 [00:00<?, ?it/s, loss=-1.92, v_num=2]
Epoch 9: 50%|##### | 1/2 [00:00<00:00, 25.29it/s, loss=-1.93, v_num=2]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 9: 100%|##########| 2/2 [00:00<00:00, 37.42it/s, loss=-1.93, v_num=2]
Epoch 9: 100%|##########| 2/2 [00:00<00:00, 27.11it/s, loss=-1.93, v_num=2]
Deep TCCA
dcca = DTCCA(latent_dims=latent_dims, encoders=[encoder_1, encoder_2])
dcca = CCALightning(dcca)
trainer = pl.Trainer(max_epochs=epochs, enable_checkpointing=False)
trainer.fit(dcca, train_loader, val_loader)
Out:
Validation sanity check: 0it [00:00, ?it/s]
Validation sanity check: 0%| | 0/1 [00:00<?, ?it/s]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/pytorch_lightning/trainer/data_loading.py:408: UserWarning: The number of training samples (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.
f"The number of training samples ({self.num_training_batches}) is smaller than the logging interval"
Training: 0it [00:00, ?it/s]
Training: 0%| | 0/2 [00:00<?, ?it/s]
Epoch 0: 0%| | 0/2 [00:00<?, ?it/s] /home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 0: 50%|##### | 1/2 [00:00<00:00, 21.49it/s, loss=8.82e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 0: 100%|##########| 2/2 [00:00<00:00, 24.95it/s, loss=8.82e-08, v_num=3]
Epoch 0: 0%| | 0/2 [00:00<?, ?it/s, loss=8.82e-08, v_num=3]
Epoch 1: 0%| | 0/2 [00:00<?, ?it/s, loss=8.82e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 1: 50%|##### | 1/2 [00:00<00:00, 21.81it/s, loss=8.06e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 1: 100%|##########| 2/2 [00:00<00:00, 24.98it/s, loss=8.06e-08, v_num=3]
Epoch 1: 0%| | 0/2 [00:00<?, ?it/s, loss=8.06e-08, v_num=3]
Epoch 2: 0%| | 0/2 [00:00<?, ?it/s, loss=8.06e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 2: 50%|##### | 1/2 [00:00<00:00, 19.16it/s, loss=7.6e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 2: 100%|##########| 2/2 [00:00<00:00, 23.38it/s, loss=7.6e-08, v_num=3]
Epoch 2: 0%| | 0/2 [00:00<?, ?it/s, loss=7.6e-08, v_num=3]
Epoch 3: 0%| | 0/2 [00:00<?, ?it/s, loss=7.6e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 3: 50%|##### | 1/2 [00:00<00:00, 21.95it/s, loss=6.75e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 3: 100%|##########| 2/2 [00:00<00:00, 25.65it/s, loss=6.75e-08, v_num=3]
Epoch 3: 0%| | 0/2 [00:00<?, ?it/s, loss=6.75e-08, v_num=3]
Epoch 4: 0%| | 0/2 [00:00<?, ?it/s, loss=6.75e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 4: 50%|##### | 1/2 [00:00<00:00, 20.22it/s, loss=6.73e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 4: 100%|##########| 2/2 [00:00<00:00, 24.67it/s, loss=6.73e-08, v_num=3]
Epoch 4: 0%| | 0/2 [00:00<?, ?it/s, loss=6.73e-08, v_num=3]
Epoch 5: 0%| | 0/2 [00:00<?, ?it/s, loss=6.73e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 5: 50%|##### | 1/2 [00:00<00:00, 21.99it/s, loss=7.1e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 5: 100%|##########| 2/2 [00:00<00:00, 25.41it/s, loss=7.1e-08, v_num=3]
Epoch 5: 0%| | 0/2 [00:00<?, ?it/s, loss=7.1e-08, v_num=3]
Epoch 6: 0%| | 0/2 [00:00<?, ?it/s, loss=7.1e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 6: 50%|##### | 1/2 [00:00<00:00, 21.84it/s, loss=6.51e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 6: 100%|##########| 2/2 [00:00<00:00, 25.55it/s, loss=6.51e-08, v_num=3]
Epoch 6: 0%| | 0/2 [00:00<?, ?it/s, loss=6.51e-08, v_num=3]
Epoch 7: 0%| | 0/2 [00:00<?, ?it/s, loss=6.51e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 7: 50%|##### | 1/2 [00:00<00:00, 21.21it/s, loss=6.82e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 7: 100%|##########| 2/2 [00:00<00:00, 25.53it/s, loss=6.82e-08, v_num=3]
Epoch 7: 0%| | 0/2 [00:00<?, ?it/s, loss=6.82e-08, v_num=3]
Epoch 8: 0%| | 0/2 [00:00<?, ?it/s, loss=6.82e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 8: 50%|##### | 1/2 [00:00<00:00, 20.11it/s, loss=6.06e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 8: 100%|##########| 2/2 [00:00<00:00, 24.63it/s, loss=6.06e-08, v_num=3]
Epoch 8: 0%| | 0/2 [00:00<?, ?it/s, loss=6.06e-08, v_num=3]
Epoch 9: 0%| | 0/2 [00:00<?, ?it/s, loss=6.06e-08, v_num=3]/home/docs/checkouts/readthedocs.org/user_builds/cca-zoo/envs/v1.10.1/lib/python3.7/site-packages/tensorly/backend/core.py:1106: UserWarning: In partial_svd: converting to NumPy. Check SVD_FUNS for available alternatives if you want to avoid this.
warnings.warn('In partial_svd: converting to NumPy.'
Epoch 9: 50%|##### | 1/2 [00:00<00:00, 21.71it/s, loss=6.82e-08, v_num=3]
Validating: 0it [00:00, ?it/s]
Validating: 0%| | 0/1 [00:00<?, ?it/s]
Epoch 9: 100%|##########| 2/2 [00:00<00:00, 25.46it/s, loss=6.82e-08, v_num=3]
Epoch 9: 100%|##########| 2/2 [00:00<00:00, 16.93it/s, loss=6.82e-08, v_num=3]
Total running time of the script: ( 0 minutes 6.227 seconds)