2016-12-20 11 views
0

theano.tensor.nnet.softmaxを実行する前にマスクを適用することは可能でしょうか? amは行列であるので、私は行列全体の作業とソフトマックスを好きで、行単位マスクされたソフトマックスを実行することをtheanoのmasked softmax

>>>a = np.array([[1,2,3,4]]) 
>>>m = np.array([[1,0,1,0]]) # ignore index 1 and 3 
>>>theano.tensor.nnet.softmax(a,m) 
array([[ 0.11920292, 0. , 0.88079708, 0. ]]) 

注:

これは私が探しています動作です。

また、出力はaと同じ形状である必要があります。そのため、解決策は高度なインデックス作成を行うことができません。 theano.tensor.softmax(a[0,[0,2]])

答えて

0
def masked_softmax(a, m, axis): 
    e_a = T.exp(a) 
    masked_e = e_a * m 
    sum_masked_e = T.sum(masked_e, axis, keepdims=True) 
    return masked_e/sum_masked_e 
0

theano.tensor.switchこれを行う方法の1つです。あなたは次の操作を行うことができ、計算グラフで

a_mask = theano.tensor.switch(m, a, np.NINF) 
sm = theano.tensor.softmax(a_mask) 

は、それが他の人に役立ちます願っています。