2017-12-17 6 views
0

Ich versuche, ein Modell der 3-Schicht dichtes neurales Netzwerk mit Keras mit einem GPU-fähigen Tensorflow-Backend zu trainieren.Keras Fehler in der dichten Schicht, erwartet 4 Dimensionen Array mit Form (1024,2)

Der Datensatz, den ich habe, ist 4 Millionen 20x40px Bilder, die ich in Verzeichnisse mit dem Namen der Kategorie, die sie gehören, platziert.

Aufgrund der großen Datenmenge kann ich es nicht einfach in den Arbeitsspeicher laden und es meinem Modell zuführen, also dachte ich mit Keras's ImageDataGenerator, speziell die Funktion flow_from_directory() würde den Trick machen. Dies ergibt ein Tupel von (x, y), wobei x das numpy-Array des Bildes und y das Label des Bildes ist.

Ich erwartete, dass das Modell auf das numpy Array zugreifen kann, das als Eingabe für mein Modell angegeben werden soll. Daher habe ich meine Eingabeform wie folgt konfiguriert: (Keine, 20,40,3) wobei None die Losgröße 20 und ist 40 sind die Größe des Bildes und 3 sind die Anzahl der Kanäle im Bild. Das funktioniert nicht, aber wie, wenn ich versuche mein Modell zu trainieren, ich halte den Fehler bekommen: Valueerror: Fehler beim Ziel Überprüfung: erwarteten dense_3 4 Dimensionen haben, bekam aber Array mit Form (1024, 2)

Ich weiß, die Ursache ist, dass das Tupel von flow_from_directoy kommt und ich denke, dass ich die Eingabeform anpassen kann, aber ich befürchte, dass dies mein Modell nutzlos machen würde, da ich Bilder verwenden werde, um Vorhersagen zu treffen, die nicht vorkategorisiert sind Tupel. Meine Frage ist also, wie kann ich flow_from_directory erhalten, um das Bild an mein Modell zu füttern und nur das Tupel zu verwenden, um das Training zu validieren? Versteh ich hier etwas falsch?

Als Referenz hier ist mein Code:

from keras.models import Model 
from keras.layers import * 
from keras.preprocessing.image import ImageDataGenerator 
from keras.callbacks import TensorBoard 

# Prepare the Image Data Generator. 
train_datagen = ImageDataGenerator() 
test_datagen = ImageDataGenerator() 

train_generator = train_datagen.flow_from_directory(
    '/path/to/train_data/', 
    target_size=(20, 40), 
    batch_size=1024, 
) 

test_generator = test_datagen.flow_from_directory(
    '/path/to/test_data/', 
    target_size=(20, 40), 
    batch_size=1024, 
) 

# Define input tensor. 
input_t = Input(shape=(20,40,3)) 

# Now create the layers and pass the input tensor to it. 
hidden_1 = Dense(units=32, activation='relu')(input_t) 
hidden_2 = Dense(units=16)(hidden_1) 
prediction = Dense(units=1)(hidden_2) 

# Now put it all together and create the model. 
model = Model(inputs=input_t, outputs=prediction) 
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) 

# Prepare Tensorboard callback and start training. 
tensorboard = TensorBoard(log_dir='./graph', histogram_freq=0, write_graph=True, write_images=True) 
print(test_generator) 
model.fit_generator(
    train_generator, 
    steps_per_epoch=2000, 
    epochs=100, 
    validation_data=test_generator, 
    validation_steps=800, 
    callbacks=[tensorboard] 
) 

# Save trained model. 
model.save('trained_model.h5') 

Antwort

1

Ihre Eingabe Form ist falsch für dichte Schichten.

Dichte Schichten erwarten Eingaben in der Form (Keine, Länge).

müssen Sie entweder Ihre Eingaben neu zu gestalten, so dass sie Vektoren werden:

imageBatch=imageBatch.reshape((imageBatch.shape[0],20*40*3)) 

Oder verwenden Faltungsschichten, erwarten, dass diese Art von Eingabeform (None, nRows, ncols, nChannels) wie in Tensorfluss.

Verwandte Themen