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: ('名前 ":1" のインデックス 0 (0 ベース) の theano 関数への入力引数が正しくありません', '配列のようなオブジェクトが必要でしたが、変数が見つかりました: おそらく、(おそらく共有)数値配列の代わりに変数?')

しかし、私が実行した場合:

get_squared(C)

正方行列を取得します。

あなたのコードベース、それがどのように構成されているかはわかりませんが、非常に直接的な (単純かもしれませんがうまくいく) 解決策の 1 つは、二乗共分散行列の記号式を作成し、それを関数の一部として返すことです。たとえば、y1 と y2 が cov を計算するグラフの一部である場合、共分散の 2 乗を返す 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 に答える