2021-05-21 15:10:36 +00:00
|
|
|
import prototorch as pt
|
|
|
|
import pytorch_lightning as pl
|
|
|
|
from torch.utils.data import DataLoader, random_split
|
|
|
|
from torchvision import transforms
|
|
|
|
from torchvision.datasets import MNIST
|
|
|
|
|
|
|
|
|
|
|
|
class MNISTDataModule(pl.LightningDataModule):
|
|
|
|
def __init__(self, batch_size=32):
|
|
|
|
super().__init__()
|
|
|
|
self.batch_size = batch_size
|
|
|
|
|
2021-05-28 14:33:31 +00:00
|
|
|
# Download mnist dataset as side-effect, only called on the first cpu
|
2021-05-21 15:10:36 +00:00
|
|
|
def prepare_data(self):
|
|
|
|
MNIST("~/datasets", train=True, download=True)
|
|
|
|
MNIST("~/datasets", train=False, download=True)
|
|
|
|
|
2021-05-28 14:33:31 +00:00
|
|
|
# called for every GPU/machine (assigning state is OK)
|
2021-05-21 15:10:36 +00:00
|
|
|
def setup(self, stage=None):
|
2021-05-25 19:13:37 +00:00
|
|
|
# Transforms
|
2021-05-21 15:10:36 +00:00
|
|
|
transform = transforms.Compose([
|
|
|
|
transforms.ToTensor(),
|
|
|
|
])
|
2021-05-25 19:13:37 +00:00
|
|
|
# Split dataset
|
|
|
|
if stage in (None, "fit"):
|
2021-05-21 15:10:36 +00:00
|
|
|
mnist_train = MNIST("~/datasets", train=True, transform=transform)
|
|
|
|
self.mnist_train, self.mnist_val = random_split(
|
2021-05-28 14:33:31 +00:00
|
|
|
mnist_train,
|
|
|
|
[55000, 5000],
|
|
|
|
)
|
2021-05-25 19:13:37 +00:00
|
|
|
if stage == (None, "test"):
|
2021-05-28 14:33:31 +00:00
|
|
|
self.mnist_test = MNIST(
|
|
|
|
"~/datasets",
|
|
|
|
train=False,
|
|
|
|
transform=transform,
|
|
|
|
)
|
2021-05-21 15:10:36 +00:00
|
|
|
|
2021-05-28 14:33:31 +00:00
|
|
|
# Dataloaders
|
2021-05-21 15:10:36 +00:00
|
|
|
def train_dataloader(self):
|
|
|
|
mnist_train = DataLoader(self.mnist_train, batch_size=self.batch_size)
|
|
|
|
return mnist_train
|
|
|
|
|
|
|
|
def val_dataloader(self):
|
|
|
|
mnist_val = DataLoader(self.mnist_val, batch_size=self.batch_size)
|
|
|
|
return mnist_val
|
|
|
|
|
|
|
|
def test_dataloader(self):
|
|
|
|
mnist_test = DataLoader(self.mnist_test, batch_size=self.batch_size)
|
|
|
|
return mnist_test
|
|
|
|
|
|
|
|
|
2021-05-28 14:33:31 +00:00
|
|
|
def train_on_mnist(batch_size=256) -> type:
|
|
|
|
class DataClass(pl.LightningModule):
|
|
|
|
datamodule = MNISTDataModule(batch_size=batch_size)
|
|
|
|
|
|
|
|
def prototype_initializer(self, **kwargs):
|
|
|
|
return pt.components.Zeros((28, 28, 1))
|
2021-05-21 15:10:36 +00:00
|
|
|
|
2021-05-28 14:33:31 +00:00
|
|
|
return DataClass
|