包装keras tokenizer / word index,用于google-cloud-ml-engine

时间:2017-09-08 16:12:33

标签: python keras google-cloud-ml-engine

我在Keras中创建了一个文本分类器,我可以在Cloud ML上训练Keras模型就好了:该模型随后部署在Cloud ML上。然而,当传递文本进行分类时,它返回错误的分类:我强烈怀疑它没有使用我在创建keras分类器时使用的相同的tokenizer / word索引,并且用于标记新文本。

我不确定如何在训练时将tokeniser / word索引传递给Cloud ML:之前有SO question,但

gcloud ml-engine jobs submit training

选择包含单词索引映射的pickle或text文件?如果是这样,我应该如何配置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')

我还保存了tokenizer,以便我可以使用它来标记新数据:

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)

然后我使用tokenizer将文本转换为新数据的序列,分类等。

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

1 个答案:

答案 0 :(得分:2)

source code我可以看出,即使是TensorFlow的Keras兼容库也在Python 中进行Tokenization ,即不是TensorFlow图的一部分。

此时,CloudML Engine仅支持提供TensorFlow模型,其中所有逻辑都在TensorFlow图中进行编码。这意味着您必须执行标记化客户端并将结果传递到服务器以进行预测。这将涉及编码客户端以反序列化Tokenizer并调用tokenizer.texts_to_sequences以获取需要预测的输入。

我们认识到这并不总是理想的(对于非Python客户端来说是非启动性的,并且至少对于Python客户端来说是不方便的)并且正在积极研究允许任意Python代码作为预测的一部分运行的解决方案。