2016-03-26 12 views
1

Ich versuche, das folgende Netzwerk mit Keras zu betreiben, angetrieben von einem TensorFlow-Backend. Es ist eine Adaption des „VGG-like“ convnet von http://keras.io/examples/:Schwierigkeit bei der Anpassung von Keras Beispiel an Kundendaten

import os 
import sys 
import json 
import model_control 
from numpy import loadtxt, asarray 
from pandas import read_csv 
from scipy.ndimage import imread 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation, Flatten 
from keras.layers import Convolution2D, MaxPooling2D 
from keras.optimizers import SGD 

Y_train = loadtxt(model_control.y_train_file, delimiter=',', dtype = int) 

train_files = os.listdir(model_control.train_img_path) 
train_files = ['%s/%s' % (model_control.train_img_path, x) for x in train_files if 'jpg' in x] 
X_train = asarray([imread(x) for x in train_files]) 

X_train.shape #..(8144, 128, 256) (a numpy array of 8144 128x256 greyscale, i.e. single-channel, images) 
Y_train.shape #..(8144,) (A 1-d numpy array of integer class labels) 

model = Sequential() 

model.add(Convolution2D(32, 5, 5, border_mode='valid', input_shape=(1, 128, 256))) 
model.add(Activation('relu')) 
model.add(Convolution2D(32, 5, 5)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 

model.add(Convolution2D(64, 5, 5, border_mode='valid')) 
model.add(Activation('relu')) 
model.add(Convolution2D(64, 5, 5)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 

model.add(Flatten()) 
model.add(Dense(256)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 

model.add(Dense(10)) 
model.add(Activation('softmax')) 

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='categorical_crossentropy', optimizer=sgd) 

model.fit(X_train, Y_train, batch_size=32, nb_epoch=1, verbose=1) 

Das den Fehler produziert:

ValueError: Cannot feed value of shape (32, 128, 256) for Tensor u'Placeholder_89:0', which has shape '(?, 1, 128, 256)' 

Ich habe die folgenden Beiträge checkt, aber nicht in der Lage, diese zu lösen eins noch. Jede Hilfe wäre willkommen, zusammen mit einer Erklärung, was falsch läuft.

    https://groups.google.com/forum/#!topic/keras-users/Vb7MhSqne0Y http://stackoverflow.com/questions/33974231/tensorflow-error-using-my-own-data

UPDATE

diese Frage zu dem Thema Board Keras Posted (https://github.com/fchollet/keras/issues/2092). Es gibt Gist und sample data Links, mit denen Sie das Problem neu erstellen können.

Antwort

0

Gelöst es. In dem Skript wird die folgende Zeile benötigt, um „neu zu gestalten“, um die Eingabe-Array:

X_train = X_train.reshape(X_train.shape[0], 1, 128, 256)

Wirklich, alle sind wir hier tun, ist das Hinzufügen einer etwas redundante Kanalabmessung die Form des Arrays zu machen (8144, 1, 128, 256) statt von (8144, 128, 256). Wenn wir ein RGB-Array verwenden würden, wäre dies überhaupt nicht redundant, da es (8144, 3, 128, 256) wäre. Bottom line: In meinem Input-Array fehlte die Channel-Dimension, und ich dachte, ich könnte mit dem Weglassen von Graustufen davonkommen. Es stellt sich heraus, dass Sie die Form immer noch explizit definieren müssen.

Großes Paket. Nach der Korrektur sollte der Code unverändert ausgeführt werden.

Verwandte Themen