Добавление пользовательского слоя преобразования base64-строки в существующую модель Keras - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь настроить модель, которую я ранее обучил, для классификации изображений таким образом, чтобы она принимала изображения в виде строк base64 (вместо массива NumPy), преобразовывала их в массив NumPy и затем выполняла прогнозирование. Как добавить слой поверх моего обычного входного слоя, который принимает строки и выводит массив NumPy?

Итак, я уже предварительно обучил модель, которая предсказывает изображения на основе архитектуры ResNet. Посмотрев на этот и этот ответ, я пытаюсь создать лямбда-слой, который преобразует строки в изображения 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 имеют тип float32, который не соответствует ожидаемому типу строки.

Мое понимание этого состоит в том, что 'image' в слое Lambda, который использует decode_jpeg(), является float32 вместо строки, что мне кажется странным, так как я установил dtype как для заполнителя, так и для Входной слой в tf.string.

Я искал во всем стеке поток, но не могу найти решение этой ошибки. Похоже, этот вопрос также не смог найти решение для этой конкретной проблемы.

EDIT 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...