mirror of
https://github.com/wassname/pytorch-lightning.git
synced 2026-08-21 11:20:03 +08:00
* add doctest to circleci * Revert "add doctest to circleci" This reverts commit c45b34ea911a81f87989f6c3a832b1e8d8c471c6. * Revert "Revert "add doctest to circleci"" This reverts commit 41fca97fdcfe1cf4f6bdb3bbba75d25fa3b11f70. * doctest docs rst files * Revert "doctest docs rst files" This reverts commit b4a2e83e3da5ed1909de500ec14b6b614527c07f. * doctest only rst * doctest debugging.rst * doctest apex * doctest callbacks * doctest early stopping * doctest for child modules * doctest experiment reporting * indentation * doctest fast training * doctest for hyperparams * doctests for lr_finder * doctests multi-gpu * more doctest * make doctest drone * fix label build error * update fast training * update invalid imports * fix problem with int device count * rebase stuff * wip * wip * wip * intro guide * add missing code block * circleci * logger import for doctest * test if doctest runs on drone * fix mnist download * also run install deps for building docs * install cmake * try sudo * hide output * try pip stuff * try to mock horovod * Tranfer -> Transfer * add torchvision to extras * revert pip stuff * mlflow file location * do not mock torch * torchvision * drone extra req. * try higher sphinx version * Revert "try higher sphinx version" This reverts commit 490ac28e46d6fd52352640dfdf0d765befa56988. * try coverage command * try coverage command * try undoc flag * newline * undo drone * report coverage * review Co-authored-by: Jirka Borovec <Borda@users.noreply.github.com> * remove torchvision from extras * skip tests only if torchvision not available * fix testoutput torchvision Co-authored-by: Jirka Borovec <Borda@users.noreply.github.com>
86 lines
2.3 KiB
ReStructuredText
86 lines
2.3 KiB
ReStructuredText
.. testsetup:: *
|
|
|
|
import torch
|
|
from pytorch_lightning.trainer.trainer import Trainer
|
|
from pytorch_lightning.callbacks.base import Callback
|
|
from pytorch_lightning.core.lightning import LightningModule
|
|
|
|
class LitMNIST(LightningModule):
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
def train_dataloader():
|
|
pass
|
|
|
|
def val_dataloader():
|
|
pass
|
|
|
|
|
|
Child Modules
|
|
-------------
|
|
Research projects tend to test different approaches to the same dataset.
|
|
This is very easy to do in Lightning with inheritance.
|
|
|
|
For example, imagine we now want to train an Autoencoder to use as a feature extractor for MNIST images.
|
|
Recall that `LitMNIST` already defines all the dataloading etc... The only things
|
|
that change in the `Autoencoder` model are the init, forward, training, validation and test step.
|
|
|
|
.. testcode::
|
|
|
|
class Encoder(torch.nn.Module):
|
|
pass
|
|
|
|
class Decoder(torch.nn.Module):
|
|
pass
|
|
|
|
class AutoEncoder(LitMNIST):
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.encoder = Encoder()
|
|
self.decoder = Decoder()
|
|
|
|
def forward(self, x):
|
|
generated = self.decoder(x)
|
|
|
|
def training_step(self, batch, batch_idx):
|
|
x, _ = batch
|
|
|
|
representation = self.encoder(x)
|
|
x_hat = self(representation)
|
|
|
|
loss = MSE(x, x_hat)
|
|
return loss
|
|
|
|
def validation_step(self, batch, batch_idx):
|
|
return self._shared_eval(batch, batch_idx, 'val')
|
|
|
|
def test_step(self, batch, batch_idx):
|
|
return self._shared_eval(batch, batch_idx, 'test')
|
|
|
|
def _shared_eval(self, batch, batch_idx, prefix):
|
|
x, y = batch
|
|
representation = self.encoder(x)
|
|
x_hat = self(representation)
|
|
|
|
loss = F.nll_loss(logits, y)
|
|
return {f'{prefix}_loss': loss}
|
|
|
|
|
|
and we can train this using the same trainer
|
|
|
|
.. code-block:: python
|
|
|
|
autoencoder = AutoEncoder()
|
|
trainer = Trainer()
|
|
trainer.fit(autoencoder)
|
|
|
|
And remember that the forward method is to define the practical use of a LightningModule.
|
|
In this case, we want to use the `AutoEncoder` to extract image representations
|
|
|
|
.. code-block:: python
|
|
|
|
some_images = torch.Tensor(32, 1, 28, 28)
|
|
representations = autoencoder(some_images)
|