2016-12-01 8 views
0

私は以下のクラスを定義します。Theanoの共有変数の値を変更するには?

class test: 

    def __init__(self): 
     self.X = theano.tensor.dmatrix('x') 
     self.W = theano.shared(value=numpy.zeros((5, 2), dtype=theano.config.floatX), name='W', borrow=True) 
     self.out = theano.dot(self.X, self.W) 

    def eval(self, X): 
     _eval = theano.function([self.X], self.out) 
     return _eval(X) 

その後、私はW行列の値を変更し、新しい値で計算してみてください。私は、次の方法でそれを実行します。

m = test() 
W = np.transpose(np.array([[1.0, 2.0, 3.0, 4.0, 5.0], [2.0, 2.0, 3.0, 3.0, 3.0]])) 
dn.W = theano.shared(value=W, name='W', borrow=True) 
dn.eval(X) 

私は(すべての要素がゼロである)__init__に設定されているWの値に対応し得る結果。

初期化後に明示的に設定したWという新しい値がクラスに表示されないのはなぜですか?

答えて

1

Python変数dn.Wに新しい共有変数を作成したばかりですが、theanoの内部計算グラフは引き続き古い共有変数にリンクされています。

は、既存の共有変数に格納された値に変更するには:あなたが共有変数を更新するために、関数呼び出しの結果を使用したい場合は

W = np.transpose(np.array([[1.0, 2.0, 3.0, 4.0, 5.0], [2.0, 2.0, 3.0, 3.0, 3.0]])) 
dn.W.set_value(W)) 

NOTEを、より良い方法はtheano.functionupdates引数を使用することです。共有変数がGPUに格納されている場合、不要なメモリ転送が不要になります。

関連する問題