为什么“测试过程”在深度学习的纪元循环内?
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
?
中
非常感谢。
- 是的,
test(epoch)
实际上是在这里进行验证 (更新:不完全是验证,检查下面的答案)。
with torch.no_grad()
表示您正在关闭梯度(训练期间反向传播所需)。在 validation/testing 中你不需要它们,它会节省内存和计算。阅读更多 here.
此外,检查 tutorial here。
在您分享的示例中,没有验证。通常,我们执行验证以确定模型是否比上一个时期有所改进并保存检查点。在这个例子中,作者在没有任何验证检查的情况下进行训练和测试。
with torch.no_grad()
基本上禁用梯度计算。当您确定不会调用 Tensor.backward()
时,禁用梯度计算对于推理很有用。它将减少计算的内存消耗。
为什么在 epoch
循环中,他们使用随机样本执行解码?这只是为了查看随机样本生成的图像的可视化。请注意,test(epoch)
函数为您提供量化值,告诉您模型的性能如何。然而,图像生成是为了进行定性比较,即模型如何改进每个时期的图像生成。
我是深度学习新手,这是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
?
非常感谢。
- 是的,
test(epoch)
实际上是在这里进行验证 (更新:不完全是验证,检查下面的答案)。 with torch.no_grad()
表示您正在关闭梯度(训练期间反向传播所需)。在 validation/testing 中你不需要它们,它会节省内存和计算。阅读更多 here.
此外,检查 tutorial here。
在您分享的示例中,没有验证。通常,我们执行验证以确定模型是否比上一个时期有所改进并保存检查点。在这个例子中,作者在没有任何验证检查的情况下进行训练和测试。
with torch.no_grad()
基本上禁用梯度计算。当您确定不会调用Tensor.backward()
时,禁用梯度计算对于推理很有用。它将减少计算的内存消耗。为什么在
epoch
循环中,他们使用随机样本执行解码?这只是为了查看随机样本生成的图像的可视化。请注意,test(epoch)
函数为您提供量化值,告诉您模型的性能如何。然而,图像生成是为了进行定性比较,即模型如何改进每个时期的图像生成。