Tensorflow 在循环中训练keras模型:“;张量不是这个图的一个元素;调用K.clear_session()后保存模型时

Tensorflow 在循环中训练keras模型:“;张量不是这个图的一个元素;调用K.clear_session()后保存模型时,tensorflow,keras,Tensorflow,Keras,我尝试在一个循环中训练多个Keras模型,以评估不同的参数。为了避免内存问题,我在每次构建模型之前调用K.clear_session() 添加K.clear\u session()调用后,我在保存第二个模型时开始出现此错误 提升值错误(“张量%s不是此图的元素。”%obj) ValueError:Tensor Tensor(“level1/kernel:0”,shape=(3,3,16),dtype=float32\u ref)不是此图的元素。 在处理上述异常期间,发生了另一个异常: 回溯(最近

我尝试在一个循环中训练多个Keras模型,以评估不同的参数。为了避免内存问题,我在每次构建模型之前调用
K.clear_session()

添加
K.clear\u session()
调用后,我在保存第二个模型时开始出现此错误

提升值错误(“张量%s不是此图的元素。”%obj) ValueError:Tensor Tensor(“level1/kernel:0”,shape=(3,3,16),dtype=float32\u ref)不是此图的元素。 在处理上述异常期间,发生了另一个异常:

回溯(最近一次呼叫最后一次): 文件“/home/gus/workspace/wpy/cnn/srs/train_generators.py”,第286行,在 列车模型(模型defs) 文件“/home/gus/workspace/wpy/cnn/srs/train_generators.py”,第196行,列车模型 model.save(文件路径) 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/keras/engine/network.py”,第1090行,保存 保存模型(self、filepath、overwrite、include\u优化器) 文件“/home/gus/workspaces/venvs/dlcv/lib/python3.6/site packages/keras/engine/saving.py”,第382行,在save_模型中 _序列化\u模型(模型、f、包含\u优化器) 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/keras/engine/saving.py”,第97行,在序列化模型中 权重值=K.batch\u get\u值(符号权重) 文件“/home/gus/workspaces/venvs/dlcv/lib/python3.6/site packages/keras/backend/tensorflow\u backend.py”,第2420行,在批处理中获取值 返回get_session().运行(ops) 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/tensorflow/python/client/session.py”,第929行,正在运行 运行_元数据_ptr) 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/tensorflow/python/client/session.py”,第1137行,正在运行 self.\u图形、回迁、馈送\u dict\u张量、馈送\u句柄=馈送\u句柄) 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/tensorflow/python/client/session.py”,第471行,在init self.\u fetch\u mapper=\u FetchMapper.for\u fetch(fetches) 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/tensorflow/python/client/session.py”,第261行,在for_fetch中 return\u ListFetchMapper(fetch) 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/tensorflow/python/client/session.py”,第370行,在init self._mappers=[_FetchMapper.for_fetch(fetch)for fetch in fetches] 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/tensorflow/python/client/session.py”,第370行,在 self._mappers=[_FetchMapper.for_fetch(fetch)for fetch in fetches] 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/tensorflow/python/client/session.py”,第271行,在for_fetch中 return\u ElementFetchMapper(fetches,contraction\u fn) 文件“/home/gus/workspace/venvs/dlcv/lib/python3.6/site packages/tensorflow/python/client/session.py”,第307行,在init 张量。(%s)'(提取,str(e))) ValueError:Fetch参数不能解释为张量。(张量张量(“level1/kernel:0”,shape=(3,3,3,16),dtype=float32\u ref)不是此图的元素。)

守则基本上是:

while <models to train>:
    K.clear_session()
    model = modeldef.build() # everything that has a tensor goes here and just here
    # create generators from directories

    opt = Adam(lr=0.001, decay=0.001 / epochs)
    model.compile(...)
    H = model.fit_generator(...)

    model.save(file_path) # --> here it crashes
看看类似的问题,我知道问题是因为keras共享一个全局会话,不同模型的不同图形不能混合。 但我不明白为什么在每个模型之前使用
K.clear_session()
会使迭代>1时的保存操作失败。为什么张量和变量之间存在差异

不能解释为张量

有人能帮忙吗


谢谢。

我错了,我导入了错误的包:

从tensorflow.python.keras将后端导入为K

而不是

将keras.backend作为K导入


我的错误是,我导入了错误的包:

从tensorflow.python.keras将后端导入为K

而不是

将keras.backend作为K导入

class SuperSimpleCNN:
    def __init__(self, img_size, depth):
        self.img_size = img_size
        self.depth = depth

    def build(self):
        init = Input(shape=(self.img_size, self.img_size, self.depth))

        x = Convolution2D(16, (3, 3), padding='same', name='level1')(init)
        x = Activation('relu')(x)

        out = Convolution2D(self.depth, (5, 5), padding='same', name='output')(x)
        model = Model(init, out)
        return model