我运行" ipython debugf.py"它给了我如下错误信息
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 :(得分:2)
将train_set_x变量更改为theano.shared变量,代码正常。 我不知道原因,但它的确有效!希望这篇文章可以帮助别人。 正确的代码如下
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
答案 1 :(得分:1)
发生这种情况的原因是因为index是一个张量符号变量(一个长标量,如第4行所示)。因此,当python尝试构建theano需要其“给定”输入的字典时,它会尝试使用符号变量对numpy数组进行切片 - 这显然是不能做的,因为它还没有值(它只是在向函数输入内容时设置。)
正如您已经意识到通过theano传播数据。共享是最好的方法。这意味着可以将所有训练数据卸载到GPU,然后在运行中切片/索引以运行每个示例。
但是,您可能会发现有太多的训练数据要适合GPU的内存,或者出于其他原因不想使用共享变量。然后你可以改变你的功能定义
data = T.matrix()
fff=theano.function(inputs=[data],
outputs=cost,
givens={x: data}
)
然后而不是写
fff(index)
你写
fff(train_set_x[index: index+1])
请注意,将数据移动到GPU上的过程很慢,因此尽可能减少传输次数要好得多。