为何PyTorch Lightning的validation_step执行次数超出val_check_interval设定?
问题原因分析
你的问题主要来自对PyTorch Lightning核心参数逻辑的误解,以及默认配置的额外行为,具体拆解如下:
1. 默认Sanity Check额外触发2次调用
PyTorch Lightning默认开启num_sanity_val_steps=2,也就是在训练正式启动前,会先跑2个验证batch的validation_step,用来验证验证流程是否正常。这2次调用是你没预期到的额外次数。
2. val_check_interval的触发逻辑依赖训练步数
val_check_interval=0.25的含义是每完成训练epoch的25%比例步数,触发一次完整验证,但这个逻辑的生效前提是训练集有足够的训练步数:
- 如果你的训练集batch_size设置得很大(比如训练集样本数刚好等于训练batch_size),整个训练epoch只有1个训练步数,那么0.25、0.5、0.75这三个比例对应的步数都小于1,无法触发验证,只有在完成100% epoch时才会触发1次完整验证。
3. 单次完整验证的validation_step调用次数
你的验证集有20个样本,eval_batch_size=4,刚好整除,所以每次完整验证会调用5次validation_step。
实际7次调用的来源
把上面几点叠加:训练前sanity check的2次 + 训练结束后1次完整验证的5次 = 7次,这就是你看到的结果。
如何达到预期的4次调用
根据你的需求,分两种场景调整:
场景1:希望整个训练过程中总共调用4次validation_step
- 关闭sanity check:设置
num_sanity_val_steps=0 - 限制验证batch数:设置
limit_val_batches=4(直接限制只跑4个验证batch)
场景2:希望触发4次完整验证(每次验证调用5次,共20次)
- 确保训练集总步数≥4:把训练batch_size调小,让训练集的总步数(训练样本数//训练batch_size)至少为4,这样
val_check_interval=0.25会在每完成1/4训练步数时触发一次验证,共4次 - 可选关闭sanity check:设置
num_sanity_val_steps=0避免额外调用
内容的提问来源于stack exchange,提问作者yemy
相关产品推荐
相关产品推荐

