交叉验证:无法使用clear_session()清除模型来训练新模型

时间:2019-07-18 10:18:29

标签: python machine-learning keras neural-network

我正在尝试评估具有交叉验证的“命名实体识别”任务的培训。问题是未正确清除keras模型以执行交叉验证的其他迭代。

我尝试了在堆栈,github或论坛中建议的几种解决方案,以清除模型,但无济于事。我将集中讨论似乎与规范解决方案很接近的两个问题。

第一个:我在交叉验证的循环之外创建了模型(体系结构+编译),但在循环内部创建了keras.backend.clear_session()。我收到错误:“在图表中找不到tensorflow.python.framework.errors_impl.InvalidArgumentError:在feed_devices或fetch_devices中指定的张量words_input:0”

第二个:我在循环内创建模型,并在内部也调用keras.backend.clear_session()。我收到错误消息:“图中的节点名称重复:'training / Nadam / Pow'”

很抱歉,代码可能不够清晰,但是由于隐私问题我无法显示它

第一

kf = KFold(folds, shuffle=True)
model = create_model(...)
for i, (train_idx, test_idx) in enumerate(kf.split(...)):
   ...
   train_batch, train_batch_len = createBatches(train_set)
   test_batch, test_batch_len = createBatches(test_set)
   model, _, _= training(model, ..., epochs=epochs)
   clear_session()

第二

kf = KFold(folds, shuffle=True)
for i, (train_idx, test_idx) in enumerate(kf.split(...)):
   model = create_model(...)
   ...
   train_batch, train_batch_len = createBatches(train_set)
   test_batch, test_batch_len = createBatches(test_set)
   model, _, _= training(model, ..., epochs=epochs)
   clear_session()

在create_model()内部,我们定义了层的体系结构并调用了compile(...)

我确实想在kfold的每次迭代中使用清晰的模型执行交叉验证。还要提到的另一件事是,我尝试设置每次迭代开始时保存的初始权重,但是当我处理数百个epoch时,似乎存在存储问题,因为据我所知,keras在每个epoch都创建了节点。在这种情况下,如果我使用较少的时间段,则对于整个kfold来说都可以正常工作,但是当我执行了100个时间段时,训练性能在第二次迭代后仍保持为0 F1分数。

1 个答案:

答案 0 :(得分:1)

您还必须在结算季节之前删除模型

from keras import backend as K
del model
K.clear_session()
gc.collect()