2017-03-22 3 views
7

ich folgende bin durch das Tutorial hier: https://pythonprogramming.net/train-test-tensorflow-deep-learning-tutorial/Tensorflow: neuronales Netzwerk unter Verwendung positive oder negative Sätze zu klassifizieren

Ich kann das neuronale Netz bekommen trainiert und aus der Genauigkeit drucken.

Ich weiß jedoch nicht, wie man das neurale Netzwerk verwendet, um eine Vorhersage zu treffen.

Hier ist mein Versuch. Insbesondere das Problem ist, diese Linie - ich glaube, mein Problem ist, dass ich nicht meine Eingabezeichenfolge in das Format erwartet das Modell bekommen:

features = get_features_for_input("This was the best store i've ever seen.") 
result = (sess.run(tf.argmax(prediction.eval(feed_dict={x:features}),1))) 

Hier ist ein größeres Angebot:

def train_neural_network(x): 
    prediction = neural_network_model(x) 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y)) 
    optimizer = tf.train.AdamOptimizer().minimize(cost) 

    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 

     for epoch in range(hm_epochs): 
      epoch_loss = 0 
      i = 0 
      while i < len(train_x): 
       start = i 
       end = i + batch_size 

       batch_x = np.array(train_x[start:end]) 
       batch_y = np.array(train_y[start:end]) 

       _, c = sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y}) 

       epoch_loss += c 
       i+=batch_size 

      print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', epoch_loss) 

     correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y,1))   
     accuracy = tf.reduce_mean(tf.cast(correct,'float')) 
     print('Accuracy', accuracy.eval({x:test_x, y:test_y})) 

     # pos: [1,0] , argmax: 0 
     # neg: [0,1] , argmax: 1 
     features = get_features_for_input("This was the best store i've ever seen.") 
     result = (sess.run(tf.argmax(prediction.eval(feed_dict={x:features}),1))) 
     if result[0] == 0: 
      print('Positive:',input_data) 
     elif result[0] == 1: 
      print('Negative:',input_data) 

def get_features_for_input(input): 
    current_words = word_tokenize(input.lower()) 
    current_words = [lemmatizer.lemmatize(i) for i in current_words] 
    features = np.zeros(len(lexicon)) 

    for word in current_words: 
     if word.lower() in lexicon: 
      index_value = lexicon.index(word.lower()) 
      # OR DO +=1, test both 
      features[index_value] += 1 

    features = np.array(list(features)) 

train_neural_network(x) 

Antwort

9

Nach Ihren Kommentar oben, fühlt es sich wie Ihr Fehler ist ValueError: Cannot feed value of shape() aufgrund der Tatsache, dass featuresNone ist, weil Ihre Funktion get_features_for_input nichts zurückkommt.

Ich fügte die return features Zeile hinzu und gab Features eine korrekte Form von [1, len(lexicon)], um die Form des Platzhalters zu entsprechen.

def get_features_for_input(input): 
    current_words = word_tokenize(input.lower()) 
    current_words = [lemmatizer.lemmatize(i) for i in current_words] 
    features = np.zeros((1, len(lexicon))) 

    for word in current_words: 
     if word.lower() in lexicon: 
      index_value = lexicon.index(word.lower()) 
      # OR DO +=1, test both 
      features[0, index_value] += 1 

    return features 
+0

@Robben_Ford_Fan_boy: Hat es deine Frage nicht beantwortet? –

+0

Vielen Dank für Ihre Antwort - es wurde sehr geschätzt. Diese Lösung hat für mich funktioniert –

3

Ihrer get_features_for_input Funktion zurück eine einzige Liste, die Merkmale eines Satzes darstellt, aber für feed_dict, muss der Eingang die Größe [num_examples, features_size] haben, hier ist num_examples1.

Der folgende Code sollte funktionieren.

def get_features_for_input(input): 
    current_words = word_tokenize(input.lower()) 
    current_words = [lemmatizer.lemmatize(i) for i in current_words] 
    features = np.zeros(len(lexicon)) 

    for word in current_words: 
     if word.lower() in lexicon: 
      index_value = lexicon.index(word.lower()) 
      # OR DO +=1, test both 
      features[index_value] += 1 

    features = np.array(list(features)) 
    batch_features = [] 
    batch_features[0] = features 
    return np.array(batch_features) 
+0

mmmm immer noch Fehler mit dieser Zeile Ergebnis = (sess.run (tf.argmax (Vorhersage.EVAL (feed_dict = {x: Features}), 1))) –

+0

ValueError: kann nicht Wert von shape() für Tensor u'Placeholder: 0 ', die Form hat (?, 73)' –

+0

Wie ist die Form des Platzhalters x? – vikasreddy

2

Grund Funda für jede Maschine Lernalgorithmus ist dimention während der Ausbildung und Prüfung gleich sein sollte.

Während des Trainings haben Sie die Matrixform number of training samples, len(lexicon) erstellt. Hier versuchst du, die Wörter "Apportieren" und "Lexika" sind nichts als das einzigartige Wort in deinen Trainingsdaten.

Während des Testens sollte die eingegebene Vektorgröße der Vektorgröße für das Training entsprechen. Und es ist nur die Größe des Lexikons, das während des Trainings erstellt wird. Auch jedes Element im Testvektor definiert das entsprechende Indexwort in Lexika.

Nun komm zu deinem Problem, in get_features_for_input(input) hast du das Lexikon benutzt, du musst irgendwo im Programm definiert haben. Angesichts des Fehlers, was ich schließe, ist Ihre Lexikonliste leer, so in get_features_for_input Funktion features = np.zeros(len(lexicon)) wird Array von Null-Form produzieren und auch nie in Schleife eintritt.

Wenige erwarteten Änderungen:

können Sie Funktion finden create_feature_sets_and_labels in Ihrem tutorial. Das gibt Ihre bereinigten formatierten Trainingsdaten zurück. Ändern Sie die return-Anweisung, um die Lexikonliste zusammen mit den Daten zurückzugeben.

return train_x,train_y,test_x,test_y,lexicon 

kleine Änderung Machen Lexikon Liste zu sammeln, ref: here

train_x,train_y,test_x,test_y,lexicon = create_feature_sets_and_labels('/path/to/pos.txt','/path/to/neg.txt') 

Und gerade dieses Lexikon Liste übergeben alongwith Ihre Eingabe get_features_for_input Funktion

features = get_features_for_input("This was the best store i've ever seen.",lexicon) 

Machen Sie kleine Änderung in get_features_for_input Funktion

def get_features_for_input(text,lexicon): 
    featureset = [] 
    current_words = word_tokenize(text.lower()) 
    current_words = [lemmatizer.lemmatize(i) for i in current_words] 
    features = np.zeros(len(lexicon)) 
    for word in current_words: 
     if word.lower() in lexicon: 
      index_value = lexicon.index(word.lower()) 
      features[index_value] += 1 
    featureset.append(features) 
    return np.asarray(featureset) 
Verwandte Themen