2017-09-08 1 views
3

J'ai créé un classificateur de texte dans Keras, et je peux très bien apprendre le modèle Keras sur Cloud ML: le modèle est ensuite déployé sur Cloud ML . Cependant, en passant le long du texte à classer, il retourne les mauvaises classifications: Je soupçonne fortement qu'il n'utilise pas le même index tokenizer/mot que j'ai utilisé lors de la création du classificateur keras, et qui a été utilisé pour tokenise le nouveau texte.Empaquetage keras tokenizer/index de mots à utiliser dans google-cloud-ml-engine

Je ne suis pas sûr comment passer le long de l'indice tokeniser/mot Cloud ML lors de la formation: il y a un SO question précédent, mais

gcloud ml-engine jobs submit training 

ramasser un fichier cornichon ou d'un texte contenant le mappage d'index de mots ? Et si oui, comment dois-je configurer le fichier setup.py?


EDIT:

Alors, j'utilise Keras à tokenise texte d'entrée comme ceci:

tokenizer = Tokenizer(num_words=MAX_NB_WORDS) 
tokenizer.fit_on_texts(X_train) 
sequences = tokenizer.texts_to_sequences(X_train) 

word_index = tokenizer.word_index 

Si je suis juste le chargement d'un modèle Keras localement, j'enregistrer le modèle comme si:

model.save('model_embeddings_20epochs_v2.h5') 

Je sauve aussi le tokenizer, afin que je puisse l'utiliser pour tokenizer nouvelles données:

with open("../saved_models/keras_tokenizer_embeddings_002.pickle", "wb") as f: 
    pickle.dump(tokenizer, f) 

Sur les nouvelles données, je restaure le modèle et le tokenizer.

model = load_model('../../saved_models/model_embeddings_20epochs_v2.h5') 
with open("../../saved_models/keras_tokenizer_embeddings_002.pickle", "rb") as f: 
    tokenizer = pickle.load(f) 

J'utilise ensuite le tokenizer pour convertir le texte en séquences sur les nouvelles données, etc. classifient

Le script pour le travail ML-Cloud ne sauve pas la tokenizer - Je suppose que le script Keras utilisé essentiellement la même indice de mot.

.... 
X_train = [x.encode('UTF8') for x in X_train] 
X_test = [x.encode('UTF8') for x in X_test] 

# finally, vectorize the text samples into a 2D integer tensor 
tokenizer = Tokenizer(num_words=MAX_NB_WORDS) 
tokenizer.fit_on_texts(X_train) 
sequences = tokenizer.texts_to_sequences(X_train) 

word_index = tokenizer.word_index 
print('Found %s unique tokens.' % len(word_index)) 

.....

# prepare embedding matrix 
num_words = min(MAX_NB_WORDS, len(word_index)) 
embedding_matrix = np.zeros((num_words, EMBEDDING_DIM)) 
for word, i in word_index.items(): 
    if i >= MAX_NB_WORDS: 
     continue 
    embedding_vector = embeddings_index.get(word) 
    if embedding_vector is not None: 
     # words not found in embedding index will be all-zeros. 
     embedding_matrix[i] = embedding_vector 

# load pre-trained word embeddings into an Embedding layer 
# note that we set trainable = False so as to keep the embeddings fixed 
embedding_layer = Embedding(num_words, 
          EMBEDDING_DIM, 
          weights=[embedding_matrix], 
          input_length=MAX_SEQUENCE_LENGTH, 
          trainable=False) 

En ce moment, je suis juste la formation localement.

gcloud ml-engine local train \ 
      --job-dir $JOB_DIR \ 
--module-name trainer.multiclass_glove_embeddings_v1 \ 
--package-path ./trainer \ 
-- \ 
--train-file ./data/corpus.pkl 
+2

Pouvez-vous fournir des extraits de code ou des liens vers votre code ou fournir d'autres informations sur la manière dont vous utilisez le mappage d'index de mots? – rhaertel80

+0

Code/contexte maintenant ajouté. –

Répondre

2

D'après ce que je peux dire de la source code, il semble que même bibliothèque compatible Keras de tensorflow fait Tokenisation en Python, à savoir, pas dans le cadre du graphique tensorflow.

À ce stade, CloudML Engine prend uniquement en charge les modèles TensorFlow de desserte dans lesquels toute la logique est codée dans un graphique TensorFlow. Cela signifie que vous devrez faire le côté client tokenization et transmettre les résultats sur le serveur pour la prédiction. Cela impliquerait de coder le client pour désérialiser le Tokenizer et d'appeler le tokenizer.texts_to_sequences pour les entrées pour lesquelles des prédictions sont souhaitées. Nous reconnaissons que ce n'est pas toujours idéal (un non-démarreur pour les clients non-Python et au moins incommodes, même pour les clients Python) et étudie activement des solutions permettant d'exécuter du code Python arbitraire dans le cadre de la prédiction .