【问题标题】:Packaging keras tokenizer/word index for use in google-cloud-ml-engine打包用于 google-cloud-ml-engine 的 keras 标记器/单词索引
【发布时间】:2017-09-08 16:12:33
【问题描述】:

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

我不确定如何在训练时将分词器/单词索引传递给 Cloud ML:之前有一个 SO question,但会

gcloud ml-engine jobs submit training

拿起一个包含单词索引映射的pickle或文本文件?如果是这样,我应该如何配置 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

【问题讨论】:

  • 您能否提供代码 sn-ps 或指向您的代码的链接,或者提供更多关于您如何使用单词索引映射的上下文?
  • 现在添加了代码/上下文。

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


【解决方案1】:

据我从source code 得知,似乎即使是 TensorFlow 的 Keras 兼容库也在 Python 中进行标记化,也就是说,它不是 TensorFlow 图的一部分。

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

我们认识到这并不总是理想的(对于非 Python 客户端而言,这并不理想,并且至少对于 Python 客户端来说也不方便),并且正在积极研究允许在预测过程中运行任意 Python 代码的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2018-06-08
    相关资源
    最近更新 更多