2017-07-16 6 views
2

Ich versuche flow_from_directory zu verwenden, um mein Modell zu trainieren. Der Verlust, den ich verwende, ist binary_crossentropy, der den Aufruf der to_categorical-Funktion auf den Y_train Daten erfordert. Ich weiß nicht, wie das zu tun für flow_from_directory, und das Programm wird den folgenden Fehler zu werfen:Keras: Verwenden von `crossentropy` Verlust in` flow_from_directory`

Traceback (most recent call last): 
    File "vgg16-sim-conn-rmsprop-2-main.py", line 316, in <module> 
    epochs=25 
    File "/home/yx96/anaconda2/lib/python2.7/site-packages/keras/legacy/interfaces.py", line 8 
8, in wrapper 
    return func(*args, **kwargs) 
    File "/home/yx96/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 187 
6, in fit_generator 
    class_weight=class_weight) 
    File "/home/yx96/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 161 
4, in train_on_batch 
    check_batch_axis=True) 
    File "/home/yx96/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 129 
9, in _standardize_user_data 
    exception_prefix='model target') 
    File "/home/yx96/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 133 
, in _standardize_input_data 
    str(array.shape)) 
ValueError: Error when checking model target: expected predictions to have shape (None, 2) b 
ut got array with shape (100, 1) 

Der Datengenerator ich verwende ist:

train_datagen = ImageDataGenerator(
    featurewise_center=True, 
    horizontal_flip=True, 
    zoom_range=0.2, 
    data_format="channels_last" 
) 

train_generator = train_datagen.flow_from_directory(
    './train', 
    target_size=(224, 224), 
    batch_size=100, 
    class_mode='binary' 
) 

Und die fit_generator ist:

model.fit_generator(
    train_generator, 
    steps_per_epoch=2500, 
    epochs=25 
) 

Antwort

1

Wenn Sie binary_crossentropy für den Verlust verwenden, haben Sie richtig gesetzt class_mode='binary'.

Wo Sie wahrscheinlich fehlgeschlagen sind, und dies wird nicht in Ihrem Beitrag angezeigt, weil Sie uns das Modell nicht gezeigt haben, ist auf der letzten Ebene Ihres Modells.

Sie haben wahrscheinlich eine Dense(2, activation='softmax'). Dies ist die "One-Hot" oder kategorische Crossentropy-Version. Wenn Sie binär arbeiten möchten, können Sie nur dann ausgegeben, ein Wert, der zwischen 0 sein wird und 1. Sie tun es wie folgt aus:

Dense(1, activation = 'sigmoid') 

Ich hoffe, das Ihr Problem :-)

+0

löst Also, wenn ich will "kategorische" Crossentropie, statt binär, für, sagen wir, 10 Klassen, dann verwende ich noch 'Dichte (1, Aktivierung = 'Sigmoid')' oder 'Dichte (Klassen, Aktivierung = 'Softmax')'? – Prabaha

+1

dann verwenden Sie Dense (10, Aktivierung = 'Softmax')! Wenn Sie kategorisch arbeiten, ist jedes Ausgabe-Neuron eine Klasse, die Softmax macht die Ausgabe normalisiert, so dass die Summe aller Neuronen 1 ist, idealerweise erhalten Sie etwas wie [0, 0, 1, 0, 0, 0, 0 , 0, 0, 0], aber höchstwahrscheinlich: [0.1, 0.2, 0, 0.05, 0.1, 0.05, 0.00, 0, 0.5] und sagt Ihnen, welche die wahrscheinlichste Klasse ist. –

Verwandte Themen