2017-04-13 1 views
0

私はケラスを使用しています。最後のレイヤーでは、「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] 

OKAYのような結果を得る し、 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つに合わないことがあります。累積確率はどれくらいですか?

私はKeranoの例/ディレクトリのTheanoをバックエンドとして使って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ビット浮動小数点のマシンイプシロンと同じ順序です。私の〜/ .keras/keras.hjsonファイル内

 "floatx": "float32", 

の使用と一致している

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

。さらに精度が必要な場合は、 "float32"を "float64"に変更することができます。

+0

申し訳ありませんが、私はより正確にされている必要があります!私は1から非常に遠いです... – Labo

+0

@Laboそれはアンダーフロー/オーバーフローの問題かもしれませんか? 堅牢なsoftmaxソリューションに関するこの[link](https://stats.stackexchange.com/questions/149663/robust-softmax-solutions-for-theano)は関連性があります。 – dhinckley

+0

Kerasにオーバーフローがあり、一般的に "nan"が値として表示されます。私はここで何が起こっているのか分かりません。 – Labo

関連する問題