向现有Keras模型添加自定义base64字符串转换层

时间:2019-06-19 11:40:06

标签: tensorflow keras

我正在尝试配置一个我先前训练过的模型,该模型以一种将图像作为base64字符串(而不是NumPy数组)接受,将它们转换为NumPy数组,然后执行预测的方式进行分类。如何在常规输入层之上添加一个接受字符串并输出NumPy数组的层?

因此,我已经预先训练了一个基于ResNet架构预测图像的模型。看了thisthis的答案后,我试图创建一个Lambda图层,将字符串转换为RGB jpeg图像。我已经做到了,如下面的示例代码所示:

image = tf.placeholder(shape=[], dtype=tf.string)
input_tensor = keras.layers.Input(shape = (1,), tensor = image, dtype=tf.string)
x = keras.layers.Lambda(lambda image: tf.image.decode_jpeg(image))(input_tensor)
output_tensor = model(x)

new_model = Model(input_tensor, output_tensor)

model()是我已经训练过的Keras keras.models.Model模型。

我期望new_model()是新的Keras模型,在我之前的模型之上有1个额外的层,该模型接受base64字符串并将NumPy数组输出到下一层。

但是,我的代码的第三行引发以下错误:

  

TypeError:“ DecodeJpeg” Op的输入“ contents”的类型为float32,与预期的字符串类型不匹配。

我对此的理解是,使用decode_jpeg()的Lambda层中的“图像”是float32而不是字符串,这对我来说似乎很奇怪,因为我也设置了占位符的dtype作为tf.string的输入层。

我已经在stackoverflow上搜索了所有内容,但是找不到该错误的解决方案。看来this question也无法找到针对此特定问题的解决方案。

修改1:纠正错字并添加完整的错误消息 完整的错误消息如下所示:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords)
   509                 as_ref=input_arg.is_ref,
--> 510                 preferred_dtype=default_dtype)
   511           except TypeError as err:

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in internal_convert_to_tensor(value, dtype, name, as_ref, preferred_dtype, ctx)
  1103     if ret is None:
-> 1104       ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  1105

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in _TensorTensorConversionFunction(t, dtype, name, as_ref)
   946         "Tensor conversion requested dtype %s for Tensor with dtype %s: %r" %
--> 947         (dtype.name, t.dtype.name, str(t)))
   948   return t

ValueError: Tensor conversion requested dtype string for Tensor with dtype float32: 'Tensor("lambda_28/Placeholder:0", shape=(?, 1), dtype=float32)'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-47-5793b0703860> in <module>
     1 image = tf.placeholder(shape=[], dtype=tf.string)
     2 input_tensor = Input(shape = (1,), tensor = image, dtype=tf.string)
----> 3 x = Lambda(lambda image: tf.image.decode_jpeg(image))(input_tensor)
     4 output_tensor = model(x)
     5

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
   472             if all([s is not None
   473                     for s in to_list(input_shape)]):
--> 474                 output_shape = self.compute_output_shape(input_shape)
   475             else:
   476                 if isinstance(input_shape, list):

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/layers/core.py in compute_output_shape(self, input_shape)
   650                 else:
   651                     x = K.placeholder(shape=input_shape)
--> 652                     x = self.call(x)
   653                 if isinstance(x, list):
   654                     return [K.int_shape(x_elem) for x_elem in x]

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/layers/core.py in call(self, inputs, mask)
   685         if has_arg(self.function, 'mask'):
   686             arguments['mask'] = mask
--> 687         return self.function(inputs, **arguments)
   688
   689     def compute_mask(self, inputs, mask=None):

<ipython-input-47-5793b0703860> in <lambda>(image)
     1 image = tf.placeholder(shape=[], dtype=tf.string)
     2 input_tensor = Input(shape = (1,), tensor = image, dtype=tf.string)
----> 3 x = Lambda(lambda image: tf.image.decode_jpeg(image))(input_tensor)
     4 output_tensor = model(x)
     5

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/ops/gen_image_ops.py in decode_jpeg(contents, channels, ratio, fancy_upscaling, try_recover_truncated, acceptable_fraction, dct_method, name)
   946         try_recover_truncated=try_recover_truncated,
   947         acceptable_fraction=acceptable_fraction, dct_method=dct_method,
--> 948         name=name)
   949     _result = _op.outputs[:]
   950     _inputs_flat = _op.inputs

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords)
   531             if input_arg.type != types_pb2.DT_INVALID:
   532               raise TypeError("%s expected type of %s." %
--> 533                               (prefix, dtypes.as_dtype(input_arg.type).name))
   534             else:
   535               # Update the maps with the default, if needed.

TypeError: Input 'contents' of 'DecodeJpeg' Op has type float32 that does not match expected type of string.

0 个答案:

没有答案