中断问题
在进行去雨去雾去雪算法的实验过程中,时常会由于各种意外情况导致实验中断,而在该源码中,并没有对应的中断应对策略,这就导致该源码的健壮性太差,而且博主在实验时也确实遇到多次这种情况,这让博主不胜其烦。
针对这个问题,其实也很好解决,只要在中断后让模型加载最后一次的参数模型即可,其实这种做法是很常见的。
代码修改
代码修改很简单,首先是指定一个参数,若发生中断,则将最后一次保存的模型地址赋值给该参数
parser.add_argument('--resumes', default="outputs/latest_model")
随后让模型加载该参数即可:
model = net_func().cuda()
if args.resumes:
checkpoint = torch.load(args.resumes)
model.load_state_dict(checkpoint['state_dict'], strict=False)
这样就OK了,我们检验一下效果。
实验对比
不使用先前的模型
我们在第45个epoch时发生了中断,此时如果我们直接修改开始的epoch,然后重新运行的话,得到的结果如下:
首先是训练时的损失,在先前的训练中,我们的损失已经下降到了0.3左右,而此时却重新变为了0.37,这与我们重新从1开始运行时的损失接近。
随后是结果评估,可以看到,先前第45个epoch的结果中,PSNR已经达到了24.16,而SSIM为0.83,而此时的中断后不使用先前模型的结果PSNR为18.93,SSIM为0.51,这与最开始的值较为接近。
使用先前的模型
而当我们使用了最后一次模型的参数后,此时的结果如下,此时的损失已经变为了0.269。
此时的评估结果,可以看到较先前有了巨大提升。
可以看到此时的结果,其PSNR为24.25,SSIM为0.84,可以看到结果在原基础上有所提升。
由此,关于该模型的中断问题就解决了。OK