Note
Go to the end to download the full example code.
Divergence domain adaptation methods.
This example illustrates the DeepCoral method from [1] on a simple image classification task.
# Author: Théo Gnassounou
#
# License: BSD 3-Clause
# sphinx_gallery_thumbnail_number = 4
from skorch import NeuralNetClassifier
from torch import nn
from skada.datasets import load_mnist_usps
from skada.deep import DeepCoral
from skada.deep.modules import MNISTtoUSPSNet
Load the image datasets
dataset = load_mnist_usps(n_classes=2, n_samples=0.5, return_dataset=True)
X, y, sample_domain = dataset.pack(
as_sources=["mnist"], as_targets=["usps"], mask_target_labels=True
)
X_test, y_test, sample_domain_test = dataset.pack(
as_sources=[], as_targets=["usps"], mask_target_labels=False
)
0%| | 0.00/9.91M [00:00<?, ?B/s]
100%|██████████| 9.91M/9.91M [00:00<00:00, 151MB/s]
0%| | 0.00/28.9k [00:00<?, ?B/s]
100%|██████████| 28.9k/28.9k [00:00<00:00, 41.4MB/s]
0%| | 0.00/1.65M [00:00<?, ?B/s]
100%|██████████| 1.65M/1.65M [00:00<00:00, 75.7MB/s]
0%| | 0.00/4.54k [00:00<?, ?B/s]
100%|██████████| 4.54k/4.54k [00:00<00:00, 14.3MB/s]
/home/circleci/project/skada/datasets/_mnist_usps.py:72: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
mnist_target = torch.tensor(mnist_dataset.targets)
0%| | 0.00/1.83M [00:00<?, ?B/s]
2%|▏ | 32.8k/1.83M [00:00<00:10, 165kB/s]
5%|▌ | 98.3k/1.83M [00:00<00:06, 261kB/s]
11%|█ | 197k/1.83M [00:00<00:04, 366kB/s]
16%|█▌ | 295k/1.83M [00:00<00:03, 417kB/s]
23%|██▎ | 426k/1.83M [00:00<00:02, 504kB/s]
29%|██▊ | 524k/1.83M [00:01<00:03, 372kB/s]
45%|████▍ | 819k/1.83M [00:01<00:01, 666kB/s]
52%|█████▏ | 950k/1.83M [00:01<00:01, 616kB/s]
57%|█████▋ | 1.05M/1.83M [00:01<00:01, 629kB/s]
93%|█████████▎| 1.70M/1.83M [00:02<00:00, 1.40MB/s]
100%|██████████| 1.83M/1.83M [00:02<00:00, 833kB/s]
Train a classic model
model = NeuralNetClassifier(
MNISTtoUSPSNet(),
criterion=nn.CrossEntropyLoss(),
batch_size=128,
max_epochs=5,
train_split=False,
lr=1e-2,
)
model.fit(X[sample_domain > 0], y[sample_domain > 0])
model.score(X_test, y=y_test)
epoch train_loss dur
------- ------------ ------
1 1.0683 3.9993
2 0.1451 3.5001
3 0.0613 3.6998
4 0.0406 3.4957
5 0.0318 3.5025
0.9003215434083601
Train a DeepCoral model
model = DeepCoral(
MNISTtoUSPSNet(),
layer_name="fc1",
batch_size=128,
max_epochs=5,
train_split=False,
reg=1,
lr=1e-2,
)
model.fit(X, y, sample_domain=sample_domain)
model.score(X_test, y_test, sample_domain=sample_domain_test)
epoch train_loss dur
------- ------------ ------
1 1.4604 8.2720
2 0.3677 7.0954
3 0.1435 6.6957
4 0.0882 7.1028
5 0.0665 7.4022
0.9035369774919614
Total running time of the script: (1 minutes 3.978 seconds)