TypeError: float() argumento debe ser una cadena o un número, no 'BatchDataset' cuando los datos de aumentar el uso de fit_generator()

0

Pregunta

Estoy teniendo problemas con la aplicación de la Aumentación de Datos cuando el modelo de formación. Específicamente sobre el uso de la fit_generator() método.

He originalmente ejecutar mi modelo de éxito sin un aumento con el ajuste() método, sin embargo, según otros , se recomienda el uso de fit_generator(). Parece que ambos métodos tienen la misma entrada cuando se trata de imágenes y etiquetas, pero estoy recibiendo el siguiente ERROR cuando se ejecuta el siguiente código:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_35/139227558.py in <module>
    105 
    106 # train the network
--> 107 model.fit_generator(aug.flow(train_ds,  batch_size=batch_size),
    108         validation_data=val_ds, steps_per_epoch=len(train_ds[0]) // batch_size,
    109     epochs=epochs)

/opt/conda/lib/python3.7/site-packages/keras/preprocessing/image.py in flow(self, x, y, batch_size, shuffle, sample_weight, seed, save_to_dir, save_prefix, save_format, subset)
    894         save_prefix=save_prefix,
    895         save_format=save_format,
--> 896         subset=subset)
    897 
    898   def flow_from_directory(self,

/opt/conda/lib/python3.7/site-packages/keras/preprocessing/image.py in __init__(self, x, y, image_data_generator, batch_size, shuffle, sample_weight, seed, data_format, save_to_dir, save_prefix, save_format, subset, dtype)
    472         save_format=save_format,
    473         subset=subset,
--> 474         **kwargs)
    475 
    476 

/opt/conda/lib/python3.7/site-packages/keras_preprocessing/image/numpy_array_iterator.py in __init__(self, x, y, image_data_generator, batch_size, shuffle, sample_weight, seed, data_format, save_to_dir, save_prefix, save_format, subset, dtype)
    119                     y = y[split_idx:]
    120 
--> 121         self.x = np.asarray(x, dtype=self.dtype)
    122         self.x_misc = x_misc
    123         if self.x.ndim != 4:

/opt/conda/lib/python3.7/site-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
     81 
     82     """
---> 83     return array(a, dtype, copy=False, order=order)
     84 
     85 

TypeError: float() argument must be a string or a number, not 'BatchDataset'

He terminado de google para tratar de solucionar el TypeError: float() argumento debe ser una cadena o un número, no 'BatchDataset' error, pero fue en vano. ¿Alguien tiene sugerencias para avanzar?

import pathlib
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
import matplotlib.pyplot as plt

# Set data directory
data_dir = pathlib.Path("../input/validatedweaponsv6/images/")

# Set image size
img_height = 120
img_width = 120

# Hyperparameters
batch_size = 128
epochs = 50
learning_rate = 0.001

# Create the training dataset
train_ds = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    label_mode='categorical',
    validation_split=0.2,
    subset="training",
    shuffle=True,
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)

# Create the validation dataset
val_ds = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    label_mode='categorical',
    validation_split=0.2,
    subset="validation",
    shuffle=True,
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)

# Create sequential model
model = Sequential([

    # Preprocessing
    layers.Rescaling(1./127.5, offset=-1,
                     input_shape=(img_height, img_width, 3)),

    # Encoder
    layers.Conv2D(8, 3, activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(16, 3, activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(32, 3, activation='relu'),
    # layers.Conv2D(2, 3, activation='relu'), ???
    layers.Flatten(),

    # Decoder
    layers.Dense(64, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(2, activation='softmax')
])

# Print the model to see the different output shapes
print(model.summary())

# Compile model
model.compile(loss='categorical_crossentropy',
              optimizer=keras.optimizers.SGD(learning_rate=learning_rate), metrics=['accuracy'])

# construct the training image generator for data augmentation
aug = tf.keras.preprocessing.image.ImageDataGenerator(rotation_range=20, zoom_range=0.15,
    width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15,
    horizontal_flip=True, fill_mode="nearest")

# train the network
model.fit_generator(aug.flow(train_ds,  batch_size=batch_size),
validation_data=val_ds, steps_per_epoch=len(train_ds[0]) // batch_size,
epochs=epochs)

# Print scores
score = model.evaluate(train_ds, verbose=0)
print('Validation loss:', score[0])
print('Validation accuracy:', score[1])

# Show loss and accuracy models
show_history(history)

Gracias por mirar mi post!!! :)

deep-learning keras tensorflow
2021-11-19 13:25:05
1

Mejor respuesta

0

En primer lugar, el artículo se refiere es a los 3 años de edad y es un poco anticuado. A partir de tensorflow 2.1.0, el .ajuste método acepta generadores demasiado, y en la actualidad se ha sustituido completamente .fit_generator. Te sugiero que para la actualización de su tensorflow si es posible.

Segundo, el error parece no estar en el fit_generator método, sino en la manera de definir los conjuntos de datos. Simplemente llama en primer lugar fit_generator, y es por eso que el mensaje de error de seguimiento de vuelta allí.

Como el error en sí mismo, no entiendo la parte de anidación de los generadores, y creo que puede causar problemas aquí. Usted está tratando de pasar por lotes de conjunto de datos provenientes de las tf.keras.utils.image_dataset_from_directory otro generador, lo cual parece imposible.

Si he entendido correctamente, usted tiene sólo una etiqueta en cada imagen, y las imágenes de cada clase se almacenan en carpetas separadas, por lo que sugerimos que el uso de la flow_from_directory método de tf.keras.preprocesamiento.imagen.ImageDataGenerator directamente. Este generador de lectura y aumentar las imágenes, así que usted puede caer en el tf.keras.utils.image_dataset_from_directory parte.

El uso de este generador, debe tener imágenes en la forma:

  • root_directory
    • class1 carpeta
    • class2 carpeta
    • etc

y su código será algo como esto:

gen = tf.keras.preprocessing.image.ImageDataGenerator( #desired augmentation, ...) 
train_generator = gen.flow_from_directory(directory = root_directory,
target_size=(256, 256), classes= *list of class names*,
class_mode='categorical', batch_size=32, shuffle=True, ...)
model.fit(train_generator, ...)

Usted puede pasar "validation_split" argumento demasiado para conseguir separar los conjuntos de datos de entrenamiento y validación. Lea más acerca de la ImageDataGenerator y flow_from_directory método en la documentación oficial.

2021-11-19 18:51:15

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................