我有一个keras模型,当我从keras导入子模块(层,后端函数)时,它可以正常工作。但是,如果我从tensorflow.keras导入模型,则会破坏相同的模型。
以下是说明问题的示例:
if True:
from keras import backend as K
from keras.models import Model
from keras.layers import Input, Lambda
from keras.preprocessing.image import ImageDataGenerator
else:
from tensorflow.keras import backend as K
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Lambda
from tensorflow.keras.preprocessing.image import ImageDataGenerator
def ex_add(inputs):
"""Made-up example that illustrates the problem"""
ones = K.ones(K.shape(inputs))
return inputs + ones
img_input = Input(shape=(512, 512, 3))
ex = Lambda(pconv_add)(img_input)
model = Model(inputs=[img_input], outputs=ex)
model.compile(optimizer='Adam', loss='mse')
test_generator = ... # data_generator.flow_from_directory() using ImageDataGenerator
img = next(test_generator)[0]
pconv_predict = model.predict(img)
从keras导入时,一切正常。从tensorflow.keras导入会导致这种情况(当我将其称为model.predict或model.fit_generator时):
错误:tensorflow:=================================从不存在对象 二手(类型): 如果你想 将其标记为已使用,请调用其“ mark_used()”方法。原来是 在此处创建:文件“ /usr/lib/python3.6/runpy.py”,行193,在 _run_module_as_main “ 主要”,mod_spec)
...
(为了简短起见,删除了长消息)
...
-------------------------------------------------- ---------------------------- AttributeError Traceback(最近一次调用 最后)在() 14#model.summary() 15 img = next(train_generator)[0] [0] ---> 16 pconv_predict = model.predict(img)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py 用predict(self,x,batch_size,verbose,steps,max_queue_size, worker,use_multiprocessing)1876否则:1877返回 training_arrays.predict_loop( -> 1878 self,x,batch_size =批处理大小,verbose = verbose,steps = steps)1879 1880 def train_on_batch(self,x,y = None, sample_weight = None,class_weight = None):
...
(为了简短起见,删除了长消息)
...
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/variables.py 在is_variable_initialized(variable)2897中已初始化,
False
除此以外。 2898“”“ -> 2899返回state_ops.is_variable_initialized(variable)2900 2901/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/state_ops.py 在is_variable_initialized(ref,name)中 129返回gen_state_ops.is_variable_initialized(ref = ref,name = name) 130#处理资源变量。 -> 131返回ref.is_initialized(name = name) 132 133
AttributeError:“ Tensor”对象没有属性“ is_initialized”
问题起源于Lambda层,尤其是K.shape(inputs)。我尝试用(4,512,512,3)替换它,无论我导入keras的方式如何,它都可以正常工作。您以前看过这个问题吗,我该如何解决?
注意,我在Colaboratory上运行此代码。 keras和tensorflow.keras版本是 2.2.4和2.1.6-tf。
答案 0 :(得分:0)
这是一个未解决的问题:https://github.com/tensorflow/tensorflow/issues/24938,并且仅在图形模式下。在渴望模式下,这可能会起作用。但是,使用tf.zeros在图形模式和渴望模式下都可以正常工作。