【发布时间】: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