Pregunta

Estoy usando Theano para clasificación (redes neuronales convolucionales)

Anteriormente, he estado usando los valores de píxeles de la imagen (aplanada) como características de NN.Ahora quiero agregar funciones adicionales.
Me dijeron que puedo concatenar ese vector de características adicionales a las características de la imagen aplanada y luego usarlo como entrada a la capa completamente conectada, pero tengo problemas con eso.

En primer lugar, ¿es ese el enfoque correcto?

Aquí hay algunos fragmentos de código y mis errores:
Similar al ejemplo proporcionado en su sitio con algunas modificaciones.

(de la clase que construye el modelo)

 # 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

Abajo, variables v y rng están definidos previamente.Lo importante es 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)

(de la clase que entrena)

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]
          })

Sin embargo, aparece un error cuando se llama a 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)]

¿Las formas de entrada representan las formas de x, y y f, respectivamente?

Si es así, el tercero parece correcto (tamaño de lote = 5, 2 características adicionales), pero ¿por qué el primero es un escalar y el segundo una matriz?

Más detalles:

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

¿Tengo la idea correcta o hay una mejor manera de lograrlo?¿Alguna idea de por qué recibo un error?

¿Fue útil?

Solución

El problema fue que estaba concatenando en el eje equivocado.

layer2_input = T.concatenate([layer2_input, self.f.flatten(2)])

debería haber sido

layer2_input = T.concatenate([layer2_input, self.f.flatten(2)], axis=1)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top