ValueError: не удалось преобразовать массив NumPy в тензор (неподдерживаемый тип объекта с плавающей запятой). Использование ImageDataGenerator()

Я пытаюсь построить модель ИИ с помощью TensorFlow. Я создал набор данных, используя функцию ImageDataGenerator() и метод .flow_from_dataframe(). Это работает плавно и возвращает изображения. Однако, когда я использую этот генератор данных в качестве входных данных для модели, я получаю сообщение об ошибке

«ValueError: не удалось преобразовать массив NumPy в тензор (неподдерживаемый тип объекта с плавающей запятой)».

Я использую TensorFlow версии 2.9.1 и Keras версии 2.9.0.

Код ниже:

      import tensorflow as tf

from keras_preprocessing.image import ImageDataGenerator
from tensorflow.keras import regularizers, optimizers

train_amount = (0,int(len(df)*0.8))
test_amount = (int(len(df)*0.8),int((len(df)*0.8)+(len(df)*0.1)))
val_amount = (int(len(df)*0.9))

datagen=ImageDataGenerator(rescale=1./255.,
                           width_shift_range=[-50,50],
                           height_shift_range=[-50,50],
                           horizontal_flip=True,
                           rotation_range=90,
                           brightness_range=[0.2,1.0],
                           zoom_range=[0.5,1.0])

test_datagen=ImageDataGenerator(rescale=1./255.)

train_generator=datagen.flow_from_dataframe(
dataframe=df[train_amount[0]:train_amount[1]],
directory=r"file_path",
x_col="filename",
y_col=columns_y,
batch_size=32,
seed=42,
shuffle=True,
class_mode="raw",
target_size=(224,224))

valid_generator=test_datagen.flow_from_dataframe(
dataframe=df[test_amount[0]:test_amount[1]],
directory=r"file_path",
x_col="filename",
y_col=columns_y,
batch_size=32,
seed=42,
shuffle=True,
class_mode="raw",
target_size=(224,224))

test_generator=test_datagen.flow_from_dataframe(
dataframe=df[val_amount::],
directory=r"file_path",
x_col="filename",
y_col=columns_y,
batch_size=1,
seed=42,
shuffle=False,
class_mode=None,
target_size=(224,224))

model = ResNet50V2(
    include_top=True,
    weights=None,
    input_tensor=None,
    input_shape=None,
    pooling=None,
    classes=len(columns_trimmed)
)

model.compile(optimizers.Adam(learning_rate=1e-5),loss="mean_squared_error",metrics=["accuracy"])

STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size
STEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size
STEP_SIZE_TEST=test_generator.n//test_generator.batch_size
history = model.fit(train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    validation_data=valid_generator,
                    validation_steps=STEP_SIZE_VALID,
                    epochs=100
)

Вывод кода

      ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [46], in <cell line: 4>()
      2 STEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size
      3 STEP_SIZE_TEST=test_generator.n//test_generator.batch_size
----> 4 history = model.fit(train_generator,
      5                     steps_per_epoch=STEP_SIZE_TRAIN,
      6                     validation_data=valid_generator,
      7                     validation_steps=STEP_SIZE_VALID,
      8                     epochs=5
      9 )

File ~\.conda\envs\env_name\lib\site-packages\keras\utils\traceback_utils.py:67, in filter_traceback.<locals>.error_handler(*args, **kwargs)
     65 except Exception as e:  # pylint: disable=broad-except
     66   filtered_tb = _process_traceback_frames(e.__traceback__)
---> 67   raise e.with_traceback(filtered_tb) from None
     68 finally:
     69   del filtered_tb

File ~\.conda\envs\env_name\lib\site-packages\tensorflow\python\framework\constant_op.py:102, in convert_to_eager_tensor(value, ctx, dtype)
    100     dtype = dtypes.as_dtype(dtype).as_datatype_enum
    101 ctx.ensure_initialized()
--> 102 return ops.EagerTensor(value, ctx.device_name, dtype)

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float).

Я попытался поставить это после генераторов:

      train_generator._targets = np.stack(train_generator._targets)
valid_generator._targets = np.stack(valid_generator._targets)

как было предложено в другом месте, но это не имело значения.

0 ответов

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