在Theano中对矩阵按行进行归一化

6
假设我有一个大小为n_i x n_o的矩阵N,我想逐行对其进行归一化,即每一行的和应该为1。我该如何在Theano中实现这个操作?
动机:使用softmax函数返回错误,因此我尝试通过实现自己版本的softmax函数来解决问题。

1
你不应该先看看修复softmax的错误吗? :) - eickenberg
2个回答

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 会更清晰。 - Albert
确实。我看过那个参数,但从未使用过,因为我认为它在numpy中不存在。但你是对的,它肯定更简洁。 - eickenberg
如果您能解决除以零的可能性就太好了;其中一行可能会加和为零。 - hlin117
可以添加这个功能。问题是你想如何处理它。你可以系统地在分母中添加一个非常小的数字,但它必须比你最小的非零数字小几个数量级。或者你可以通过在掩码或开关操作上使用T.setsubtensor来实际实现决策机制。 - eickenberg
1
这里 assert_array_equal 会引发断言错误,因为由于浮点运算,答案不会完全相等。即使代码是正确的,这可能会导致误导。 - scv
有趣。我很确定在我尝试的机器上它没有运行。否则我会切换到 numpy.testing.assert_array_almost_equal 来使比较更加宽松。请随意编辑答案! - eickenberg

4

或者您也可以使用

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

如果总和为正数(我希望是这样选择的),那么它就等价于iff。如果不是,则我的答案可能会导致意外行为,而除以范数将进行简单的缩放并且不改变符号。 - eickenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接