TypeError: float() argument musí byť reťazec alebo počet, nie 'BatchDataset", ak údaje zvyšoval pomocou fit_generator()

0

Otázka

Som mať problémy s uplatnením Údaje Augmentácia pri výcviku modelu. Konkrétne o použitie fit_generator() metóda.

Ja som pôvodne spustiť môj model úspešne bez pier pomocou fit() metóda, avšak podľa iných je odporúčaná používať fit_generator(). Vyzerá to, že obe metódy je potrebné rovnaké vstupné keď príde na obrázky a nálepky, ale ja som dostať nasledujúce CHYBOVÉ keď beží kód uvedený nižšie:

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

Mám ukončené google sa snaží opraviť TypeError: float() argument musí byť reťazec alebo počet, nie 'BatchDataset' chyba, ale bezvýsledne. Má niekto návrhy, ako sa pohybovať vpred?

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)

Ďakujeme, že ste si pri pohľade na môj príspevok! :)

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

Najlepšiu odpoveď

0

Po prvé, článku si uvedené je 3 roky a je trochu zastarané. Od tensorflow 2.1.0, na .fit metóda prijíma generátory príliš, a v súčasnosti je plne nahradené .fit_generator. Navrhujem, aby ste sa aktualizovať vaše tensorflow ak je to možné.

Po druhé, chyba sa zdá byť nie v fit_generator metóda, ale v tom, ako si definovať súbory dát. Oni len prvým názvom v fit_generator, a to je dôvod, prečo chybové hlásenie stopových späť tam.

Ako chyby sám, nechápem, časť hniezdenie generátory, a myslím, že to môže spôsobiť problémy tu. Snažíte prejsť spracúvať v dávkach dataset dostal od tf.keras.doc.image_dataset_from_directory do iného generátor, ktorý sa zdá byť nemožné.

Ak som pochopil správne, budete mať len jeden štítok na každý obrázok a obrázky z každej triedy sú uložené v samostatných priečinkoch, tak odporúčam vám použiť flow_from_directory metódy tf.keras.predspracovanie.obraz.ImageDataGenerator priamo. Tento generátor budú čítať a umocniť obrázky, takže môžete navštíviť na tf.keras.doc.image_dataset_from_directory časť.

Ak chcete použiť tento generátor, musíte mať obrázky vo forme:

  • root_directory
    • class1 zložky
    • class2 zložky
    • atď

a váš kód bude niečo ako 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 prejsť "validation_split" argument príliš získať samostatné súbory dát pre odbornú prípravu a overenie. Prečítajte si viac o ImageDataGenerator a flow_from_directory metóda v oficiálnej dokumentácii.

2021-11-19 18:51:15

V iných jazykoch

Táto stránka je v iných jazykoch

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