2017-02-09 3 views
2

Ich versuche Sequenzklassifizierung mit Keras in Python 3. Ich versuche, Sequenzen von Wörtern zu klassifizieren. In meinen Daten habe ich word_2_vec verwendet, um die Wörter in ein Array mit Form 300 zu transformieren. Meine Trainingsdaten lauten wie folgt:Keras Sequenzklassifizierung in Python

X -> Liste der Wortvektoren (alle Listen der Wortvektoren sind 50 Wortvektoren in der Länge)
Y -> Liste der korrekten Klassen, die ein Hot-codiert sind (wie folgt: [[0, 0, 1], [1, 0, 0], [1, 0, 0] ...))

Wenn ich versuche, das Modell zu initialisieren und meine Daten darauf anzupassen, bekomme ich immer Fehler. Ich bin neu in Deep Learning mit Keras. Was sollten die Schichten meines Modells sein? Auch ein bestimmter Fehler, den ich bekomme, ist, dass mein input_shape falsch ist. Was ist mein Input_shape in diesem Fall?

Code:

training_data = [] 
    with open(INTENT_RECOGNITION_TRAINING, 'r') as json_file: 
     json_obj = json.load(json_file) 
     for data in json_obj['data']: 
      for query in data['queries']: 
       words = [START_TOKEN] + word_tokenize(query[0]) + [END_TOKEN] 
       if len(words) > JText.MAX_QUERY_LENGTH: 
        JText.MAX_QUERY_LENGTH = len(words) 
       training_data.append((words, data['intent'])) 
    training_data = [(JText._pad_sequence(ws, JText.MAX_QUERY_LENGTH), intent) for (ws, intent) in training_data] 
    for i in range(len(training_data)): 
     if training_data[i][1] not in JText.INTENTS: 
      JText.INTENTS.append(training_data[i][1]) 
     query_vector = [] 
     for w in training_data[i][0]: 
      if w in JText.WORD2VEC.vocab: 
       query_vector.append(JText.WORD2VEC[w]) 
      else: 
       query_vector.append(np.zeros(300)) 
     training_data[i] = (query_vector, training_data[i][1]) 
    random.shuffle(training_data) 
    X_train = [tup[0] for tup in training_data] 
    y_train = [tup[1] for tup in training_data] 
    y_labelencoder = LabelEncoder() 
    y_train = y_labelencoder.fit_transform(y_train).reshape(-1, 1) 
    y_onehotencoder = OneHotEncoder(categorical_features=[0]) 
    y_train = y_onehotencoder.fit_transform(y_train).toarray() 
    recognizer = Sequential([ 
     LSTM(100, input_shape=(JText.MAX_QUERY_LENGTH, 300)), 
     Dense(len(JText.INTENTS), activation='sigmoid') 
    ]) 
    recognizer.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    recognizer.fit(X_train, y_train, nb_epoch=100, batch_size=10) 

immer diese Fehlermeldung:

Exception: Error when checking model input: expected lstm_input_1 to have 3 dimensions, but got array with shape (21, 1) 
+0

Willkommen bei StackOverflow. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. Wir können Ihnen nicht effektiv helfen, bis Sie Ihren MCVE-Code veröffentlicht und das Problem genau beschrieben haben. – Prune

Antwort

0

Ohne den keras Modellcode oder die Fehlermeldung ist es sehr schwierig, eine genaue Antwort zu geben. Ich werde versuchen, zu helfen, indem ich eine allgemeine Lösung gemäß den verfügbaren Informationen anführe.

  1. Ich nehme an, dass Sie LSTM in Keras verwenden, um die Sequenzklassifizierung durchzuführen. Wenn dies der Fall ist, sollte Ihre Eingabe ein 3D-Array von Dimensionen sein (batch_size, Time_steps, length_each_word_vector). In Ihrem Fall ist die Eingabe also ein Array von Form (no_of_sequences_to_train, 50,300) unter der Annahme, dass in jeder Sequenz 50 Wörter vorhanden sind.
  2. Welche Layer sollten Sie verwenden, da das angegebene y-Argument so aussieht, als gäbe es nur 3 Klassifizierungsklassen. Wenn das der Fall ist, können Sie mit output_dim = 3 Hinzufügen eine dichte Schicht betrachten (dh erstes Argument 3)

Diese blog ein gutes Beispiel für Sequenzklassifizierung ist, sollte einige intuitiven Ideen Anfänger bieten.

this helps

UPDATE Ich versuche, etwas ähnliches zu tun und hatte das gleiche Problem aufgetreten. Bilden Sie Ihren Code, es scheint, dass Sie eine Liste von ndarrays der Form übergeben (seq_len, 300). Das Keras erwartet ein 3D-Numpy-Array und keine Liste mit Numpy-Arrays.

Dies ist, wie ich würde

X_train = np.zeros((len(training_data,MAX_QUERY_LENGTH,300)) 
for i in range(len(training_data)): 
    tup = training_data[i] 
    X_train[i,:,:]=tup[0] 

Der obige Code ist nicht optimiert meine Trainingsdaten

neu konfiguriert, aber es vermittelt am besten die erforderlichen Änderungen, um die LSTM Schicht akzeptieren Sie Ihre Eingabe

Hoffnung zu erhalten, das hilft

+0

Wenn ich die Eingabeform von (len, 300) setze bekomme ich diese Fehlermeldung 'Ausnahme: Fehler beim Überprüfen der Modelleingabe: erwartet lstm_input_1 um 3 Dimensionen zu haben, aber Array mit Form (21, 1)' Ich habe die Frage aktualisiert mit meinem Code @SebinjudeShaolin –