pytorch闪电模型的输出预测

output prediction of pytorch lightning model

这可能是一个非常简单的问题。我刚开始使用 PyTorch 闪电,无法弄清楚如何在训练后接收模型的输出。

我对 y_train 和 y_test 作为某种数组(PyTorch 张量或稍后步骤中的 NumPy 数组)的预测感兴趣,以使用不同的脚本在标签旁边绘制。

dataset = Dataset(train_tensor)
val_dataset = Dataset(val_tensor)
training_generator = torch.utils.data.DataLoader(dataset, **train_params)
val_generator = torch.utils.data.DataLoader(val_dataset, **val_params)
mynet = Net(feature_len)
trainer = pl.Trainer(gpus=0,max_epochs=max_epochs, logger=logger, progress_bar_refresh_rate=20, callbacks=[early_stop_callback], num_sanity_val_steps=0)
trainer.fit(mynet)

在我的闪电模块中,我有以下功能:

def __init__(self, random_inputs):

def forward(self, x):

def train_dataloader(self):
    
def val_dataloader(self):

def training_step(self, batch, batch_nb):

def training_epoch_end(self, outputs):

def validation_step(self, batch, batch_nb):

def validation_epoch_end(self, outputs):

def configure_optimizers(self):

我是否需要一个特定的预测函数,或者是否有任何我没有看到的已经实现的方法?

训练器具有test功能。您可能想查看 pytorch-lightning 的原始文档以获取更多详细信息:https://pytorch-lightning.readthedocs.io/en/latest/trainer.html#testing.

您也可以使用 predict 方法。这是文档中的示例。 https://pytorch-lightning.readthedocs.io/en/latest/starter/introduction_guide.html

class LitMNISTDreamer(LightningModule):

    def forward(self, z):
        imgs = self.decoder(z)
        return imgs

    def predict_step(self, batch, batch_idx: int , dataloader_idx: int = None):
        return self(batch)


model = LitMNISTDreamer()
trainer.predict(model, datamodule) 

我不同意这些答案:OP 的问题似乎集中在他应该如何使用闪电训练的模型来获得预测一般,而不是针对特定步骤培训管道。在这种情况下,用户不需要靠近 Trainer 对象的任何地方——这些对象不打算用于一般预测,因此上面的答案鼓励反模式(每次我们都随身携带一个 trainer 对象)想做一些预测)给将来阅读这些答案的任何人。

我们可以直接从已定义的闪电模块获得预测,而不是使用 trainer:如果我有闪电模块的(训练过的)实例 model = Net(...) 然后使用该模型来只需调用 model(x) 即可获得对输入 x 的预测(只要 forward 方法已在 Lightning 模块上 implemented/overriden - 这是必需的)。

相比之下,Trainer.predict() 通常不是使用训练有素的模型获得预测的预期方式。 Trainer API 为您的 LightningModule tunefittest 提供方法作为训练管道的一部分,在我看来 predict 方法是作为 less 'standard' 训练步骤的一部分,为单独的数据加载器提供临时预测。

OP 的问题(我需要一个特定的预测函数还是有任何我没有看到的已经实现的方法?)暗示他们不熟悉 forward() 方法在 PyTorch 中的工作方式,但询问是否已经存在他们看不到的预测方法。因此,完整的答案需要进一步解释 forward() 方法在预测过程中的适用范围:

model(x) 工作的原因是因为 Lightning 模块是 torch.nn.Module 的子class 并且它们实现了一个名为 __call__() 的魔法方法,这意味着我们可以调用class 实例就好像它是一个函数。 __call__() 依次调用 forward(),这就是为什么我们需要在 Lightning 模块中覆盖该方法。

注意。因为 forward 只是我们使用 model(x) 时调用的逻辑的一部分,所以总是建议使用 model(x) 而不是 model.forward(x) 进行预测,除非你有特定的原因偏离.

您可以通过两种方式尝试预测:

  1. 按正常方式执行批量预测。
test_dataset = Dataset(test_tensor)
test_generator = torch.utils.data.DataLoader(test_dataset, **test_params)

mynet.eval()
batch = next(iter(test_generator))
with torch.no_grad():
    predictions_single_batch = mynet(**unpacked_batch)
  1. 实例化一个新的Trainer对象。 Trainer 的 predict API 允许你传递一个任意的 DataLoader.
test_dataset = Dataset(test_tensor)
test_generator = torch.utils.data.DataLoader(test_dataset, **test_params)

predictor = pl.Trainer(gpus=1)
predictions_all_batches = predictor.predict(mynet, dataloaders=test_generator)

我注意到在第二种情况下,Pytorch Lightning 会处理诸如将张量和模型移动到(而不是离开)GPU,与其执行分布式预测的潜力保持一致。它也没有 returns 任何梯度附加损失值,这有助于免除编写像 with torch.no_grad().

这样的样板代码的需要