2015-02-10 18 views
6

Diciamo che ho una Matrix n_i x n_o e voglio normalizzarla riga-saggio, cioè la somma di ogni riga dovrebbe essere una. Come posso farlo in theano?normalize a row-wise in theano

Motivazione: l'utilizzo di softmax restituisce un errore per me, quindi cerco di aggirarlo implementando la mia versione di softmax.

+1

Non dovresti piuttosto esaminare fissa l'errore con il SoftMax allora? :) – eickenberg

risposta

9

vedere se la seguente è utile per voi:

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

Invece di 'reshape' dopo la' sum', penso 'keepdims = True' sarebbe più pulito in' sum'. – Albert

+0

Infatti. Avevo visto quell'argomento, ma non l'ho mai usato, perché non penso che esista in numpy. Ma hai ragione, è decisamente più conciso. – eickenberg

+0

Se sarebbe bello se affrontassi il divario per zero possibilità; una delle righe può sommare a zero. – hlin117

4

o si può anche utilizzare

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

Questo è equivalente se la somma è positiva (che spero venga scelta per essere). Se non lo è, la mia risposta probabilmente porterà a comportamenti imprevisti mentre la divisione secondo la norma farà un semplice ridimensionamento e non cambierà il segno. – eickenberg