2017-09-08 29 views
3

我在Keras中創建了一個文本分類器,並且我可以在Cloud ML上訓練Keras模型就好了:模型隨後部署在Cloud ML 。但是,當將文本傳遞給分類時,它會返回錯誤的分類:我強烈懷疑它沒有使用創建keras分類器時使用的相同分詞器/詞索引,並且用於標記新文本。在谷歌雲-ml引擎中使用的包裝keras tokenizer/word索引

我不確定如何沿着tokeniser /字索引到雲ML通過在訓練時:有一個以前SO question,但會

gcloud ml-engine jobs submit training 

拿起包含單詞索引映射鹹菜或文本文件?如果是這樣,我應該如何配置setup.py文件?


編輯:

所以,我使用Keras到tokenise輸入文本,像這樣:

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) 

我然後使用標記生成器將文本轉換爲序列的新數據,分類等

腳本爲雲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 
+2

您能否提供代碼片段或指向您的代碼的鏈接,或者提供更多關於如何使用單詞索引映射的上下文? – rhaertel80

+0

現在添加了代碼/上下文。 –

回答

2

從我可以從source code告訴,似乎即使TensorFlow的Keras兼容庫正在做標記化在Python,即不作爲TensorFlow圖的一部分。

目前,CloudML引擎僅支持服務TensorFlow模型,其中所有邏輯都編碼在TensorFlow圖中。這意味着您必須執行標記化客戶端並將結果傳遞到服務器以進行預測。這將涉及編碼客戶端以對Tokenizer進行反序列化並且針對期望進行預測的輸入調用tokenizer.texts_to_sequences

我們認識到,這並非總是理想的(對於非Python客戶端來說,非起始者並不方便,即使對於Python客戶端也是不方便的),並且正在積極研究允許任意Python代碼作爲預測的一部分運行的解決方案。