Я создал текстовый классификатор в Keras, и я могу отлично обучить модель Keras в Cloud ML: впоследствии модель развертывается в Cloud ML. Однако при передаче текста для классификации он возвращает неправильные классификации: я сильно подозреваю, что он не использует тот же индекс токенизатора / слова, который я использовал при создании классификатора keras, и который использовался для токенизации нового текста.
Я не уверен, как передать индекс токенизатора / слова в Cloud ML во время обучения: есть предыдущий ТАК вопрос, но будет
gcloud ml-engine jobs submit training
подобрать рассол или текстовый файл, содержащий отображение индекса слов? И если да, то как мне настроить файл setup.py?
РЕДАКТИРОВАТЬ:
Итак, я использую Keras для токенизации входного текста следующим образом:
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
Если я просто загружаю модель Keras локально, я сохраняю модель так:
model.save('model_embeddings_20epochs_v2.h5')
Я также сохраняю токенизатор, чтобы использовать его для токенизации новых данных:
with open("../saved_models/keras_tokenizer_embeddings_002.pickle", "wb") as f:
pickle.dump(tokenizer, f)
По новым данным восстанавливаю модель и токенизатор.
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)
Затем я использую токенизатор для преобразования текста в последовательности новых данных, классификации и т. Д.
Скрипт для задания Cloud ML не сохраняет токенизатор - я предположил, что скрипт Keras в основном использовал тот же индекс слова.
....
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)
На данный момент тренируюсь только на месте.
gcloud ml-engine local train \
--job-dir $JOB_DIR \
--module-name trainer.multiclass_glove_embeddings_v1 \
--package-path ./trainer \
-- \
--train-file ./data/corpus.pkl