TypeError: float() argumento deve ser uma cadeia de caracteres ou um número, não 'BatchDataset' quando os dados aumentando usando fit_generator()

0

Pergunta

Estou a ter problemas com a aplicação de Dados de Aumento, quando o treinamento do modelo. Especificamente sobre o uso do fit_generator() método.

Eu tenho originalmente executar o meu modelo com sucesso, sem o aumento, usando o ajuste() método, no entanto, de acordo com os outros é recomendado para uso fit_generator(). Parece que ambos os métodos têm as mesmas de entrada quando se trata de imagens e rótulos, mas estou recebendo o seguinte ERRO ao executar o código abaixo:

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

Eu ter concluído o google na tentativa de corrigir o TypeError: float() argumento deve ser uma cadeia de caracteres ou um número, não 'BatchDataset' erro, mas sem sucesso. Alguém tem sugestões de como avançar?

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)

Obrigado por ver o meu post! :)

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

Melhor resposta

0

Primeiro, o artigo que você se refere é de 3 anos de idade e é um pouco desatualizado. Começando a partir de tensorflow 2.1.0, o .ajuste o método aceita geradores também, e , atualmente, é totalmente substituído .fit_generator. Eu sugiro que você atualize o seu tensorflow se possível.

Segundo, o erro parece não ser na fit_generator método, mas na maneira como você define os conjuntos de dados. Eles simplesmente chamado pela primeira vez no fit_generator, e é por isso que a mensagem de erro de rastreamento lá atrás.

Como o próprio erro, eu não entendo a parte de aninhamento os geradores, e eu acho que ele pode causar problemas aqui. Você está tentando passar em lote de conjunto de dados obtido a partir de tf.keras.utils.image_dataset_from_directory para outro gerador, o que parece ser impossível.

Se eu entendi corretamente, você só tem uma etiqueta em cada imagem, e as imagens de cada classe são armazenados em pastas separadas, então eu sugiro que você use o flow_from_directory método de tf.keras.pré-processamento.imagem.ImageDataGenerator diretamente. Este gerador de leitura e aumentar as imagens, então você pode soltar o tf.keras.utils.image_dataset_from_directory parte.

Para usar esse gerador, você precisa ter as imagens no formulário:

  • root_directory
    • aula1 pasta
    • aula2 pasta
    • etc

e seu código será algo como isto:

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

Você pode passar "validation_split" argumento também para obter separar conjuntos de dados para treinamento e validação. Leia mais sobre o ImageDataGenerator e flow_from_directory método na documentação oficial.

2021-11-19 18:51:15

Em outros idiomas

Esta página está em outros idiomas

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