how to predict encoded sentences with tensorflow model

Viewed 47

using spacy, I convert my training sets into matrices containing the individual word vectors. This is done in the encode_sentences() function. Furthermore, I encode the corresponding labels using the label_encoding() function. These data are now to be used as training data for my model. As soon as I want to predict a single sentence to get the right label, I get an nparray as output. How can I make a correct prediction?

import numpy as np
import tensorflow as tf
from tensorflow import keras
import pandas as pd
import sqlite3
from sklearn.preprocessing import LabelEncoder
import spacy
from sklearn.model_selection import train_test_split


nlp = spacy.load('en_core_web_lg')
embedding_dim = nlp.vocab.vectors_length


def read_database(path):
    # Loading Data from database
    connection = sqlite3.connect(path)
    db_rows = pd.read_sql('''select intents.intent, patterns.pattern 
    from intents, patterns where intents.id = patterns.intentid''', connection)
    labels = []
    sentences = []
    intents = []
    for i in range(len(db_rows)):
        labels.append(db_rows["intent"][i])
        if db_rows["intent"][i] not in intents:
            intents.append(db_rows["intent"][i])
        sentences.append(db_rows["pattern"][i])
    return sentences, labels, intents


def label_encoding(labels):
    # Calculate the length of labels
    n_labels = len(labels)
    print('Number of labels :-', n_labels)
    le = LabelEncoder()
    y = le.fit_transform(labels)
    print('Length of y :- ', y.shape)
    return y



def encode_sentences(sentences):
    # Calculate number of sentences
    n_sentences = len(sentences)

    X = np.zeros((n_sentences, embedding_dim))
    # y = np.zeros((n_sentences, embedding_dim))

    # Iterate over the sentences
    for idx, sentence in enumerate(sentences):
        doc = nlp(sentence)
        # Save the document's .vector attribute to the corresponding row in
        X[idx, :] = doc.vector
    return X


sentences_train, labels_train, all_intents = read_database('./database_x.db')
sentences_train = encode_sentences(sentences_train)
labels_train = label_encoding(labels_train)
x_train, x_test, y_train, y_test = train_test_split(sentences_train, labels_train, test_size=0.2)

model = keras.Sequential([keras.layers.Dense(16, activation='relu'),
                          keras.layers.Dense(16, activation='relu'),
                          keras.layers.Dense(len(all_intents), activation='softmax')])

model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.01),
              loss=keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=16, epochs=100)

prediction = model.predict(encode_sentences("how can i test rf heating"))

print("\n\n\n")
print(prediction)
1 Answers

argmax of predictions gives you the index of the best label candidate.

pred_labels_idx = np.argmax(predictions,-1)

The best practice is to make the LabelEncoder le accessible from outside of the function scope so you can inverse_transform the predictions to actually labels:

pred_labels = le.inverse_transform(pred_labels_idx)

Perhaps, you can modify your label_encoder so it also returns a label_decoder when it encodes the labels on training data.

Related