TypeError: float() argument musí být řetězec nebo číslo, ne BatchDataset', když data rozšiřovat pomocí fit_generator()

0

Otázka

Mám problémy s použitím Dat Prsou při školení modelu. Konkrétně o použití fit_generator() metoda.

Já jsem původně běžet můj model úspěšně bez prsou pomocí fit() metoda, nicméně podle jiné je doporučeno používat fit_generator(). Zdá se, jako by obě metody potřebují stejné vstupní když přijde na obrázky a popisky, ale já jsem dostat následující CHYBU při spuštění následující kód:

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

Dokončil jsem google se snaží opravit TypeError: float() argument musí být řetězec nebo číslo, ne BatchDataset' chyba, ale bezvýsledně. Máte někdo návrhy, jak se pohnout kupředu?

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)

Děkujeme vám za pohledu na můj příspěvek! :)

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

Nejlepší odpověď

0

První, článku jste zmínil, je 3 roky stará a je trochu zastaralý. Od tensorflow 2.1.0, .fit metoda přijímá generátory příliš, a v současné době jej plně nahrazuje .fit_generator. Doporučuji vám aktualizovat váš tensorflow pokud je to možné.

Za druhé, chyba se zdá být v fit_generator metoda, ale v způsob, jak definovat datové sady. Prostě nejprve zavolal fit_generator, a to je důvod, proč chybová zpráva trasování zpátky.

Jak samotná chyba, nechápu, v části vnoření generátorů, a myslím, že to může způsobit problémy. Snažíte se projít dávkovaný dataset dostal od tf.keras.utils.image_dataset_from_directory na další generátor, což se zdá být nemožné.

Pokud jsem to správně pochopil, máte pouze jeden štítek na každém snímku, a obrázky z každé třídy jsou uloženy v samostatných složkách, takže navrhuji, abyste používat flow_from_directory metoda tf.keras.předzpracování.obraz.ImageDataGenerator přímo. Tento generátor bude číst a rozšířit obrázků, takže můžete pokles tf.keras.utils.image_dataset_from_directory část.

Použít tento generátor, musíte mít obrázky ve formě:

  • root_directory
    • class1 složky
    • přednáška2 složky
    • atd

a váš kód bude něco jako toto:

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

Můžete projít "validation_split" argument pro samostatné datové soubory pro školení a validace. Přečtěte si více o ImageDataGenerator a flow_from_directory metodu v oficiální dokumentaci.

2021-11-19 18:51:15

V jiných jazycích

Tato stránka je v jiných jazycích

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