pytorch闪电模型输出预测



这可能是一个非常简单的问题。我刚开始使用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):

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

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

不使用trainer,我们可以直接从已经定义的Lightning模块中获得预测:如果我有我的(训练过的)Lightning模块model = Net(...)实例,那么使用该模型来获得输入x的预测只需调用model(x)(只要forward方法已经在Lightning模块上实现/覆盖-这是必需的)。

相反,Trainer.predict()通常不是使用训练过的模型获得预测的预期手段。培训器API提供了tune,fittest的方法,作为您的LightningModule的训练管道的一部分,在我看来,predict方法是为单独的数据加载器提供临时预测,作为较少"标准"训练步骤的一部分。

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

model(x)工作的原因是因为闪电模块是torch.nn.Module的子类,它们实现了一个叫做__call__()的神奇方法,这意味着我们可以像调用函数一样调用类实例。__call__()反过来调用forward(),这就是为什么我们需要在我们的闪电模块中覆盖该方法。

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

您也可以使用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) 

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

  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对象。培训师的预测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)

我注意到,在第二种情况下,PytorchLightning负责将你的张量和模型移动到(而不是离开)GPU上,与它执行分布式预测的潜力保持一致。它也不返回任何梯度附加的损失值,这有助于省去编写像with torch.no_grad()这样的样板代码的需要。

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

相关内容

  • 没有找到相关文章

最新更新