TensorFlow/Keras: почему я получаю «ValueError: несовместимое преобразование из float32 в uint8» при вызове fit?

Я использую TensorFlow 1.12 с нетерпеливым исполнением. Когда я звоню

model.fit(train, steps_per_epoch=int(np.ceil(num_train_samples / BATCH_SIZE)), epochs=NUM_EPOCHS, batch_size=BATCH_SIZE, validation_data=val, validation_steps=int(np.ceil(num_val_samples / BATCH_SIZE)))

Я получаю следующую ошибку:

ValueError: Incompatible type conversion requested to type 'uint8' for variable of type 'float32'

Насколько мне известно, я нигде не конвертирую uint8 в float32, по крайней мере, явно.

Мои наборы данных генерируются следующим образом:

train = tf.data.Dataset.from_generator(generator=train_sample_fetcher, output_types=(tf.uint8, tf.float32))
train = train.repeat()
train = train.batch(BATCH_SIZE)
train = train.shuffle(10)
val = tf.data.Dataset.from_generator(generator=val_sample_fetcher, output_types=(tf.uint8, tf.float32))

используя следующие функции генератора:

def train_sample_fetcher():
    return sample_fetcher()

def val_sample_fetcher():
    return sample_fetcher(is_validations=True)

def sample_fetcher(is_validations=False):
    sample_names = [filename[:-4] for filename in os.listdir(DIR_DATASET + "ndarrays/")]
    if not is_validations: sample_names = sample_names[:int(len(sample_names) * TRAIN_VAL_SPLIT)]
    else: sample_names = sample_names[int(len(sample_names) * TRAIN_VAL_SPLIT):]
    for sample_name in sample_names:
        rgb = tf.image.decode_jpeg(tf.read_file(DIR_DATASET + sample_name + ".jpg"))
        rgb = tf.image.resize_images(rgb, (HEIGHT, WIDTH))
        #d = tf.image.decode_jpeg(tf.read_file(DIR_DATASET + "depth/" + sample_name + ".jpg"))
        #d = tf.image.resize_images(d, (HEIGHT, WIDTH))
        #rgbd = tf.concat([rgb,d], axis=2)
        onehots = tf.convert_to_tensor(np.load(DIR_DATASET + "ndarrays/" + sample_name + ".npy"), dtype=tf.float32)
        yield rgb, onehots

---------------------------------------------------------------------------------

Для справки, полная трассировка стека:

Traceback (most recent call last):
  File "tensorflow/python/ops/gen_nn_ops.py", line 976, in conv2d
    "data_format", data_format, "dilations", dilations)
tensorflow.python.eager.core._FallbackException: Expecting int64_t value for attr strides, got numpy.int32

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "dir/to/my_script.py", line 100, in <module>
    history = model.fit(train, steps_per_epoch=int(np.ceil(num_train_samples / BATCH_SIZE)), epochs=NUM_EPOCHS, batch_size=BATCH_SIZE, validation_data=val, validation_steps=int(np.ceil(num_val_samples / BATCH_SIZE)))
  File "/tensorflow/python/keras/engine/training.py", line 1614, in fit
    validation_steps=validation_steps)
  File "/tensorflow/python/keras/engine/training_eager.py", line 705, in fit_loop
    batch_size=batch_size)
  File "/tensorflow/python/keras/engine/training_eager.py", line 251, in iterator_fit_loop
    model, x, y, sample_weights=sample_weights, training=True)
  File "/tensorflow/python/keras/engine/training_eager.py", line 511, in _process_single_batch
    training=training)
  File "/tensorflow/python/keras/engine/training_eager.py", line 90, in _model_loss
    outs, masks = model._call_and_compute_mask(inputs, **kwargs)
  File "/tensorflow/python/keras/engine/network.py", line 856, in _call_and_compute_mask
    mask=masks)
  File "/tensorflow/python/keras/engine/network.py", line 1029, in _run_internal_graph
    computed_tensor, **kwargs)
  File "/tensorflow/python/keras/engine/network.py", line 856, in _call_and_compute_mask
    mask=masks)
  File "/tensorflow/python/keras/engine/network.py", line 1031, in _run_internal_graph
    output_tensors = layer.call(computed_tensor, **kwargs)
  File "/tensorflow/python/keras/layers/convolutional.py", line 194, in call
    outputs = self._convolution_op(inputs, self.kernel)
  File "/tensorflow/python/ops/nn_ops.py", line 868, in __call__
    return self.conv_op(inp, filter)
  File "/tensorflow/python/ops/nn_ops.py", line 520, in __call__
    return self.call(inp, filter)
  File "/tensorflow/python/ops/nn_ops.py", line 204, in __call__
    name=self.name)
  File "/tensorflow/python/ops/gen_nn_ops.py", line 982, in conv2d
    name=name, ctx=_ctx)
  File "/tensorflow/python/ops/gen_nn_ops.py", line 1015, in conv2d_eager_fallback
    _attr_T, _inputs_T = _execute.args_to_matching_eager([input, filter], _ctx)
  File "/tensorflow/python/eager/execute.py", line 195, in args_to_matching_eager
    ret = [internal_convert_to_tensor(t, dtype, ctx=ctx) for t in l]
  File "/tensorflow/python/eager/execute.py", line 195, in <listcomp>
    ret = [internal_convert_to_tensor(t, dtype, ctx=ctx) for t in l]
  File "/tensorflow/python/framework/ops.py", line 1146, in internal_convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/tensorflow/python/ops/variables.py", line 828, in _TensorConversionFunction
    "of type '%s'" % (dtype.name, v.dtype.name))
ValueError: Incompatible type conversion requested to type 'uint8' for variable of type 'float32'

Первая выброшенная ошибка связана с NumPy ndarrays, но я конвертирую их в тензоры TensorFlow сразу после их импорта. Любые предложения очень ценятся! Я проверил все типы np.int32, но не смог их найти.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Результатом tf.image.resize_images является тензор типа float, и, следовательно, тензор rgb, возвращаемый из sample_fetcher(), является тензором типа float. Однако при вызове метода Dataset.from_generator() вы указываете тип вывода первого сгенерированного элемента как tf.uint8 (т. е. output_types=(tf.uint8, tf.float32)). Следовательно, необходимо выполнить преобразование, которое на самом деле не может быть выполнено. Измените его на tf.float32 (т. е. output_types=(tf.float32, tf.float32)) как для генераторов поездов, так и для генераторов проверки, и проблема будет решена.

Большое спасибо! Я не понимал, что изменение размера изображений изменит тип данных.

EmielBoss 28.05.2019 01:49

Другие вопросы по теме