为什么“测试过程”在深度学习的纪元循环内?

why the `test process` is inside the epoch loop in deep learning?

我是深度学习新手,这是code我看到的

代码没问题,但我不明白以下内容:

for epoch in range(1, args.epochs + 1):
    train(epoch)
    test(epoch)
    with torch.no_grad():
        sample = torch.randn(64, 20).to(device)
        sample = model.decode(sample).cpu()

在机器学习中,当我们完成训练时,我们会固定测试数据集的模型参数。这是我的两个问题:

(1) 在深度学习中,我们有训练、验证、测试数据集。代码 test(epoch) 是否真的用于验证集?我们在那里修复模型参数并预测测试数据集 outside the epoch loop?

(2) with torch.no_grad(): 是什么意思?为什么它也在 epoch loop?

非常感谢。

  1. 是的,test(epoch) 实际上是在这里进行验证 (更新:不完全是验证,检查下面的答案)
  2. with torch.no_grad() 表示您正在关闭梯度(训练期间反向传播所需)。在 validation/testing 中你不需要它们,它会节省内存和计算。阅读更多 here.

此外,检查 tutorial here

  1. 在您分享的示例中,没有验证。通常,我们执行验证以确定模型是否比上一个时期有所改进并保存检查点。在这个例子中,作者在没有任何验证检查的情况下进行训练和测试。

  2. with torch.no_grad() 基本上禁用梯度计算。当您确定不会调用 Tensor.backward() 时,禁用梯度计算对于推理很有用。它将减少计算的内存消耗。

  3. 为什么在 epoch 循环中,他们使用随机样本执行解码?这只是为了查看随机样本生成的图像的可视化。请注意,test(epoch) 函数为您提供量化值,告诉您模型的性能如何。然而,图像生成是为了进行定性比较,即模型如何改进每个时期的图像生成。