Упаковка keras tokenizer / word index для использования в google-cloud-ml-engine

Я создал текстовый классификатор в 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

person Brian O'Halloran    schedule 08.09.2017    source источник
comment
Можете ли вы предоставить фрагменты кода или ссылки на свой код или иным образом предоставить более подробный контекст того, как вы используете сопоставление индекса слов?   -  person rhaertel80    schedule 08.09.2017
comment
Код / контекст добавлены.   -  person Brian O'Halloran    schedule 11.09.2017


Ответы (1)


Из того, что я могу судить, из исходный код, похоже, что даже Keras-совместимая библиотека TensorFlow выполняет токенизацию на Python, то есть не как часть графа TensorFlow.

В настоящее время CloudML Engine поддерживает только обслуживание моделей TensorFlow, в которых вся логика закодирована в графе TensorFlow. Это означает, что вам нужно будет выполнить токенизацию на стороне клиента и передать результаты на сервер для прогнозирования. Это потребует кодирования клиента для десериализации Tokenizer и вызова tokenizer.texts_to_sequences для входных данных, для которых требуются прогнозы.

Мы понимаем, что это не всегда идеально (что не подходит для клиентов, отличных от Python, и неудобно, по крайней мере, даже для клиентов Python), и активно исследуем решения, позволяющие запускать произвольный код Python в рамках прогнозирования.

person rhaertel80    schedule 11.09.2017