我已经创建了一个模型测试管道,用于我的实习,并在Google Colab上运行。该管道允许对多组模型和参数进行背靠背测试。它将以用户定义的方式启动一个模型和一组参数,进行15个epoch的训练,每个epoch之后进行验证。它使用两个ModelCheckpoint
s将模型保存为h5文件,一个保存每个epoch,另一个保存最好的epoch,在一个已知的名称下在不同的文件夹中,以便以后可以轻松加载。
作为参考,测试的每个模型/参数集都使用唯一的测试者id和模型计数数来标识,每个模型都增加一个模型计数数。保存每个epoch的模型检查点也在末尾附加了epoch号。
在所有15个epoch之后,加载最佳模型并在我们的测试集上进行评估。然后启动下一个模型和参数集,并重复该过程,直到达到用户定义的停止点。
至少,它应该是这样工作的。
实际情况是,第一个要运行的模型按照计划运行。然后加载下一个模型,并为一个epoch进行训练和验证。但是,当需要为第一个epoch保存检查点时,会抛出以下内容:RuntimeError: Unable to create link (name already exists)
最后,为了明确这个错误的最常见原因,我试着运行model.summary()
和for i, w in enumerate(model.weights): print(i, w.name)
。我没有重复的名字。
我不确定为什么这种行为会发生,我最好的猜测是它会落在Colab的缓存行为和ModelCheckpoint
使用的任何方法来保存文件的组合下,导致它解释一个没有名称重叠的地方。
如果能提供进一步的见解,说明为什么会发生这种情况,以及如何解决,将不胜感激。
我最终解决了这个问题,但问题不是我所认为的那样。问题在于我使用一个类来包装我用于model.fit()
和model.predict()
的参数。对于optimizer
参数,我的默认值是Adam(learning_rate=0.0001)
。由于参数是可变对象,因此每次运行都会重用它,从而导致错误。我将默认值更改为None
,并将变量初始化为默认值,如果值为方法中的None
,问题就消失了。