从同一检查点加载的两个模型(具有相似的超参数)在PYTORCH中给出了不同的训练结果

从同一检查点加载的两个模型(具有相似的超参数)在PYTORCH中给出了不同的训练结果,pytorch,checkpoint,Pytorch,Checkpoint,我对一个模型(Lenet-5)进行了10个时代的训练,并保存了该模型。 加载到2个模型“新模型”、“新模型2” 下面是colab链接 对新模型进行了5个历元的训练,但每个历元的训练和测试精度不同,尽管从同一模型加载并设置了再现性设置 当我继续对原始模型进行5次以上的训练时,结果也与2个新模型的训练结果不同 原始模型(15个历元)和2个新模型(从检查点加载后5个历元)的测试和列车精度是否可能相同 (加载检查点后,我对所有3个模型都获得了相同的测试精度,但对每个模型的进一步训练结果都有偏差。)您应

我对一个模型(Lenet-5)进行了10个时代的训练,并保存了该模型。 加载到2个模型“新模型”、“新模型2” 下面是colab链接

对新模型进行了5个历元的训练,但每个历元的训练和测试精度不同,尽管从同一模型加载并设置了再现性设置

当我继续对原始模型进行5次以上的训练时,结果也与2个新模型的训练结果不同

原始模型(15个历元)和2个新模型(从检查点加载后5个历元)的测试和列车精度是否可能相同


(加载检查点后,我对所有3个模型都获得了相同的测试精度,但对每个模型的进一步训练结果都有偏差。)

您应该在每次启动实验之前将所有种子重置为固定值。简言之,顺序如下:

  • 播种
  • 培训新车型#1
  • 将种子(再次)设置为相同的值
  • 培训新车型#2
  • 重复使用部分代码,我们可以定义一个函数来设置种子,在步骤1和3中应使用相同的值调用该函数:

    def set_种子:
    人工种子
    th.cuda.手动种子
    th.backends.cudnn.deterministic=True
    th.backends.cudnn.benchmark=False
    np.随机种子(s)
    随机种子
    os.environ['pythonhasheed']=str(s)
    
    它成功了。非常感谢@ibarrond。现在,从同一检查点装载的两个新模型给出了相似的训练和测试精度。有没有办法将这些新型号的“测试和训练精度”(比如说5个历次)与旧型号(或原始型号)的“测试和训练精度”匹配,以继续其旧型号的训练(比如5个历次)????(因为新型号和旧型号现在都是从类似的重量设置开始的)恐怕这是不可能的。您需要相同的设置(种子和权重初始化)来重现相同的结果。由于原始模型的初始化与检查点中的权重不同,因此您无法将这两种场景对齐。另一个问题是,你为什么需要这个?谢谢@ibarrond。是的,我认为这是不可能的,尽管我使用了相同的种子函数,即使在旧模型训练的开始,我也无法得到与新模型类似的结果。但是,当在旧模型中训练之前再次使用此种子函数时,第二次(即保存检查点后),所有模型的测试和训练精度都相同。我的主要目的实际上是从卷积层中移除一些过滤器。我有两个选择,一个是用较少的过滤器创建新模型,另一个是通过删除所有不必要的权重来修改原始网络本身,等等。所以我只想检查两者是否相等。让我惊讶的是,在上面的colab链接中(在旧模型的10个时代和新模型的5个时代之后),旧模型的测试精度总是稍高一些(set_seed func在旧模型中只使用了一次)。