TypeError: float() bağımsız değişkeni, fit_generator()kullanarak veri artırırken 'BatchDataset' değil, bir dize veya sayı olmalıdır

0

Soru

Modeli eğitirken Veri Büyütme uygulamasıyla ilgili sorunlar yaşıyorum. Özellikle fit_generator() yönteminin kullanımı hakkında.

Başlangıçta modelimi fıt() yöntemini kullanarak büyütme olmadan başarılı bir şekilde çalıştırdım, ancak diğerlerine göre fıt_generator () kullanılması önerilir. Görüntüler ve etiketler söz konusu olduğunda her iki yöntemin de aynı girdiye ihtiyacı var gibi görünüyor, ancak aşağıdaki kodu çalıştırırken aşağıdaki hatayı alıyorum:

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

TypeError: float() argümanını düzeltmeye çalışırken google'ı tamamladım, 'BatchDataset' hatası değil, bir dize veya sayı olmalı, ancak boşuna. İlerlemek için önerisi olan var mı?

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)

Yazıma baktığınız için teşekkür ederim! :)

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

En iyi cevabı

0

İlk olarak, bahsettiğiniz makale 3 yaşında ve biraz modası geçmiş. Tensorflow 2.1.0'dan başlayarak .fıt yöntemi jeneratörleri de kabul eder ve şu anda tamamen değiştirilir .fıt_generator. Mümkünse tensorflow'unuzu güncellemenizi öneririm.

İkincisi, hata fıt_generator yönteminde değil, veri kümelerini tanımlama şeklinizde görünüyor. İlk önce fit_generator'ı aradılar ve bu yüzden hata mesajı sizi oraya kadar takip ediyor.

Hatanın kendisi itibariyle, jeneratörlerin iç içe geçme kısmını anlamıyorum ve burada sorunlara neden olabileceğini düşünüyorum. Tf'den alınan toplu veri kümesini aktarmaya çalışıyorsunuz.keras.iye'ler.ımage_dataset_from_directory imkansız gibi görünen başka bir jeneratöre.

Eğer ben doğru anladım, sen sadece bir etiket üzerinde her resim ve görüntüler her sınıf saklanır ayrı klasörler, ben önermek için kullanım flow_from_directory yöntemi tf.keras.ön işleme.görüntü.ImageDataGenerator doğrudan. Bu jeneratör hem görüntüleri okuyacak hem de artıracak, böylece tf'yi bırakabilirsiniz.keras.iye'ler.ımage_dataset_from_dırectory kısmı.

Bu jeneratörü kullanmak için, formda görüntülere sahip olmanız gerekir:

  • root_directory
    • class1 klasörü
    • class2 klasörü
    • vb

ve kodunuz böyle bir şey olacak:

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

Eğitim ve doğrulama için ayrı veri kümeleri elde etmek için "validation_split" argümanını da iletebilirsiniz. Resmi belgelerde ImageDataGenerator ve flow_from_directory yöntemi hakkında daha fazla bilgi edinin.

2021-11-19 18:51:15

Diğer dillerde

Bu sayfa diğer dillerde

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