6

毎回異なる共有変数を使用して数回呼び出される Theano 関数があります。現在の実装方法では、Theano 関数は実行されるたびに再定義されます。Theano関数が定義されるたびにグラフが再構築されるため、これによりプログラム全体が遅くなると思います。

def sumprod_shared(T_shared_array1, T_shared_array2):
    f = theano.function([], (T_shared_array1 * T_shared_array2).sum(axis=0))
    return f()

for factor in range(10):
    m1 = theano.shared(factor * array([[1, 2, 4], [5, 6, 7]]))
    m2 = theano.shared(factor * array([[1, 2, 4], [5, 6, 7]]))
    print sumprod_shared(m1, m2)

非共有 (通常) 変数の場合、関数を一度定義してから、再定義せずに別の変数で呼び出すことができます。

def sumprod_init():
    T_matrix1 = T.lmatrix('T_matrix1')
    T_matrix2 = T.lmatrix('T_matrix2')
    return theano.function([T_matrix1, T_matrix2], (T_matrix1 * T_matrix2).sum(axis=0))    

sumprod = sumprod_init()
for factor in range(10):
    np_array1 = factor * array([[1, 2, 4], [5, 6, 7]])
    np_array2 = factor * array([[1, 2, 4], [5, 6, 7]])
    print sumprod(np_array1, np_array2)

これは共有変数でも可能ですか?

4

2 に答える 2

3

そのために theano.function で givens キーワードを使用できます。基本的には、次のことを行います。

m1 = theano.shared(name='m1', value = np.zeros((3,2)) )
m2 = theano.shared(name='m2', value = np.zeros((3,2)) )

x1 = theano.tensor.dmatrix('x1')
x2 = theano.tensor.dmatrix('x2')

y = (x1*x2).sum(axis=0)
f = theano.function([],y,givens=[(x1,m1),(x2,m2)],on_unused_input='ignore')

次に値をループするには、共有変数の値を希望する値に設定します。ちなみに、theano で引数のない関数を使用するには、on_unused_input を 'ignore' に設定する必要があります。このような:

array1 = array([[1,2,3],[4,5,6]])
array2 = array([[2,4,6],[8,10,12]])

for i in range(10):
    m1.set_value(i*array1)
    m2.set_value(i*array2)
    print f()

それはうまくいくはずです、少なくともそれが私がそれを回避してきた方法です。

于 2013-06-25T11:49:33.330 に答える
1

現在、Theano 関数を異なる共有変数で再利用することは容易ではありません。

しかし、代替手段があります:

  1. それは本当にボトルネックですか?例ではそうですが、単純化したケースだと思います。知る唯一の方法は、それをプロファイリングすることです。
  2. 最初の共有変数を使用して 1 つの Theano 関数をコンパイルします。次に、Theano 関数を呼び出す前に、これらの共有変数で get_value/set_value を呼び出すことができます。このように、Theano 関数を再コンパイルする必要はありません。
于 2013-06-11T13:54:41.687 に答える