Theano では、更新する必要があるメモリ領域とその方法を定義するだけで、グラフィックス カード DRAM のメモリを更新できるため、次のことが可能かどうか疑問に思っていました (そうあるべきです)。
最初の列が開始値で初期化される2x5のランダムに初期化されたマトリックスがあります。前の列に依存し、任意の計算に基づいて次の列を更新する関数を書きたいと思います。
このコードはそれを非常によく説明していると思います:
注:このコードは機能していません。これは単なる例です。
from theano import function, sandbox, shared
import theano.tensor as T
import numpy as np
reservoirSize = 2
samples = 5
# To initialize _mat first column
_vec = np.asarray([1 for i in range(reservoirSize)], np.float32)
# Random matrix, first column will be initialized correctly (_vec)
_mat = np.asarray(np.random.rand(reservoirSize, samples), np.float32)
_mat[:,0] = _vec
print "Init:\n",_mat
_mat = shared(_mat)
idx = T.iscalar()
test = function([idx], updates= {
# The indexing causes the problem here. Imho there should be
# a way to do something like this:
# update: _mat[:, idx] = _max[:, idx-1] * 2
_mat[:,idx]:sandbox.cuda.basic_ops.gpu_from_host(_mat[:,idx-1] * 2)
})
for i in range(1, samples):
test(i)
print "Done:\n",_mat
私の望ましい出力は次のようになります。
Init:
[[ 1. 0.62166548 0.17463242 0.00858122 0.59709388]
[ 1. 0.52690667 0.20800008 0.86816955 0.43518791]]
Done:
[[ 1. 2. 4. 8. 16. ]
1. 2. 4. 8. 16. ]]
しかし、代わりに私は得る
Init:
[[ 1. 0.62166548 0.17463242 0.00858122 0.59709388]
[ 1. 0.52690667 0.20800008 0.86816955 0.43518791]]
Traceback (most recent call last):
File "/home/snooc/workspace/eclipse-python/Bachelorarbeit/theano/test.py", line 20, in <module>
_mat[:,idx]:sandbox.cuda.basic_ops.gpu_from_host(_mat[:,idx-1] * 2) })
File "/usr/lib/python2.7/site-packages/theano/compile/function.py", line 223, in function
profile=profile)
File "/usr/lib/python2.7/site-packages/theano/compile/pfunc.py", line 490, in pfunc
no_default_updates=no_default_updates)
File "/usr/lib/python2.7/site-packages/theano/compile/pfunc.py", line 194, in rebuild_collect_shared
store_into)
TypeError: ('update target must be a SharedVariable', Subtensor{::, int32}.0)
ここで誰か助けてくれませんか?
うわー:この質問は、Google の検索結果のトップ 4 で既に「Theano indexing gpu」について質問してから 9 分後のことです。O_o