2016-05-07 45 views
2

使用Python 2.7蟒蛇在Windows 10如何計算使用keras訓練的語言模型的困惑?

我培養了GRU的神經網絡來構建使用keras語言模型:

print('Build model...') 
model = Sequential() 
model.add(GRU(512, return_sequences=True, input_shape=(maxlen, len(chars)))) 
model.add(Dropout(0.2)) 
model.add(GRU(512, return_sequences=False)) 
model.add(Dropout(0.2)) 
model.add(Dense(len(chars))) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer='rmsprop') 

如何計算這個語言模型的困惑?例如,NLTK爲其模型提供了困惑度計算功能。

回答

3

我看到你也跟着Keras的語言模型教程,這對我的理解並不完全正確。這是由於語言模型應該估計每個子序列的概率,例如P(c_1,c_2..c_N)= P(c_1)P(c_2 | c_1)... P(c_N | c_N-1)。 ..c_1) 但是,假設你的輸入是一個形狀爲sequence_length X #characters的矩陣,而你的目標是該序列後面的字符,那麼你的模型的輸出將只產生最後一項P(c_N | c_N-1 ... c_1)

之後的困惑是P(c_1,c_2..c_N)^ { - 1/N},你不能得到所有的術語。這就是爲什麼我建議使用TimeDistributedDense圖層。它會給你一個sequence_length X #characters的矩陣,其中每一行都是字符的概率分佈,稱之爲proba

從每個proba的行開始,你需要包含正確字符預測的列:

correct_proba = PROBA [np.arange(MAXLEN),yTest],

假設yTest是含有正確字符的索引在每個時間步驟

然後困惑用於序列的載體(你必須平均在所有的訓​​練序列上)

(2,-np.sum(np.log(correct_proba),axis = 1)/ maxlen)

PS。我寧願寫在乳膠的解釋

+0

嗨,謝謝你回答這個!這個變化非常大。你是否在數據集上實現了你的版本?我可以和你聯繫嗎? – ishido

+0

我的榮幸:)是的,我正在對公共FCE數據集進行培訓 - 在cam dot ac dot uk的btd26上給我發電子郵件 – layser