Tensorflow 调用Keras.backend.clear_session()后无法导入预训练模型

Tensorflow 调用Keras.backend.clear_session()后无法导入预训练模型,tensorflow,keras,Tensorflow,Keras,我试图在keras的循环中(使用tensorflow后端)在每次迭代中使用新的数据样本来训练模型。由于在一些迭代之后出现GPU内存错误,我附加了K.clear_session()。但是,在一次迭代后,代码抛出错误: 'Cannot interpret feed_dict key as Tensor: ' + e.args[0]) TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder:0",

我试图在keras的循环中(使用tensorflow后端)在每次迭代中使用新的数据样本来训练模型。由于在一些迭代之后出现GPU内存错误,我附加了K.clear_session()。但是,在一次迭代后,代码抛出错误:

'Cannot interpret feed_dict key as Tensor: ' + e.args[0])
TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder:0", shape=(7, 7, 3, 64), dtype=float32) is not an element of this graph.
如果在结束时删除K.clear_session(),则不会出现错误。有人能解释为什么这个错误出现在第二次迭代中吗

我尝试了其他方法(用于gpu发布),但没有一种有效,这是我最后的选择。但这会带来错误。我粘贴了一个可能产生错误的示例代码。请注意,这不是实际的代码,我只是举了一个例子来重现我在实际代码中遇到的错误

from __future__ import absolute_import, division, print_function, unicode_literals
import numpy as np
import tensorflow as tf
import random
seed_value= 0
import os
import keras
os.environ['PYTHONHASHSEED']=str(seed_value)
random.seed(0)
np.random.seed(0)
from keras import backend as K
from keras.datasets import cifar10

(x_train, y_train), (x_test, y_test) = cifar10.load_data()
for i in range(3):
    base_model = tf.keras.applications.resnet50.ResNet50(weights='imagenet', input_shape=(32, 32, 3),
                                               include_top=False)
    x = base_model.output
    x = tf.keras.layers.GlobalAveragePooling2D()(x)
    output = tf.keras.layers.Dense(10, activation='softmax',
                               kernel_initializer=tf.keras.initializers.RandomNormal(seed=4))(x)
    model = tf.keras.Model(inputs=base_model.input, outputs=output)
    y_train = keras.utils.to_categorical(y_train, 10)
    y_test = keras.utils.to_categorical(y_test, 10)

    for layer in base_model.layers:
        layer.trainable = False
    optimizer = tf.train.AdamOptimizer(learning_rate=0.0001)
    model.compile(optimizer=optimizer, loss='categorical_crossentropy',
              metrics=['accuracy'])
    model.fit(x_train,y_train,batch_size=1024,epochs=1,verbose=1)
    K.clear_session()
回溯(最近一次呼叫最后一次):
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\client\session.py”,第1092行,正在运行
子进纸,允许张量=真,允许操作=假)
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\framework\ops.py”,第3490行,在as\U图形\U元素中
返回self.\u as\u graph\u element\u locked(对象、允许张量、允许操作)
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\framework\ops.py”,第3569行,位于“as\u graph\u element\u locked”中
raise VALUERROR(“张量%s不是此图的元素。”%obj)
ValueError:Tensor Tensor(“占位符:0”,shape=(7,7,3,64),dtype=float32)不是此图形的元素。
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“E:/code/experiments AL/breakhis/40X-M-B/code AL/error_debug.py”,第22行,在
include_top=False)
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\keras\applications\\ uuuuuu init\uuuuuu.py”,第70行,在包装器中
返回基地乐趣(*args,**kwargs)
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\keras\applications\resnet50.py”,第32行,resnet50
返回resnet50.resnet50(*args,**kwargs)
resnet50中的文件“C:\Users\sirshad\AppData\Local\Programs\Python 36\lib\site packages\keras\u applications\resnet50.py”,第291行
模型。加载权重(权重路径)
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\keras\engine\network.py”,第1544行,在load\u weights中
保存。从组(f,self.layers)加载权重
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\keras\engine\saving.py”,第806行,从hdf5组加载权重
K.批量设置值(权重值元组)
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\keras\backend.py”,第2784行,在批处理设置值中
获取会话()
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\client\session.py”,第929行,正在运行
运行_元数据_ptr)
文件“C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site packages\tensorflow\Python\client\session.py”,第1095行,正在运行
'无法将提要索引键解释为张量:'+e.args[0])
TypeError:无法将feed_dict键解释为张量:张量张量(“占位符:0”,shape=(7,7,3,64),dtype=float32)不是此图的元素。
进程已完成,退出代码为1

通过将imagenet预先训练的模型保存到磁盘,然后在调用tf.keras.backend.clear\u session()后每次在循环中加载,我能够克服这个问题。因此,将基础模型保存到文件中,然后加载就可以了。但我仍然感到困惑,为什么它以前不适用于

基本模型=tf.keras.applications.resnet50.resnet50


通过将imagenet预先训练的模型保存到磁盘,然后在调用tf.keras.backend.clear_session()后每次在循环中加载,我能够克服这个问题。因此,将基础模型保存到文件中,然后加载就可以了。但我仍然感到困惑,为什么它以前不适用于

基本模型=tf.keras.applications.resnet50.resnet50


你能用“这个精确的”代码重现这个问题吗?嗨,丹尼尔,这就是我用另一个代码得到的精确问题。你能从上面给出的代码中重现错误吗?你能建议解决这个问题的方法吗?你能用“这个确切的”代码重现这个问题吗?嗨,丹尼尔,这就是我用另一个代码得到的确切问题。你能从上面给出的代码中重现错误吗?你能建议一些解决方法吗?
Traceback (most recent call last):
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\client\session.py", line 1092, in _run
    subfeed, allow_tensor=True, allow_operation=False)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\ops.py", line 3490, in as_graph_element
    return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\ops.py", line 3569, in _as_graph_element_locked
    raise ValueError("Tensor %s is not an element of this graph." % obj)
ValueError: Tensor Tensor("Placeholder:0", shape=(7, 7, 3, 64), dtype=float32) is not an element of this graph.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:/codes/experiments-AL/breakhis/40X-M-B/codes-AL/error_debug.py", line 22, in <module>
    include_top=False)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\keras\applications\__init__.py", line 70, in wrapper
    return base_fun(*args, **kwargs)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\keras\applications\resnet50.py", line 32, in ResNet50
    return resnet50.ResNet50(*args, **kwargs)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\keras_applications\resnet50.py", line 291, in ResNet50
    model.load_weights(weights_path)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\keras\engine\network.py", line 1544, in load_weights
    saving.load_weights_from_hdf5_group(f, self.layers)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\keras\engine\saving.py", line 806, in load_weights_from_hdf5_group
    K.batch_set_value(weight_value_tuples)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\keras\backend.py", line 2784, in batch_set_value
    get_session().run(assign_ops, feed_dict=feed_dict)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\client\session.py", line 929, in run
    run_metadata_ptr)
  File "C:\Users\sirshad\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\client\session.py", line 1095, in _run
    'Cannot interpret feed_dict key as Tensor: ' + e.args[0])
TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder:0", shape=(7, 7, 3, 64), dtype=float32) is not an element of this graph.

Process finished with exit code 1