0

我有一个 theano 协方差矩阵,我正在尝试计算它的元素平方。我已经为此编写了以下代码:

    import theano
    a, b = theano.tensor.matrices('a', 'b')
    square = theano.function([a, b], a * b)
    sq = square(cov, cov)

其中 cov 是协方差矩阵,计算如下:

    y1_pre = T.dot(self.x, self.W_left) + self.b_left
    y1 = activation(y1_pre, self.hidden_activation)
    y2_pre = T.dot(self.x, self.W_right) + self.b_right
    y2 = activation(y2_pre, self.hidden_activation)
    y1_mean = T.mean(y1, axis=0)
    y1_centered = y1 - y1_mean
    y2_mean = T.mean(y2, axis=0)
    y2_centered = y2 - y2_mean
    cov = T.sum(y1_centered[:, :, None] * y2_centered[:, None, :], axis=0)

但它抛出以下错误:

TypeError: ('Bad input argument to theano function with name "cov.py:114"  at index 0(0-based)', 'Expected an array-like object, but found a Variable: maybe you are trying to call a function on a (possibly shared) variable instead of a numeric array?')

我知道这很简单,但仍然找不到可能的解决方法。请在这方面帮助我。

4

1 回答 1

1

您对编译的 Theano 函数的输入不能是符号表达式,它必须是 NumPy 数组或共享变量。例如:

A = T.matrix('input matrix')
B = T.matrix('dummy matrix')
C = np.random.rand(5,5).astype(theano.config.floatX)
squared = A**2 
get_squared = theano.function([A], squared)

如果我运行以下命令:

get_squared(B)

我会收到以下错误:

TypeError: ('Bad input argument to theano function with name ":1" at index 0(0-based)', '期望一个类似数组的对象,但找到了一个变量:也许你正试图在 (可能共享)变量而不是数字数组?')

但是,如果我运行:

get_squared(C)

我得到了平方矩阵。

我不确定您的代码库,它的结构,但一个非常直接(可能很天真,但它会起作用)的解决方案是为您的平方协方差矩阵创建一个符号表达式并将其作为函数的一部分返回。例如,如果 y1 和 y2 是计算 cov 的图形的一部分,您可以创建一个返回协方差平方的 theano 函数:

cov = ... # (some expressions involving y1 and y2 as in your original post)
get_cov_squared = theano.function([y1,y2], cov**2)

但同样,您对函数的输入必须是实际数组或共享变量,而不是符号表达式。

于 2016-03-19T12:45:41.427 回答