TypeError: float() argument doit être une chaîne de caractères ou un nombre, et non pas "BatchDataset' lorsque les données augmentant l'aide de fit_generator()

0

La question

Je suis ont des problèmes avec l'application de Données d'Augmentation lors de la formation du modèle. Spécifiquement sur l'utilisation de la fit_generator() méthode.

J'ai à l'origine de mon modèle avec succès, sans augmentation de l'aide de l' ajustement() la méthode, cependant, selon d'autres, il est recommandé d'utiliser fit_generator(). Il semble que les deux méthodes ont besoin de la même entrée quand il s'agit des images et des étiquettes, mais je suis arriver à la suite d'ERREUR lors de l'exécution du code ci-dessous:

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

J'ai terminé google en essayant de réparer l' erreur TypeError: float() argument doit être une chaîne de caractères ou un nombre, et non pas "BatchDataset' erreur, mais en vain. Quelqu'un aurait-il des suggestions pour aller de l'avant?

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)

Merci de regarder mon post! :)

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

La meilleure réponse

0

Tout d'abord, l'article que vous citez est de 3 ans et est un peu dépassé. À partir de tensorflow 2.1.0, l' .ajustement de la méthode accepte les générateurs de trop, et actuellement il est entièrement remplacé .fit_generator. Je vous suggère de mettre à jour votre tensorflow si possible.

Deuxièmement, l'erreur ne semble pas être dans le fit_generator méthode, mais dans la façon de définir les ensembles de données. Ils ont juste appelé la première fois dans fit_generator, et c'est pourquoi le message d'erreur oligo-vous là-bas.

De l'erreur elle-même, je ne comprends pas la partie de nidification, les générateurs, et je pense qu'il peut causer des problèmes ici. Vous êtes en essayant de passer par lot dataset obtenu à partir de tf.keras.utils.image_dataset_from_directory à un autre générateur, ce qui semble être impossible.

Si j'ai bien compris, vous n'avez qu'une étiquette sur chaque image, et les images de chaque classe sont stockés dans des dossiers séparés, donc je vous suggère d'utiliser le flow_from_directory méthode de tf.keras.prétraitement.image.ImageDataGenerator directement. Ce générateur sera à la fois de lire et d'accroître les images, de sorte que vous pouvez déposer le tf.keras.utils.image_dataset_from_directory partie.

Pour utiliser ce générateur, vous avez besoin d'avoir des images sous la forme:

  • root_directory
    • class1 dossier
    • class2 dossier
    • etc

et votre code sera quelque chose comme ceci:

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

Vous pouvez passer "validation_split" argument pour obtenir des ensembles de données distincts pour la formation et la validation. Lire plus sur le ImageDataGenerator et flow_from_directory méthode dans la documentation officielle.

2021-11-19 18:51:15

Dans d'autres langues

Cette page est dans d'autres langues

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