我使用Theano进行分类(卷积神经网络)
以前,我一直在使用(展平的)图像的像素值作为NN的特征。 现在,我想添加其他功能。我已经被告知我可以将平面图像特征的附加特征向量连接起来,然后将其用作完全连接层的输入,但是我遇到了麻烦。 / p>
首先,这是正确的做法吗?
这里有一些代码段和我的错误:
与其网站提供的示例类似,但有一些修改
(来自构建模型的类)
# allocate symbolic variables for the data
self.x = T.matrix('x') # the data is presented as rasterized images
self.y = T.ivector('y') # the labels are presented as 1D vector of [int] labels
self.f = T.matrix('f') # additional features
下面,变量v
和rng
是先前定义的。重要的是layer2_input
:
layer2_input = self.layer1.output.flatten(2)
layer2_input = T.concatenate([layer2_input, self.f.flatten(2)])
self.layer2 = HiddenLayer(rng, input=layer2_input, n_in=v, n_out=200, activation=T.tanh)
(来自培训的班级)
train_model = theano.function([index], cost, updates=updates,
givens={
model.x: train_set_x[index * batch_size: (index + 1) * batch_size],
model.y: train_set_y[index * batch_size: (index + 1) * batch_size],
model.f: train_set_f[index * batch_size: (index + 1) * batch_size]
})
但是,调用train_model时出现错误:
ValueError: GpuJoin: Wrong inputs for input 1 related to inputs 0.!
Apply node that caused the error: GpuJoin(TensorConstant{0}, GpuElemwise{tanh,no_inplace}.0, GpuFlatten{2}.0)
Inputs shapes: [(), (5, 11776), (5, 2)]
Inputs strides: [(), (11776, 1), (2, 1)]
Inputs types: [TensorType(int8, scalar), CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
输入形状是否分别代表x
,y
和f
的形状?
如果是这样,第三个似乎是正确的(batchsize = 5,2个额外的特征),但为什么第一个是标量而第二个是矩阵?
更多详情:
train_set_x.shape = (61, 19200) [61 flattened images (160x120), 19200 pixels]
train_set_y.shape = (61,) [61 integer labels]
train_set_f.shape = (61,2) [2 additional features per image]
batch_size = 5
我有正确的想法还是有更好的方法来实现这一目标? 我对收到错误的原因有何见解?
答案 0 :(得分:1)
问题是我在错误的轴上连接。
layer2_input = T.concatenate([layer2_input, self.f.flatten(2)])
应该是
layer2_input = T.concatenate([layer2_input, self.f.flatten(2)], axis=1)