IndexError:无法将张量变量类型的切片条目强制转换为整数

时间:2016-08-21 10:24:59

标签: python theano

我运行" 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    

2 个答案:

答案 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上的过程很慢,因此尽可能减少传输次数要好得多。