TypeError: float() argomento deve essere una stringa o un numero, non e 'BatchDataset' quando i dati aumentando utilizzando fit_generator()

0

Domanda

Sto avendo problemi con l'applicazione di Dati di Aumento quando il modello di formazione. In particolare sull'uso del fit_generator() metodo.

Ho originariamente eseguito il mio modello con successo senza aumento utilizza il fit() metodo, tuttavia, secondo altri, si raccomanda di utilizzare fit_generator(). Sembra che entrambi i metodi hanno bisogno lo stesso di ingresso quando si tratta di immagini ed etichette, ma ottengo il seguente ERRORE quando si esegue il codice riportato di seguito:

---------------------------------------------------------------------------
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'

Ho completato google nel tentativo di risolvere il TypeError: float() argomento deve essere una stringa o un numero, non e 'BatchDataset' errore, ma senza alcun risultato. Qualcuno ha suggerimenti per andare avanti?

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)

Grazie per guardare il mio post! :)

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

Migliore risposta

0

Primo, l'articolo a cui si fa riferimento è di 3 anni ed è un po ' obsolete. A partire dal tensorflow 2.1.0, l' .fit metodo accetta generatori di troppo, e attualmente è completamente sostituito .fit_generator. Ti consiglio di aggiornare il tuo tensorflow se possibile.

Secondo, l'errore sembra di non essere nella fit_generator metodo, ma nel modo in cui si definisce il set di dati. Hanno appena chiamato la prima volta in fit_generator, e per questo motivo il messaggio di errore di traccia la schiena.

Come lo stesso errore, non riesco a capire la parte di nidificazione generatori, e penso che possa causare problemi qui. Si sta cercando di passare in batch dataset ottenuto dal tf.keras.utils.image_dataset_from_directory ad un altro generatore, che sembra essere impossibile.

Se ho capito bene, hai solo una etichetta su ogni immagine e le immagini di ciascuna classe sono memorizzati in cartelle separate, quindi ti suggerisco di utilizzare il flow_from_directory metodo di tf.keras.pre-elaborazione.immagine.ImageDataGenerator direttamente. Questo generatore di lettura e di aumentare le immagini, in modo che è possibile eliminare il tf.keras.utils.image_dataset_from_directory parte.

Per utilizzare questo generatore, è necessario disporre di immagini in forma:

  • root_directory
    • class1 cartella
    • class2 cartella
    • ecc

e il vostro codice sarà qualcosa di simile a questo:

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, ...)

Si può passare "validation_split" argomento è troppo per ottenere un set di dati separato per la formazione e la validazione. Leggi di più su ImageDataGenerator e flow_from_directory metodo nella documentazione ufficiale.

2021-11-19 18:51:15

In altre lingue

Questa pagina è in altre lingue

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