2015-02-10 45 views
6

假设我有一个大小为n_i x n_o的矩阵N,我想按行逐级规范化,即 每行的总和应该是1。我该如何在theano中做到这一点?在theano中按行划分矩阵规范化

动机:使用softmax返回给我的错误,所以我尝试通过实现我自己的softmax版本来避开它。

+1

你不应该看,而与SOFTMAX然后修复错误? :) – eickenberg 2015-02-15 14:49:19

回答

9

看看以下是对您有用:

import theano 
import theano.tensor as T 

m = T.matrix(dtype=theano.config.floatX) 
m_normalized = m/m.sum(axis=1).reshape((m.shape[0], 1)) 

f = theano.function([m], m_normalized) 

import numpy as np 
a = np.exp(np.random.randn(5, 10)).astype(theano.config.floatX) 

b = f(a) 
c = a/a.sum(axis=1)[:, np.newaxis] 

from numpy.testing import assert_array_equal 
assert_array_equal(b, c) 
+2

而不是'sum'后的'reshape',我认为'keepdims = True'在'sum'中会更干净。 – Albert 2016-02-11 10:09:43

+0

确实。我看到了这个论点,但从未使用过它,因为我不认为它存在于numpy中。但你是对的,它绝对更简洁。 – eickenberg 2016-02-11 12:51:45

+0

如果你用零的可能性来解决这个问题,那么这将会很好;其中一行可以和为零。 – hlin117 2016-03-16 20:06:50

4

,或者您也可以使用

m/m.norm(1, axis=1).reshape((m.shape[0], 1)) 
+0

如果总和为正数(我希望它会被选中),那么这相当于。如果不是,那么我的答案可能会导致意想不到的行为,而按标准划分则会做简单的缩放并且不会改变符号。 – eickenberg 2017-11-20 16:35:18