1

Ich habe ein Multiklassen-Klassifizierung-Problem. Sagen wir, ich habe eine Feature-Matrix:Keras Faltung entlang einzelner Feature-Zeile

A B C D 
1 -1 1 -6 
2 0.5 0 11 
7 3.7 1 1 
4 -50 1 0 

und Labels:

LABEL 
0 
1 
2 
0 
2 

Ich versuche wollen Faltungskerne mit Keras entlang jeder einzelnen Feature Reihe anzuwenden. Sagen Sie nb_filter = 2 und batch_size = 3. Ich erwarte also, dass die Eingangsform für die Faltungsschicht (3, 4) und die Ausgangsform (3, 3) ist (wie es für AB, BC, CD angewendet wird).

Hier ist, was ich mit Keras versucht (v1.2.1, Theano Backend):

def CreateModel(input_dim, num_hidden_layers): 
    from keras.models import Sequential 
    from keras.layers import Dense, Dropout, Convolution1D, Flatten 

    model = Sequential() 
    model.add(Convolution1D(nb_filter=10, filter_length=1, input_shape=(1, input_dim), activation='relu')) 
    model.add(Dense(3, activation='softmax')) 
    model.compile(loss='categorical_crossentropy', optimizer='adam') 
    model.summary() 
    return model 

def OneHotTransformation(y): 
    from keras.utils import np_utils 
    return np_utils.to_categorical(y) 

X_train = X_train.values.reshape(X_train.shape[0], 1, X_train.shape[1]) 
X_test = X_test.values.reshape(X_test.shape[0], 1, X_test.shape[1]), 
y_train = OneHotTransformation(y_train) 

clf = KerasClassifier(build_fn=CreateModel, input_dim=X_train.shape[1], num_hidden_layers=1, nb_epoch=10, batch_size=500) 

clf.fit(X_train, y_train) 

Formen:

print X_train.shape 
print X_test.shape 
print y_train.shape 

Ausgang:

(45561, 44) 
(11391, 44) 
(45561L,) 

Wenn ich versuche, dies zu laufen Code bekomme ich und Ausnahme:

Ich versuchte y_train neu zu gestalten:

y_train = y_train.reshape(y_train.shape[0], 1, y_train.shape[1]) 

Das gibt mir Ausnahme:

ValueError: Error when checking model target: expected dense_1 to have 3 dimensions, but got array with shape (136683L, 2L) 
  1. Ist dieser Ansatz mit Convolution1D richtig, mein Ziel zu erreichen?
  2. Wenn # 1 ja ist, wie kann ich meinen Code reparieren?

Ich habe gelesen, bereits zahlreiche Github Fragen und einige Fragen (1, 2) hier, aber es nicht wirklich helfen.

Danke.

UPDATE1: Laut Matias Valdenegro Kommentar. Hier sind Formen nach 'X' Umformung und nach onehot Codierung für 'y':

print X_train.shape 
print X_test.shape 
print y_train.shape 

Ausgang:

(45561L, 1L, 44L) 
(11391L, 1L, 44L) 
(45561L, 3L) 

UPDATE2: Nochmals vielen Dank an Matias Valdenegro. Die X-Umformung erfolgt nach dem Erstellen des Modells, um sicher zu gehen, dass es sich um ein Problem beim Kopieren handelt. Der Code sollte wie folgt aussehen:

def CreateModel(input_dim, num_hidden_layers): 
    from keras.models import Sequential 
    from keras.layers import Dense, Dropout, Convolution1D, Flatten 

    model = Sequential() 
    model.add(Convolution1D(nb_filter=10, filter_length=1, input_shape=(1, input_dim), activation='relu')) 
    model.add(Dense(3, activation='softmax')) 
    model.compile(loss='categorical_crossentropy', optimizer='adam') 
    model.summary() 
    return model 

def OneHotTransformation(y): 
    from keras.utils import np_utils 
    return np_utils.to_categorical(y) 

clf = KerasClassifier(build_fn=CreateModel, input_dim=X_train.shape[1], num_hidden_layers=1, nb_epoch=10, batch_size=500) 

X_train = X_train.values.reshape(X_train.shape[0], 1, X_train.shape[1]) 
X_test = X_test.values.reshape(X_test.shape[0], 1, X_test.shape[1]), 
y_train = OneHotTransformation(y_train) 

clf.fit(X_train, y_train) 

Antwort

1

Die Eingabe in eine 1D Faltung sollte Dimensionen (num_samples, Kanäle, Breite). Das bedeutet, dass Sie X_train und X_test, nicht y_train umformen müssen:

X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1]) 
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1]) 
+0

Wie Sie in meiner Frage sehen können, habe ich versucht, ohne y_train umzuformen. Und es löst auch eine Ausnahme aus. – shda

+0

@shda Die Formen in Ihrer Frage stimmen nicht mit dem überein, was nach einer Umformung erwartet wird, sind Sie sicher, dass sie richtig sind? –

+0

Entschuldigung, das waren Formen vor dem Umformen. Ich werde meine Frage aktualisieren. – shda