RuntimeError: Unable to create link (name already exists) When saving second model using Google Colab

RuntimeError: Unable to create link (name already exists) When saving second model using Google Colab

我创建了一个模型测试管道供实习使用,并且 运行 在 Google Colab 上。该管道允许背靠背测试多组模型和参数。它将以用户定义的方式启动一个模型和一组参数,执行 15 个 epoch 的训练,并在每个 epoch 后进行验证。它使用两个 ModelCheckpoints 将模型保存为 h5 文件,一个保存每个 epoch,另一个只保存最好的 epoch,以已知名称保存在不同的文件夹中,以便以后可以轻松加载。

作为参考,每个 model/parameter 测试集都使用唯一的测试人员 ID 和模型计数来标识,每个模型都会递增。每个 epoch 保存的模型检查点也有 epoch 编号附加到末尾。

在所有 15 个 epoch 之后,最好的模型被加载并在我们的测试集上进行评估。然后启动下一个模型和参数集并重复该过程,直到达到用户定义的停止点。

至少,它应该是这样工作的。

相反,第一个模型 运行 按计划进行。然后加载下一个模型并训练和验证一个时期。但是,当需要为第一个纪元保存检查点时,会抛出以下内容: RuntimeError: Unable to create link (name already exists)

发生这种情况后,我发现 在第一个纪元结束时遇到错误的唯一方法是重置 Colab 运行time。在错误再次发生之前,我从中得到了额外的 1 个模型。 (注意:这和我之前出的1个模型不一样,我调整方法参数从下一个需要的模型开始运行)

最后,为了彻底解决导致此错误的最常见原因,我尝试 运行同时 model.summary()for i, w in enumerate(model.weights): print(i, w.name)。我没有重复的名字。

我不确定为什么会出现这种行为,我最好的猜测是它会归因于 Colab 的缓存行为和 ModelCheckpoint 用于保存文件的任何方法的某种组合,导致它解释名称重叠有 none.

如能进一步说明发生这种情况的原因以及解决方法,我们将不胜感激。

我最终解决了这个问题,但问题并不是我想象的那样。问题在于我使用 class 来包装我用于 model.fit()model.predict() 的参数。对于 optimizer 参数,我的默认值为 Adam(learning_rate=0.0001)。由于参数是一个可变对象,它在每个 运行 中被重用,这导致了错误。我将默认值更改为 None,如果方法中的值为 None 并且问题消失,则将变量初始化为默认值。