Недавно я ввел изменение размера изображения и случайный поворот в свой загрузчик данных изображения. При попытке обучить CNN выдает следующее сообщение об ошибке:
File "/home/kit/ifgg/mp3890/LeleNet/py3/LeleNet_trn.py", line 467, in
load_image_train * input_image = tf.image.resize_with_pad(input_image,
imgr * scaling, imgc * scaling)
TypeError: Input 'y' of 'Sub' Op has type int32 that does not match type float32 of argument 'x'.
Минимальный воспроизводимый пример:
imgc, imgr = 256, 256
import tensorflow as tf
img_path = "C:/Users/Manuel/Desktop/B1_6_000300000000_X.png" # see image url below
scaling = ((tf.random.uniform(()) * 0.2) + 0.8)
image = tf.io.read_file(img_path)
image = tf.image.decode_png(image, channels = 3)
input_image = tf.image.resize_with_pad(image, \
target_height = imgr * scaling, \
target_width = imgc * scaling, \
method = "lanczos3")
Пример изображения: Скачать пример изображения (118 КБ)
imgr
и imgc
— это соответствующее количество строк и столбцов (высота и ширина в пикселях) исходного обучающего изображения и количество строк и столбцов ожидаемых входных данных для обучения модели.
Что такое «x» и «y» в случае приведенного выше сообщения об ошибке (воспроизведение его вне сеанса обучения модели, сообщение об ошибке, которое я получаю, похоже, но в немного другой формулировке)? Я предполагаю, что функция изменения размера принимает изображение и некоторые аргументы (высота, ширина, которые являются числовыми, но не связаны с типом данных изображения)?
Что вызывает эту ошибку и как я могу решить проблему?
Вот пример, который ближе к моему реальному сценарию, но дает ту же ошибку:
imgc, imgr = 256, 256
import tensorflow as tf
img_path = "C:/Users/Manuel/Desktop/B1_6_000300000000_X.png" # see image url
scaling = ((tf.random.uniform(()) * 0.2) + 0.8)
image = tf.io.read_file(img_path)
image = tf.image.decode_png(image, channels = 3)
input_image = tf.cast(image, tf.float32) / 255.0
input_image = tf.image.resize_with_pad(input_image, \
target_height = imgr * scaling, \
target_width = imgc * scaling, \
method = "lanczos3")
InvalidArgumentError: cannot compute Sub as input #1(zero-based) was expected to be a float tensor but is a int32 tensor [Op:Sub]
Я немного озадачен, откуда Tensorflow получает тензор int32? По крайней мере, в последнем примере изображение меняется на tf.float32
со значениями в [0, 1](?)
Перефразировал вопрос. В основном речь идет о том, что функция resize_with_pad
ожидает на входе. К сожалению, я считаю документацию Tensorflow очень минималистичной.
Неважно, тензор int32 появился из аргументов ширины и высоты. Проблема может быть решена с помощью
target_height = int(tf.math.round(imgr * scaling))
и аналогично по ширине.
Пожалуйста, предоставьте минимальный воспроизводимый код, чтобы вызвать ошибку. Включая образец
datapoint
,imgr
иimgc
.