在 内部LightningModule,Pycharm 允许 2 种自动完成方法:
class MyModel(LightningModule):
def on_validation_epoch_end(self):
def validation_epoch_end(self, outs):
Run Code Online (Sandbox Code Playgroud)
并on_validation_epoch_end引用于hooks.py
def on_validation_epoch_end(self) -> None:
"""
Called in the validation loop at the very end of the epoch.
"""
# do something when the epoch ends
Run Code Online (Sandbox Code Playgroud)
和
validation_epoch_end称为evaluation_loop.py导致.eval_results = model.validation_epoch_end(eval_results)__run_eval_epoch_end
其中每一个的目的是什么?
我只能假设其中一个已被弃用。找不到任何相关文档。
在 pytorch Lightning 中创建新的张量板记录器时,默认记录的两件事是当前纪元和 hp_metric。我能够通过设置禁用 hp_metric 日志记录default_hp_metric=False,但我找不到任何可以禁用纪元日志记录的内容。我在 Lightning.py、trainer.py 和 tensorboard.py 文件中进行了搜索,其中包含模块、训练器和张量板记录器的代码,但在任何地方都找不到 epoch 的日志记录调用。
即使采用 pytorch Lightning 教程中的准系统示例,也会发生这种行为。
有没有办法禁用纪元记录以防止张量板界面混乱?
检测模型是否收敛的标准方法是什么?我打算记录 5 次损失,每次损失有 95 个置信区间,如果他们都同意,那么我\xe2\x80\x99d 停止脚本。我假设收敛之前的训练必须已经在 PyTorch 或 PyTorch Lightning 中的某个地方实现。我不需要一个完美的解决方案,只需自动执行此操作的标准方法 - 即收敛时停止。
\n我的解决方案很容易实现。一旦创建了一个标准并将减少更改为none。然后它将输出一个大小为 的张量[B]。每次记录时都会记录下来,并且它是 95 置信区间(如果您愿意,也可以是 std,但这精度要低得多)。然后,每次添加新损失及其置信区间时,请确保其大小保持为 5(或 10),并且 5 个损失彼此之间的 CI 范围在 95 以内。那么如果这是真的就停下来。
您可以使用以下方法计算 CI:
\ndef torch_compute_confidence_interval(data: Tensor,\n confidence: float = 0.95\n ) -> Tensor:\n """\n Computes the confidence interval for a given survey of a data set.\n """\n n = len(data)\n mean: Tensor = data.mean()\n # se: Tensor = scipy.stats.sem(data) # compute standard error\n # se, mean: Tensor = …Run Code Online (Sandbox Code Playgroud) python machine-learning deep-learning pytorch pytorch-lightning
我训练了一个 PyTorch 闪电模型,如下所示:
In [16]: MLP
Out[16]:
DecoderMLP(
(loss): RMSE()
(logging_metrics): ModuleList(
(0): SMAPE()
(1): MAE()
(2): RMSE()
(3): MAPE()
(4): MASE()
)
(input_embeddings): MultiEmbedding(
(embeddings): ModuleDict(
(LCLid): Embedding(5, 4)
(sun): Embedding(5, 4)
(day_of_week): Embedding(7, 5)
(month): Embedding(12, 6)
(year): Embedding(3, 3)
(holidays): Embedding(2, 1)
(BusinessDay): Embedding(2, 1)
(day): Embedding(31, 11)
(hour): Embedding(24, 9)
)
)
(mlp): FullyConnectedModule(
(sequential): Sequential(
(0): Linear(in_features=60, out_features=435, bias=True)
(1): ReLU()
(2): Dropout(p=0.13371112461182535, inplace=False)
(3): LayerNorm((435,), eps=1e-05, elementwise_affine=True)
(4): Linear(in_features=435, out_features=435, bias=True)
(5): ReLU()
(6): …Run Code Online (Sandbox Code Playgroud) 如何trainer.test使用该方法获得所有批次的总准确度?
我知道我可以实施,model.test_step但这只是针对单个批次。我需要整个数据集的准确性。我可以用来torchmetrics.Accuracy积累准确性。但是将其结合起来并获得总准确度的正确方法是什么?model.test_step由于批量测试分数不是很有用,无论如何应该返回什么?我可以以某种方式破解它,但令我惊讶的是,我在互联网上找不到任何示例来演示如何使用 pytorch-lightning 原生方式获得准确性。
我训练了一个普通的 vae,我从这个存储库修改了它。当我尝试使用经过训练的模型时,我无法使用 加载权重load_from_checkpoint。我的检查点对象和我的对象之间似乎不匹配lightningModule。
我VAEXperiment使用 . 设置了一个实验 ( ) pytorch-lightning LightningModule。我尝试使用以下方法将权重加载到网络中:
#building a new model
model = VanillaVAE(**config['model_params'])
model.build_layers()
#loading the weights
experiment = VAEXperiment(model, config['exp_params'])
experiment.load_from_checkpoint(path_to_checkpoint, config['exp_params'])
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
checkpoint = torch.load(path_to_checkpoint, map_location=lambda storage, loc: storage)
model.load_state_dict(checkpoint['state_dict'])
Run Code Online (Sandbox Code Playgroud)
但我收到错误
Unexpected key(s) in state_dict: "model.encoder.0.0.weight", "model.encoder.0.0.bias"...
我还关注了https://github.com/PyTorchLightning/pytorch-lightning/issues/924 https://github.com/PyTorchLightning/pytorch-lightning/issues/2798上的问题
为什么我会收到此错误?是因为我的模型中的编码器和解码器模块吗?根据 git 上的问题日志,错误似乎已解决。我究竟做错了什么?
我有一台带有两个显卡的机器。我想用两者来训练我的模型。为了让我的生活更轻松,我正在使用 pytorch lighting。
当我在没有 GPU 的情况下运行脚本时,一切正常:
trainer = Trainer(gpus=None)
Run Code Online (Sandbox Code Playgroud)
但我想在多个 GPU 上运行它。令人困惑的是,手册首先指出,对于一台具有多个 GPU 的机器,您应该使用“dp”加速器:
trainer = Trainer(gpus=2, accelerator='dp')
Run Code Online (Sandbox Code Playgroud)
这会启动训练课程,但会出现一个 BroadcastBackward 错误,只有当我尝试使用 dp 加速器时才会出现该错误(详细信息如下)。
然而手册继续说
PyTorch 和 Lightning 不鼓励使用 DP。使用更稳定且至少快 3 倍的 DDP
听起来很棒!所以我这样做:
trainer = Trainer(gpus=2, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)
但现在当我运行时trainer.fit,训练器启动第二个进程(proc = subprocess.Popen(command, env=env_copy, cwd=cwd)在 ddp_accelerator.py 中)。
一方面,这是预期的行为(每个 GPU 一个进程),但另一方面,它确实重新运行了我的主脚本(它不仅仅是重新导入,因此保护并if __name__ == "__main__":没有帮助)。我的脚本是一个优化方案,流程如下:
这意味着第二个进程获得的超参数与第一个进程不同,这显然会引发错误。
顺便说一句,在 1 个 GPU 上运行效果很好(训练完成且没有错误):
trainer = Trainer(gpus=1, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)
我应该如何解决这个问题?坚持使用“dp”并修复我的 BroadcastBackward 错误?或者坚持使用 ddp,但是如何修复脚本重复错误呢?
dp错误详细信息:
在文件 X,第 …
使用 PyTorch Tensorboard,我可以在单个 Tensorboard 图中记录我的训练和有效损失,如下所示:
writer = torch.utils.tensorboard.SummaryWriter()
for i in range(1, 100):
writer.add_scalars('loss', {'train': 1 / i}, i)
for i in range(1, 100):
writer.add_scalars('loss', {'valid': 2 / i}, i)
Run Code Online (Sandbox Code Playgroud)
如何使用 Pytorch Lightning 的默认 Tensorboard 记录器实现相同的效果?
def training_step(self, batch: Tuple[Tensor, Tensor], _batch_idx: int) -> Tensor:
inputs_batch, labels_batch = batch
outputs_batch = self(inputs_batch)
loss = self.criterion(outputs_batch, labels_batch)
self.log('loss/train', loss.item()) # creates separate graph
return loss
def validation_step(self, batch: Tuple[Tensor, Tensor], _batch_idx: int) -> None:
inputs_batch, labels_batch = batch
outputs_batch = self(inputs_batch) …Run Code Online (Sandbox Code Playgroud) 我正在使用 Pytorch Lightning 来训练我的模型(在 GPU 设备上,使用 DDP),TensorBoard 是 Lightning 使用的默认记录器。
我的代码设置为分别记录每个训练和验证步骤的训练和验证损失。
class MyLightningModel(pl.LightningModule):
def training_step(self, batch):
x, labels = batch
out = self(x)
loss = F.mse_loss(out, labels)
self.log("train_loss", loss)
return loss
def validation_step(self, batch):
x, labels = batch
out = self(x)
loss = F.mse_loss(out, labels)
self.log("val_loss", loss)
return loss
Run Code Online (Sandbox Code Playgroud)
TensorBoard在选项卡中正确绘制train_loss和图表。但是,在选项卡中的左侧栏上,仅在 下可见。val_lossSCALERSHPARAMShp_metricMetrics
但是,在HPARAMS选项卡中的左侧栏上,仅hp_metric在 下可见Metrics。
我们如何将train_loss和添加val_loss到该Metrics部分?这样,我们就可以使用val_lossinPARALLEL COORDINATES VIEW来代替hp_metric …
python machine-learning tensorboard pytorch pytorch-lightning
TL;DR:在 on_train_epoch_start 期间,我想获取所有训练数据上的模型输出,作为一些预训练计算的一部分。我问的是,闪电友好的方法是什么。
这是一个奇怪的问题。
在我的项目中,每 10 个时期我都会选择完整训练数据的一个子集,并仅在该子集上进行训练。在计算要使用哪个子集的过程中,我计算了训练数据集中每个数据点的模型输出。
我的问题是,在 pytorch lighting 中做到这一点的最佳方法是什么?目前我有一个带有on_train_epoch_start钩子的回调。在此挂钩期间,回调从生成自己的数据加载器trainer.datamodule.train_dataloader(),并手动迭代数据加载器,计算模型输出。这并不理想,对吧?
这让我遇到了 pytorch lighting 的问题。例如,当在 GPU 上训练时,我收到错误,因为我的回调使用其自己的数据加载器,而不是训练器的train_dataloader,因此它不在 GPU 上。但是,我无法使用 trainer's train_dataloader,因为在我的回调选择其子集之后,它将 trainer's 更改train_dataloader为该子集,而不是完整的数据集。
我想我有两个主要问题: