Matrix TypeError:无法将类型TensorType(float64,vector)(变量子传感器{int64:int64:}.0)转换为类型TensorType(float64,矩阵)

Matrix TypeError:无法将类型TensorType(float64,vector)(变量子传感器{int64:int64:}.0)转换为类型TensorType(float64,矩阵),matrix,machine-learning,neural-network,theano,conv-neural-network,Matrix,Machine Learning,Neural Network,Theano,Conv Neural Network,我正在使用theano和他们的LeNet教程来训练CNN使用谷歌街景图片的数据集 我加载数据集: train_set_x, train_set_y, \ valid_set_x, valid_set_y, \ test_set_x, test_set_y = manager.get_grayscale_data_dim() 我打印了尺寸: self.train_data_dims (70000, 1024, 1) self.train_labels_dims (70000, 1) self.v

我正在使用theano和他们的LeNet教程来训练CNN使用谷歌街景图片的数据集

我加载数据集:

train_set_x, train_set_y, \
valid_set_x, valid_set_y, \
test_set_x, test_set_y = manager.get_grayscale_data_dim()
我打印了尺寸:

self.train_data_dims (70000, 1024, 1)
self.train_labels_dims (70000, 1)
self.valid_data_dims (3250, 1024, 1)
self.valid_labels_dims (3250, 1)
self.test_data_dims (26000, 1024, 1)
self.test_labels_dims (26000, 1)
然后,我按照教程中的操作:

# allocate symbolic variables for the data
index = T.lscalar()  # index to a [mini]batch
x = T.matrix('x')   # the data is presented as rasterized images
y = T.ivector('y')  # the labels are presented as 1D vector of

print "y.type", y.type, "y.ndim", y.ndim
print "test_set_y", test_set_y.type, "test_set_y.ndim", test_set_y.ndim
打印结果:

y.type TensorType(int64, vector) y.ndim 1
test_set_y TensorType(int64, vector) test_set_y.ndim 1
我在这里遇到了问题(这是定义的第一个函数,接下来是验证和训练,只是为了不让您混淆名称,并且您不认为类似的训练和验证函数一切正常):

创建一个函数来计算模型所犯的错误 确切地说,我有一个错误:

y: test_set_y[index * batch_size: (index + 1) * batch_size]
错误本身表示(afaiu)我正在尝试将smth转换为矩阵。 我想知道这是怎么回事

TypeError: Cannot convert Type TensorType(float64, vector) (of Variable Subtensor{int64:int64:}.0) into Type TensorType(float64, matrix). You can try to manually convert Subtensor{int64:int64:}.0 into a TensorType(float64, matrix).
最后,y和测试集y的尺寸一致。在我的代码中,它们都是一维向量。 为什么切片会导致错误?切片是否创建矩阵?更重要的是,我如何解决这个问题? 提前谢谢


提前感谢您的帮助

您的输入数据看起来很奇怪,特别是标签显示为矩阵,而不是向量

self.train_data_dims (70000, 1024, 1)
self.train_labels_dims (70000, 1)
self.valid_data_dims (3250, 1024, 1)
self.valid_labels_dims (3250, 1)
self.test_data_dims (26000, 1024, 1)
self.test_labels_dims (26000, 1)
为什么所有这些在最后都有一个额外的尺寸1

我认为您需要更改数据加载代码以便打印

self.train_data_dims (70000, 1024, 1)
self.train_labels_dims (70000, )
self.valid_data_dims (3250, 1024, 1)
self.valid_labels_dims (3250, )
self.test_data_dims (26000, 1024, 1)
self.test_labels_dims (26000, )
这可以确保,例如,
test\u labels
是一个向量而不是一个矩阵。

展平数组

 y_out = theano.shared(np.asarray(y, dtype=theano.config.floatX), borrow=True)
 y_out = y_out.flatten()
 y_out = T.cast(y_out, 'int32')

我在self.train_data_dims(70000,1024,1)和其他变量中添加了一个额外的维度,以使其与RGB图像的情况一致,其中维度为(70000,1024,3),最后一个对应于RGB通道。此外,在他们给出的教程中,他们以如下方式重塑X矩阵:
layer0\u input=X。重塑((批大小,1,图像行,图像列))
,其中
1
指定图像的深度。我尝试了
0
,但没有成功。此外,卷积本身是在图像的整个深度上执行的(在RGB情况下,深度=3),AFAIK。为什么标签向量不能是大小为(nx1)的矩阵?无论如何,我得到的标签尺寸是
1
。那么标签不是已经被当作向量了吗?即使在代码的开头,它们看起来像是在(nx1)矩阵中,我也不太清楚这种矩阵和向量之间的区别,只是后者指定的维数少了1个..好的,所以不需要更改数据本身,但标签确实需要是一个向量。在Theano中,形状为
(1,N)
(N,1)
的张量是一个矩阵(即它有两个维度;大小为1的维度是无关的)。由于您的代码包含
y=T.ivector('y')
标签需要以向量而不是矩阵的形式显示。
test\u set\u y.type TensorType(int32,vector)
y.type TensorType(int32,vector)
属于同一类型。但是,这行代码会导致错误:
y:test\u set\u y\u vec[index*batch\u size:(index+1)*batch\u size]
。我解决不了。我已经尝试将test\u set\u y显式声明为
T.iscalar
fill
来设置值。无法解决问题。您能否用随机值替换真实数据,并将脚本减少到仍然存在问题的最小数量,以便将其完整发布在此处?
 y_out = theano.shared(np.asarray(y, dtype=theano.config.floatX), borrow=True)
 y_out = y_out.flatten()
 y_out = T.cast(y_out, 'int32')