我正在使用 nflows 库来尝试训练流程。但是,我在训练时得到负损失值。话虽这么说,损失图作为一个整体看起来有点像正常的损失图(减去值)。而且该流程似乎确实产生了某种标准正态分布,这让我认为我实际上正在成功地训练该流程。
我附上了初始化和训练的代码片段:
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]
)。
为什么我的损失值为负值?我该如何解决这个问题?
@博士。帕特里克教授。你好Yanri,请问这个问题解决了吗?