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
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
Code/contexte maintenant ajouté. –