2016-11-13 5 views
1
import os 
from keras.preprocessing.image import ImageDataGenerator 
from keras.models import Sequential 
from keras.layers import Convolution2D, MaxPooling2D 
from keras.layers import Activation, Dropout, Flatten, Dense 

img_width, img_height = 64, 64 

train_data_dir = 'data/train' 
validation_data_dir = 'data/validation' 
nb_train_samples = sum([len(files) for files in os.walk(train_data_dir)]) 
nb_validation_samples = sum([len(files) for files in os.walk(validation_data_dir)]) 
nb_epoch = 10 


model = Sequential() 
model.add(Dense(4096, input_dim = 4096, init='normal', activation='relu')) 
model.add(Dense(4,init='normal',activation='softmax')) 
model.compile(loss='categorical_crossentropy', 
       optimizer='adam', 
       metrics=['accuracy']) 


train_datagen = ImageDataGenerator(
     rescale=1./255, 
     ) 


test_datagen = ImageDataGenerator(rescale=1./255) 

train_generator = train_datagen.flow_from_directory(
     train_data_dir, 
     color_mode="grayscale", 
     target_size=(img_width, img_height), 
     batch_size=1, 
     class_mode=None) 

validation_generator = test_datagen.flow_from_directory(
     validation_data_dir, 
     color_mode="grayscale", 
     target_size=(img_width, img_height), 
     batch_size=1, 
     class_mode=None) 

model.fit_generator(
     train_generator, 
     samples_per_epoch=nb_train_samples, 
     nb_epoch=nb_epoch, 
     validation_data=validation_generator, 
     nb_val_samples=nb_validation_samples) 

Alles läuft gut bis der model.fit_generator() in der Codierung oben. Dann kommen Fehler wie die folgenden heraus.model.fit_generator() Formfehler

Traceback (most recent call last): 
    File "C:/Users/Sam/PycharmProjects/MLP/Testing Code without CNN.py", line 55, in <module> 
    nb_val_samples=nb_validation_samples) 
    File "C:\Python27\lib\site-packages\keras\models.py", line 874, in fit_generator 
    pickle_safe=pickle_safe) 
    File "C:\Python27\lib\site-packages\keras\engine\training.py", line 1427, in fit_generator 
    'or (x, y). Found: ' + str(generator_output)) 
Exception: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: [[[[ 0.19215688] 
+1

Was soll dieser Code tun? Könnten Sie Beispiele geben? –

Antwort

0

Ich bin nicht 100% sicher, was Sie versuchen zu erreichen, aber wenn Sie eine binäre Klassifizierung von Bildern versuchen, versuchen class_mode-binary Einstellung. Von der documentation:

class_mode: eine der "kategorischen", "binären", "spärlich" oder keine. Standard: "kategorisch". Bestimmt den Typ der zurückgegebenen Label-Arrays: "kategorial" sind 2D-codierte Beschriftungen, "binär" ist 1D binäre Beschriftungen, "spärlich" wird 1D-Integer-Beschriftungen sein.

Die Fehlermeldung ist ein bisschen verwirrend, aber wenn man sich die source code aussehen, es wird klarer:

if not hasattr(generator_output, '__len__'): 
        _stop.set() 
        raise Exception('output of generator should be a tuple ' 
            '(x, y, sample_weight) ' 
            'or (x, y). Found: ' + str(generator_output)) 
+0

Danke für die Antwort! Ich versuche, Bilder nach den Unterordnern in den Zug- und Validierungsordnern zu kategorisieren und es hat insgesamt 4 Unterordner. Ich habe versucht, class_mode von None, kategorial und binär zu verwenden. None gibt den obigen Fehler, während categorical diesen Fehler angibt. >> Ausnahme: Fehler beim Prüfen der Modelleingabe: erwartetes dichte_Eingang_1 hat 2 Dimensionen, aber ein Array mit Form (1L, 64L, 64L, 1L) Irgendeine Idee, wie man es löst? – Weij

1

Das Problem von Datendimension Mismatch verursacht werden sollten. ImageDataGenerator lädt tatsächlich Bilddateien und fügt sie in ein numpliges Array in Form von (num_image_channel, image_height, image_width) ein. Ihre erste Schicht ist jedoch eine dicht verbundene Schicht, die nach Eingangsdaten in Form eines 1D-Arrays oder eines 2D-Arrays mit einer Anzahl von Samples sucht. Sie verpassen also Ihre Eingabeebene, die die Eingabe in die richtige Form bringt.

Ändern Sie die folgende Codezeile

model.add(Dense(4096, input_dim = 4096, init='normal', activation='relu')) 

zu

model.add(Reshape((img_width*img_height*img_channel), input_shape=(img_channel, img_height, img_width))) 
model.add(Dense(4096, init='normal', activation='relu')) 

Sie haben img_channel, zu definieren, welche die Anzahl der Kanäle in Ihren Bildern. Der obige Code geht auch davon aus, dass Sie dim_ordering von th verwenden. Wenn Sie tf Eingangs Dimension Bestellung verwenden, würden Sie die Eingabe reshape Schicht

model.add(Reshape((img_width*img_height*img_channel), input_shape=(img_height, img_width, img_channel))) 

--- Alte Antwort ändern müssen -

Sie wahrscheinlich Trainingsdaten und Validierungsdaten in Unterordner setzen unter train und validation, die nicht von Keras unterstützt wird. Alle Trainingsdaten sollten sich in einem einzigen Ordner befinden, der für die Validierungsdaten identisch ist.

Weitere Informationen finden Sie unter this Keras tutorial.

+0

Die [Dokumentation] (https://keras.io/preprocessing/image/) verwendet dieselbe Verzeichnisstruktur wie in dem in der Frage angegebenen Code. –

+0

Diese beiden Codezeilen können problematisch sein. 'nb_train_samples = sum ([len (Dateien) für Dateien in os.walk (train_data_dir)]) nb_validation_samples = sum ([len (Dateien) für Dateien in os.walk (validation_data_dir)]) ' Das OP muss die Ausgabe überprüfen. – pyan

+0

Denke nicht, dass dies ein Problem sein sollte, es gibt nur eine Ganzzahl zurück. –

Verwandte Themen