2017-01-31 4 views
0

に私はnumpyの中で、以下の機能を実現していEXPのためのオーバーフローエラーの回避:はnumpyの

def weak_softmax(a): 
    b=np.exp(a) 
    return b/(1+np.sum(b)) 

配列aのサイズが小さいですが、エントリは時々1000として多分同じ大きさ、大きなものとなります。だから私は、理由は指数関数でオーバーフローの非常に多くの場合、次のエラーが発生します:

a=np.array([1000,1000]) 
a=weak_softmax(a) 

上記のコードはベクトルa=[nan nan]を返すと、次の警告発生します

Warning: overflow encountered in exp 

をする任意の巧妙な方法はありますこの問題を回避しても、配列bを意図した通りに返していますか?これは、bのすべてのエントリが1つしかないためです。私は、この問題をいくつかのトリックを使用して回避することが可能でなければならないと感じています。

+0

'a = np.array([1000、1000])'の場合の望ましい結果は何ですか? 〜 '[1/2、1/2]'? – unutbu

+0

softmaxに1があるはずですか? – user2357112

+0

@ user2357112:これは正確にsoftmaxではありません。だから私はそれを弱いsoftmaxという名前にした。 softmax用にpythonに組み込まれた機能はありますか? – pikachuchameleon

答えて

0

分子と分母を適切なサイズのcの同じ因子exp(c)で単純に分けることができます。

次のコードでは、np.finfoを使用してオーバーフローが発生するかどうかを確認し、cを計算します。

def modified_soft_max(a, SAFETY=2.0): 
    mrn = np.finfo(a.dtype).max # largest representable number 
    thr = np.log(mrn/a.size) - SAFETY 
    amx = a.max() 
    if(amx > thr): 
     b = np.exp(a - (amx-thr)) 
     return b/(np.exp(thr-amx) + b.sum()) 
    else: 
     b = np.exp(a) 
     return b/(1.0 + b.sum()) 
+0

私は以前と同じようにしばしばエラーが発生することがあります。私は安全マージンを増やすべきか、あるいは他の何かのハックがあるでしょうか? – pikachuchameleon

+0

@pikachuchameleon Strange。あなたは例を投稿できますか?とにかく、より大きな安全性を試すか、固定の閾値を使うことができます(0.0にする必要があります)。 –

+0

@pikachuchameleonあなたがハッキングを求めていたので:標準softmaxのライブラリ関数を見つけたら、これを次のように使うことができます: 'softmax(np.r_ [a.ravel()、0])[: - 1] .reshape (a.shape) ' –