TypeError: float() argument trebuie să fie un șir de caractere sau un număr, nu 'BatchDataset' atunci când datele augmentarea folosind fit_generator()

0

Problema

Am probleme cu aplicarea Date Sanilor, atunci când de formare cu model. În special cu privire la utilizarea de fit_generator() metodă.

Am rula inițial modelul meu de succes, fără a sanilor folosind fit() metodă, cu toate acestea, potrivit altora , este recomandat să utilizați fit_generator(). Se pare ca ambele metode au nevoie de aceleași date de intrare, atunci când vine vorba de imagini și etichete, dar primesc următoarea EROARE când executați codul de mai jos:

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

Am terminat google în încercarea de a stabili TypeError: float() argument trebuie să fie un șir de caractere sau un număr, nu 'BatchDataset' eroare, dar fără nici un rezultat. Are cineva sugestii cum să avanseze?

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)

Vă mulțumesc pentru uita la postul meu! :)

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

Cel mai bun răspuns

0

În primul rând, articolul v-ați referit este de 3 ani și este un pic învechit. Pornind de la tensorflow 2.1.0, la .se potrivesc metodă acceptă generatoare de asemenea, și în prezent este complet înlocuit .fit_generator. Vă sugerez să vă actualizați tensorflow dacă este posibil.

În al doilea rând, eroare pare să nu fie în fit_generator metodă, dar în modul în care definesc seturi de date. Au chemat în prima fit_generator, și de aceea, mesajul de eroare pe urmă te-ai întors acolo.

Ca din eroare în sine, eu nu înțeleg o parte din cuiburi generatoarele, și cred că aceasta poate provoca probleme aici. Sunteți încercarea de a trece de loturi de date primit de la tf.keras.utils.image_dataset_from_directory la un alt generator, care pare a fi imposibil.

Dacă am înțeles corect, ai doar o etichetă pe fiecare imagine, și imagini din fiecare clasă sunt stocate în foldere separate, așa că am sugerăm să utilizați flow_from_directory metoda de tf.keras.preprocesare.imagine.ImageDataGenerator direct. Acest generator va fi atât citi și de a spori imagini, astfel încât să puteți picătură tf.keras.utils.image_dataset_from_directory parte.

Pentru a utiliza acest generator, aveți nevoie pentru a avea imagini în forma:

  • root_directory
    • class1 folder
    • class2 folder
    • etc

și codul tău va fi ceva de genul:

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

Puteți trece "validation_split" argument prea pentru a obține separat seturile de date de formare și de validare. Citeste mai multe despre ImageDataGenerator și flow_from_directory metodă în documentația oficială.

2021-11-19 18:51:15

În alte limbi

Această pagină este în alte limbi

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