2016-08-21 4 views
6

を整数に型tensorvariableのスライスエントリを強制しないと、私はフォーラムや運を検索はIndexError:「debugf.py ipython」私は実行

IndexError        Traceback (most recent call last) 
/home/ml/debugf.py in <module>() 
     8 fff = theano.function(inputs=[index], 
     9       outputs=cost, 
---> 10       givens={x: train_set_x[index: index+1]}) 

IndexError: failed to coerce slice entry of type TensorVariable to integer" 

以下のように、それは私にエラーメッセージを与え、誰かがそこにできています助けて ?感謝! ありがとう!
debugf.py:

import theano.tensor as T  
import theano  
import numpy  
index =T.lscalar()  
x=T.dmatrix()  
cost=x +index  
train_set_x=numpy.arange(100).reshape([20,5])  
fff=theano.function(inputs=[index],  
    outputs=cost,  
    givens={x:train_set_x[index: index+1]}) #<--- Error here  
+0

投稿の冒頭に何か不足しているようです。あなたはIndexErrorを与えましたか?あなたが 'cost = x [index:index + 1] + index'と単純に' givens = {x:shared_x} 'を置くと、 – Anthon

答えて

2

変更train_set_x theano.shared変数に変数、およびコードはOKです。 私は理由を知っていませんが、それは動作します!この投稿が他の人に役立つことを願っています。 正しいコードは(あなたが4行目で見ることができるように長いスカラ、)インデックスはテンソルシンボリック変数であるため、この問題が発生した理由があるとして

import theano.tensor as T  
import theano  
import numpy  
index =T.lscalar()  
x=T.dmatrix()  
cost=x +index  
train_set_x=numpy.arange(100.).reshape([20,5]) #<--- change to float, 
            #because shared must be floatX type 

#change to shared variable 
shared_x = theano.shared(train_set_x) 

fff=theano.function(inputs=[index],  
    outputs=cost,  
    givens={x:shared_x[index: index+1]}) #<----change to shared_x 
+0

はさらに良くなります – BGabor

1

を下回っています。だから、pythonがtheanoが '与えられた'入力に必要な辞書を構築しようとすると、シンボリック変数を使ってnumpy配列をスライスしようとします - それはまだ値を持たないのでできません関数に何かを入力すると設定されます)。

あなたが実現したように、theano.sharedを通じてデータを渡すことが最善の方法です。つまり、すべてのトレーニングデータをGPUにオフロードし、各サンプルを実行するためにオンザフライでスライス/インデックス作成することができます。

しかし、GPUのメモリに収まるようにトレーニングデータが多すぎることや、共有変数を使用したくないなどの理由が考えられます。次に、あなただけのあなたが

fff(train_set_x[index: index+1]) 

はGPUが遅い上にデータを移動するプロセスを注意して書く

fff(index) 

を書くのではなく、その後、あなたの関数定義

data = T.matrix() 
fff=theano.function(inputs=[data], 
    outputs=cost, 
    givens={x: data} 
) 

を変えることができるので、それはです可能であれば、転送回数を最小限にする方がはるかに優れています。

関連する問題