2017-04-13 65 views
0

我正在使用keras,最後一層使用'softmax'激活函數。 但是,當我使用預測和求和概率時,我沒有得到1. 爲什麼?爲什麼softmax和LSTM與model.predict(x)的和小於1?

N.B. : 我真的遠離1:

>>> m 
<keras.models.Sequential object at 0x1083fdf60> 
>>> m.layers[-1].activation 
<function softmax at 0x1092bfea0> 
>>> X.shape 
(1940, 10, 48) 
>>> m.input 
<tf.Tensor 'lstm_1_input:0' shape=(?, 10, 48) dtype=float32> 
>>> model.predict(X)[:10].sum(axis=-1) 
array([ 0.46206102, 0.43193966, 0.4252567 , 0.44023705, 0.46344867, 
     0.48820126, 0.50369406, 0.49789378, 0.46433908, 0.44102359], dtype=float32) 
>>> y=model.predict(X) 
>>> y[0] 
array([ 0.00000000e+00, 6.10233226e-04, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 1.12394022e-03, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 1.55960268e-04, 0.00000000e+00, 
     4.60170895e-01], dtype=float32) 

編輯: 我用一個簡單的代碼

import numpy as np 
from keras.models import * 
from keras.layers import * 
m = Sequential() 
m.add(LSTM(3, input_shape=(3,2), activation='softmax')) 
print(m.predict(np.random.rand(5,3,2)).sum(axis=-1)) 

測試,我用密得到的結果一樣

[ 0.50027865 0.49804032 0.49545377 0.50514281 0.50069857] 

好了,所以和SimpleRNN,我幾乎得到1.問題可能僅僅是激活與循環圖層不同,因爲GRU具有相同的問題。 我在GitHub上問過:https://github.com/fchollet/keras/issues/6255

回答

1

@joelthchao在GitHub(https://github.com/fchollet/keras/issues/6255)說:這裏

激活是每個隱藏單元上直接申請。但是,我們不會以這種方式使用LSTM。通常情況下,我們這樣做的:

m.add(LSTM(hidden_unit, input_shape=(3,2))) 
m.add(Dense(3, activation='softmax')) 

最後,我發現了更多的邏輯使用:

m.add(Lambda(K.softmax)) 
1

通過構建,softmax預測應該總和爲1。但是,實際上,由於機器精度的限制,它們可能不會完全相同。你的累積概率與1有多遠?

我用Theano作爲後端運行Keras示例/目錄中找到的mnist_mlp.py示例。然後我用訓練好的模型預測了測試集的概率。如預期的那樣,概率總和幾乎爲1。

y_pred = model.predict(x_test) 
y_sum = y_pred.sum(axis=1) 
print('Min={}, Max={}, Range={}'.format(y_sum.min(),y_sum.max(),y_sum.max()-y_sum.min())) 
# Min=0.9999999403953552, Max=1.0000001192092896, Range=1.7881393432617188e-07 

所觀察到的範圍是相同的順序機器最小爲32位浮點上。

import numpy as np 
print(np.finfo(np.float32).eps) 
#1.19209e-07 

這與使用

 "floatx": "float32", 
在我的〜/ .keras/keras.hjson文件

一致。如果您需要更高的精度,您可以將「float32」更改爲「float64」。

+0

對不起,我本來應該更精確!我離1很遠...... – Labo

+0

@Labo它可能是下溢/溢出問題嗎? 這個[link](https://stats.stackexchange.com/questions/149663/robust-softmax-solutions-for-theano)關於穩健的softmax解決方案可能是相關的。 – dhinckley

+0

我在Keras中溢出了,它通常會導致「nan」出現爲值。我不知道這裏發生了什麼。 – Labo

相關問題