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)
как было предложено в другом месте, но это не имело значения.