我有一个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?')
我知道这样做很简单,但仍然找不到可能的解决办法。请帮助我。
答案 0 :(得分:1)
您编译的Theano函数的输入不能是符号表达式,它必须是NumPy数组或共享变量。例如:
get_squared(B)
如果我运行以下命令:
get_squared(C)
我会收到以下错误:
TypeError :('ofano函数的错误输入参数,名称为“:1”,索引0(从0开始)','预期类似于数组的对象,但找到一个变量:也许你正试图调用一个函数在一个(可能是共享的)变量而不是数字数组?')
但是,如果我跑:
cov = ... # (some expressions involving y1 and y2 as in your original post)
get_cov_squared = theano.function([y1,y2], cov**2)
我得到了平方矩阵。
我不确定你的代码库,它是如何构造的,但是一个非常直接的(可能天真但它会起作用)解决方案是为你的平方协方差矩阵创建一个符号表达式并将其作为函数的一部分返回。例如,如果y1和y2是计算cov的图形的一部分,则可以创建一个返回协方差平方的theano函数:
void my_function(JNIEnv *env, jcharArray array) {
jsize len = env->GetArrayLength(array);
if (env->ExceptionCheck() == JNI_TRUE)
return;
jchar *chars = env->GetPrimitiveArrayCritical(array);
// process chars and len
env->ReleasePrimitiveArrayCritical(array, chars, JNI_ABORT);
}
但同样,您对函数的输入必须是实际数组或共享变量,而不是符号表达式。