Source code for plenoptic.metric.classes

import torch

from .perceptual_distance import normalized_laplacian_pyramid


[docs] class NLP(torch.nn.Module): r"""simple class for implementing normalized laplacian pyramid This class just calls ``plenoptic.metric.normalized_laplacian_pyramid`` on the image and returns a 3d tensor with the flattened activations. NOTE: synthesis using this class will not be the exact same as synthesis using the ``plenoptic.metric.nlpd`` function (by default), because the ``nlpd`` function uses the root-mean square of the L2 distance (i.e., ``torch.sqrt(torch.mean(x-y)**2))`` as the distance metric between representations. """ def __init__(self): super().__init__()
[docs] def forward(self, image): """returns flattened NLP activations WARNING: For now this only supports images with batch and channel size 1 Parameters ---------- image : torch.Tensor image to pass to normalized_laplacian_pyramid Returns ------- representation : torch.Tensor 3d tensor with flattened NLP activations """ if image.shape[0] > 1 or image.shape[1] > 1: raise Exception("For now, this only supports batch and channel size 1") activations = normalized_laplacian_pyramid(image) # activations is a list of tensors, each at a different scale # (down-sampled by factors of 2). To combine these into one # vector, we need to flatten each of them and then unsqueeze so # it is 3d return torch.cat([i.flatten() for i in activations]).unsqueeze(0).unsqueeze(0)