2017-09-05 1 views
0

Ich versuche ein Keras-Modell zu erstellen, um verschiedene Artikel in Themen einzuteilen. Jeder Artikel hat nur ein Thema. Ich habe eine eigene CSV-Datei mit folgendem Aufbau:Keras Textklassifikation Benutzerdefiniertes Dataset von csv

"topic1","article1" 
"topic2","article2" 

Ich versuche, mein Modell für diesen Datensatz zu trainieren, aber leider bekomme ich einen Fehler, da die Daten aus der CSV wurden noch nicht verarbeitet eine seiner Vektor.

Dies ist mein Code:

from __future__ import print_function 
import csv 
import numpy as np 
import keras 
import os 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.preprocessing.text import Tokenizer 

max_words = 1000 
batch_size = 32 
epochs = 5 
model_file_name = 'model.h5' 


def load_data(word_max, test_split): 
    xs = [] 
    labels = [] 
    counter = 0 
    with open('data.csv', 'r') as f: 
     reader = csv.reader(f) 
     for line in reader: 
      if counter > word_max: 
       break 
      xs.append(line[1]) 
      labels.append(line[0]) 
      counter += 1 
    idx = int(len(xs) * (1 - test_split)) 
    train_x, train_y = np.array(xs[:idx]), np.array(labels[:idx]) 
    test_x, test_y = np.array(xs[idx:]), np.array(labels[idx:]) 
    return (train_x, train_y), (test_x, test_y) 


print('Loading data...') 
(x_train, y_train), (x_test, y_test) = load_data(max_words, 0.3) 

print(len(x_train), 'train sequences') 
print(len(x_test), 'test sequences') 

num_classes = np.max(y_train) + 1 
print(num_classes, 'classes') 

print('Vectorizing sequence data...') 
tokenizer = Tokenizer(num_words=max_words) 
x_train = tokenizer.sequences_to_matrix(x_train, mode='binary') 
x_test = tokenizer.sequences_to_matrix(x_test, mode='binary') 
print('x_train shape:', x_train.shape) 
print('x_test shape:', x_test.shape) 

print('Convert class vector to binary class matrix ' 
     '(for use with categorical_crossentropy)') 
y_train = keras.utils.to_categorical(y_train, num_classes) 
y_test = keras.utils.to_categorical(y_test, num_classes) 
print('y_train shape:', y_train.shape) 
print('y_test shape:', y_test.shape) 

if os.path.isfile(model_file_name): 
    model = keras.models.load_model(model_file_name) 
else: 
    print('Building model...') 
    model = Sequential() 
    model.add(Dense(512, input_shape=(max_words,))) 
    model.add(Activation('relu')) 
    model.add(Dropout(0.35)) 
    model.add(Dense(num_classes)) 
    model.add(Activation('softmax')) 

    model.compile(loss='categorical_crossentropy', 
        optimizer='adam', 
        metrics=['accuracy']) 

    history = model.fit(x_train, y_train, 
         batch_size=batch_size, 
         epochs=epochs, 
         verbose=1, 
         validation_split=0.1) 
    score = model.evaluate(x_test, y_test, 
          batch_size=batch_size, verbose=1) 
    print('Test score:', score[0]) 
    print('Test accuracy:', score[1]) 
    model.save(model_file_name) 

Wie kann ich meine Daten korrekt geladen mein Modell zu trainieren? Und wie würde ich ein Thema für einen gegebenen Text mit model.predict vorhersagen?

EDIT: Ich habe arbeiten, um die Ausbildung des Modells bekommt durch den Prozess der Veränderung der Trainingsdaten wie Ladens:

print('Loading data...') 
(x_train, y_train), (x_test, y_test) = load_data(max_words, 0.3) 

tokenizer = Tokenizer(num_words=max_words) 
tokenizer.fit_on_texts(x_train) 
x_train = tokenizer.texts_to_sequences(x_train) 
tokenizer.fit_on_texts(y_train) 
y_train = tokenizer.texts_to_sequences(y_train) 
tokenizer.fit_on_texts(x_test) 
x_test = tokenizer.texts_to_sequences(x_test) 
tokenizer.fit_on_texts(y_test) 
y_test = tokenizer.texts_to_sequences(y_test) 

print(len(x_train), 'train sequences') 
print(len(x_test), 'test sequences') 

Also, wie kann ich dies und vorhersagen, ein Label von einem bestimmten Artikel ?:

model = keras.models.load_model(model_file_name) 
to_predict = np.array(['The sun is shining.']) 
# Predict label from example article 
label = model.predict(...) 
print(label) 

Antwort

1

Sie könnten den Artikel die numpy Array nicht direkt konvertieren, müssen Sie den gleichen tokenizer verwenden, um den Artikel zu einem numpy Array zu konvertieren.

array = tokenizer.texts_to_sequences([title]) # the tokenizer must be same with the training tokenizer 
array = np.asanyarray(array) 
array = sequence.pad_sequences(array, maxlen=max_words, padding='post', truncating='post') 
array = np.asarray(array) 
result = model.predict(array) 

Dann wäre das Ergebnis ein Vektor der Wahrscheinlichkeit sein (weil Sie die softmax Funktion), wie [0.3,0.7], wobei jedes Element die Wahrscheinlichkeit zu dem entsprechenden Thema darstellt. Das Thema mit der höchsten Wahrscheinlichkeit wird die Vorhersage sein.

Verwandte Themen