2016-10-31 13 views
2

私はSpacyのカスタム単語埋め込みを使用して、シーケンス - >ラベルRNNクエリ分類子をトレーニングしようとしています。ここに私のコードです:KerasでRNNを訓練するとき、精度は0.0000になりますか?

word_vector_length = 300 
dictionary_size = v.num_tokens + 1 
word_vectors = v.get_word_vector_dictionary() 
embedding_weights = np.zeros((dictionary_size, word_vector_length)) 
max_length = 186 
for word, index in dictionary._get_raw_id_to_token().items(): 
    if word in word_vectors: 
     embedding_weights[index,:] = word_vectors[word] 
model = Sequential() 
model.add(Embedding(input_dim=dictionary_size, output_dim=word_vector_length, 
        input_length= max_length, mask_zero=True, weights=[embedding_weights])) 
model.add(Bidirectional(LSTM(128, activation= 'relu', return_sequences=False))) 
model.add(Dense(v.num_labels, activation= 'sigmoid')) 

model.compile(loss = 'binary_crossentropy', 
       optimizer = 'adam', 
       metrics = ['accuracy']) 

model.fit(X_train, Y_train, batch_size=200, nb_epoch=20) 
ここ

word_vectorsがspacy.vectorsから剥ぎ取り、長さ300を持っている、入力は、整数が入力トークンIDがあるの寸法186、の[0,0,12,15,0...]のように見えるnp_arrayで、私はそれに応じて埋め込みウェイト行列を構築しました。出力レイヤーは、トレーニングサンプルごとに長さ26の[0,0,1,0,...0]であり、このベクトル化されたテキストと一緒に表示されるラベルを示します。

これはうまくいくように見えますが、最初のエポックではトレーニングの精度は絶えず低下しています。最初のエポックの終わりまで/残りのトレーニングでは、それはちょうど0です。これは事件です。私はkeras/TFのモデルをたくさん練習しましたが、この問題は一度も起こりませんでした。

ここで何が起こっている可能性がありますか?

+0

学習率を下げてみましたか? adamのデフォルトの '1e-3'はこのタスクではかなり高いです。 – y300

答えて

-1

ラベルは常にワンホットですか?ラベルベクトルの要素の1つのみが1で残りがゼロであることを意味します。

ので、多分、次の公式の例のようなカテゴリcrossentropy損失でソフトマックスの活性化を使用してみた場合:これは、(最後の層の上に、出力確率分布にネットワークを制約するのに役立ちます

https://github.com/fchollet/keras/blob/master/examples/babi_memnn.py#L202

すなわち、ソフトマックス層の出力は合計1になる)。

関連する問題