训练归一化流时的负对数似然损失

问题描述 投票:0回答:1

我正在使用 nflows 库来尝试训练流程。但是,我在训练时得到负损失值。话虽这么说,损失图作为一个整体看起来有点像正常的损失图(减去值)。而且该流程似乎确实产生了某种标准正态分布,这让我认为我实际上正在成功地训练该流程。

image

我附上了初始化和训练的代码片段:

from nflows import transforms, distributions, flows

class NormalizedFlowModel:
    def __init__(self, n_flows, pretrained_path=None, device='cpu', **kwargs):
        self.n_flows = n_flows
        self.net = ResnetAdapter(pretrained_path, device)

        self.latent_dim = kwargs.get('latent_dim', 512)
        self.device = device

        self.transform = transforms.CompositeTransform([
            transforms.MaskedAffineAutoregressiveTransform(features=self.latent_dim, hidden_features=2 * self.latent_dim),
            transforms.RandomPermutation(features=self.latent_dim)
        ] * n_flows)

        # Set target and q0
        base_distribution = distributions.StandardNormal(shape=[self.latent_dim])

        # Construct flow model
        self.flow = flows.Flow(transform=self.transform, distribution=base_distribution)
        self.flow.to(device)

    def train(self, nf_train_loader, **kwargs):
        n_epochs = kwargs.get('n_epochs', 5)
        lr = kwargs.get('lr', 1e-4)
        weight_decay = kwargs.get('weight_decay', 1e-5)

        optimizer = torch.optim.Adam(self.flow.parameters(), lr=lr, weight_decay=weight_decay)
        loss_list = []

        for epoch in tqdm(range(n_epochs), desc="epoch"):

            self.flow.train()
            self.net.eval()

            for batch_idx, (X, Y) in enumerate(nf_train_loader):
                batch_size = X.shape[0]

                X = X.to(self.device)

                with torch.no_grad():
                    outputs, _, latent = self.net(X)

                loss = -self.flow.log_prob(inputs=latent[-1]).mean()
                optimizer.zero_grad()
                loss.backward()
                optimizer.step()

                loss_list.append(loss.item())

        return loss_list

我们使用预训练 resnet 的 FC 层之前的特征图作为输入(即

latent[-1]
)。

为什么我的损失值为负值?我该如何解决这个问题?

python deep-learning pytorch statistics
1个回答
0
投票

@博士。帕特里克教授。你好Yanri,请问这个问题解决了吗?

© www.soinside.com 2019 - 2024. All rights reserved.