使用tensorflow.keras.backend.shape

时间:2019-01-17 13:35:29

标签: python tensorflow keras

我有一个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。

1 个答案:

答案 0 :(得分:0)

这是一个未解决的问题:https://github.com/tensorflow/tensorflow/issues/24938,并且仅在图形模式下。在渴望模式下,这可能会起作用。但是,使用tf.zeros在图形模式和渴望模式下都可以正常工作。