Experiment Logging
===================

Comet.ml
^^^^^^^^

`Comet.ml <https://www.comet.ml/site/>`_ is a third-party logger.
To use CometLogger as your logger do the following.

.. seealso::
    :class:`~pytorch_lightning.loggers.CometLogger` docs.

.. code-block:: python

   from pytorch_lightning.loggers import CometLogger

    comet_logger = CometLogger(
        api_key=os.environ["COMET_KEY"],
        workspace=os.environ["COMET_WORKSPACE"], # Optional
        project_name="default_project", # Optional
        rest_api_key=os.environ["COMET_REST_KEY"], # Optional
        experiment_name="default" # Optional
    )
   trainer = Trainer(logger=comet_logger)

The CometLogger is available anywhere except ``__init__`` in your LightningModule

.. code-block:: python

   class MyModule(pl.LightningModule):

      def any_lightning_module_function_or_hook(self, ...):
         some_img = fake_image()
         self.logger.experiment.add_image('generated_images', some_img, 0)

Neptune.ai
^^^^^^^^^^

`Neptune.ai <https://neptune.ai/>`_ is a third-party logger.
To use Neptune.ai as your logger do the following.

.. seealso::
    :class:`~pytorch_lightning.loggers.NeptuneLogger` docs.

.. code-block:: python

   from pytorch_lightning.loggers import NeptuneLogger

    neptune_logger = NeptuneLogger(
        project_name="USER_NAME/PROJECT_NAME",
        experiment_name="default", # Optional,
        params={"max_epochs": 10}, # Optional,
        tags=["pytorch-lightning","mlp"] # Optional,
    )
   trainer = Trainer(logger=neptune_logger)

The Neptune.ai is available anywhere except ``__init__`` in your LightningModule

.. code-block:: python

   class MyModule(pl.LightningModule):

      def any_lightning_module_function_or_hook(self, ...):
         some_img = fake_image()
         self.logger.experiment.add_image('generated_images', some_img, 0)

allegro.ai TRAINS
^^^^^^^^^^^^^^^^^

`allegro.ai <https://github.com/allegroai/trains/>`_ is a third-party logger.
To use TRAINS as your logger do the following.

.. seealso::
    :class:`~pytorch_lightning.loggers.TrainsLogger` docs.

.. code-block:: python

   from pytorch_lightning.loggers import TrainsLogger

    trains_logger = TrainsLogger(
        project_name="examples",
        task_name="pytorch lightning test"
    )
   trainer = Trainer(logger=trains_logger)

The TrainsLogger is available anywhere in your LightningModule

.. code-block:: python

   class MyModule(pl.LightningModule):

      def __init__(self, ...):
         some_img = fake_image()
         self.logger.log_image('debug', 'generated_image_0', some_img, 0)

Tensorboard
^^^^^^^^^^^

To use `Tensorboard <https://pytorch.org/docs/stable/tensorboard.html>`_ as your logger do the following.

.. seealso::
    :class:`~pytorch_lightning.loggers.TensorBoardLogger` docs.

.. code-block:: python

   from pytorch_lightning.loggers import TensorBoardLogger

   logger = TensorBoardLogger("tb_logs", name="my_model")
   trainer = Trainer(logger=logger)

The TensorBoardLogger is available anywhere except ``__init__`` in your LightningModule

.. code-block:: python

   class MyModule(pl.LightningModule):

      def any_lightning_module_function_or_hook(self, ...):
         some_img = fake_image()
         self.logger.experiment.add_image('generated_images', some_img, 0)


Test Tube
^^^^^^^^^

`Test Tube <https://github.com/williamFalcon/test-tube>`_ is a tensorboard logger but with nicer file structure.
To use TestTube as your logger do the following.

.. seealso::
    :class:`~pytorch_lightning.loggers.TestTubeLogger` docs.

.. code-block:: python

   from pytorch_lightning.loggers import TestTubeLogger

   logger = TestTubeLogger("tb_logs", name="my_model")
   trainer = Trainer(logger=logger)

The TestTubeLogger is available anywhere except ``__init__`` in your LightningModule

.. code-block:: python

   class MyModule(pl.LightningModule):

      def any_lightning_module_function_or_hook(self, ...):
         some_img = fake_image()
         self.logger.experiment.add_image('generated_images', some_img, 0)

Wandb
^^^^^

`Wandb <https://www.wandb.com/>`_ is a third-party logger.
To use Wandb as your logger do the following.

.. seealso::
    :class:`~pytorch_lightning.loggers.WandbLogger` docs.

.. code-block:: python

   from pytorch_lightning.loggers import WandbLogger

   wandb_logger = WandbLogger()
   trainer = Trainer(logger=wandb_logger)

The Wandb logger is available anywhere except ``__init__`` in your LightningModule

.. code-block:: python

   class MyModule(pl.LightningModule):

      def any_lightning_module_function_or_hook(self, ...):
         some_img = fake_image()
         self.logger.experiment.add_image('generated_images', some_img, 0)


Multiple Loggers
^^^^^^^^^^^^^^^^

PyTorch-Lightning supports use of multiple loggers, just pass a list to the `Trainer`.

.. code-block:: python

   from pytorch_lightning.loggers import TensorBoardLogger, TestTubeLogger
   
   logger1 = TensorBoardLogger("tb_logs", name="my_model")
   logger2 = TestTubeLogger("tt_logs", name="my_model")
   trainer = Trainer(logger=[logger1, logger2])
   
The loggers are available as a list anywhere except ``__init__`` in your LightningModule

.. code-block:: python

   class MyModule(pl.LightningModule):

      def any_lightning_module_function_or_hook(self, ...):
         some_img = fake_image()

         # Option 1
         self.logger.experiment[0].add_image('generated_images', some_img, 0)

         # Option 2
         self.logger[0].experiment.add_image('generated_images', some_img, 0)