Domanda

Sto usando theano per la classificazione (reti neurali concoluzionali)

In precedenza, ho usato i valori dei pixel dell'immagine (appiattita) come le caratteristiche del NN. Ora, voglio aggiungere funzionalità aggiuntive.
Ci è stato detto che posso concatenare quel vettore di funzionalità aggiuntive alle funzioni di immagine appiattita e quindi utilizzare come input per il livello completamente collegato, ma sto avendo problemi con quello.

Prima di tutto, è l'approccio giusto?

Ecco alcuni snippet di codice e i miei errori:
Simile all'esempio fornito dal loro sito con alcune modifiche

(dalla classe che costruisce il modello)

 # 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
.

Sotto, le variabili v e rng sono definite in precedenza. Ciò che è importante è 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)
.

(dalla classe che si allena)

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

Tuttavia, ottengo un errore quando si chiama The 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)]
.

Le forme di input rappresentano le forme di x, y e f, rispettivamente?

In caso affermativo, il terzo sembra corretto (batchsize= 5, 2 funzioni extra), ma perché è il primo scalare e il secondo a matrice?

Più dettagli:

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
.

Ho l'idea giusta o c'è un modo migliore per realizzare questo? Qualche approfondimento nel perché sto ottenendo un errore?

È stato utile?

Soluzione

Problema è stato che stavo concatenando sull'asse sbagliato.

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

avrebbe dovuto essere

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top