2017-03-11 1 views
1

Quand je lance mon code, je reçois une erreur de valeur avec le message suivant:(lasagnes) ValueError: dimension entrée désadaptation

ValueError: Input dimension mis-match. (input[0].shape[1] = 1, input[2].shape[1] = 20) 
Apply node that caused the error: Elemwise{Composite{((i0 + i1) - i2)}}[(0, 0)](Dot22.0, InplaceDimShuffle{x,0}.0, InplaceDimShuffle{x,0}.0) 
Toposort index: 18 
Inputs types: [TensorType(float64, matrix), TensorType(float64, row), TensorType(float64, row)] 
Inputs shapes: [(20, 1), (1, 1), (1, 20)] 
Inputs strides: [(8, 8), (8, 8), (160, 8)] 
Inputs values: ['not shown', array([[ 0.]]), 'not shown'] 
Outputs clients: [[Elemwise{Composite{((i0 * i1)/i2)}}(TensorConstant{(1, 1) of 2.0}, Elemwise{Composite{((i0 + i1) - i2)}}[(0, 0)].0, Elemwise{mul,no_inplace}.0), Elemwise{Sqr}[(0, 0)](Elemwise{Composite{((i0 + i1) - i2)}}[(0, 0)].0)]] 

Mes données de formation est une matrice d'entrées telles que ..

[ 815.257786 320.447 310.841] 

et les lots que je suis à ma fonction entrer des de formation ont une forme de (batch_size, 3) et le typeTensorType (float64, matrice)

Mon réseau de neurones est très simple:

self.inpt = T.dmatrix('inpt') 
    self.out = T.dvector('out') 

    self.network_in = nnet.layers.InputLayer(shape=(BATCH_SIZE, 3), input_var=self.inpt) 
    self.l0   = nnet.layers.DenseLayer(self.network_in, num_units=40, 
         nonlinearity=nnet.nonlinearities.rectify, 
    ) 
    self.network = nnet.layers.DenseLayer(self.l0, num_units=1, 
         nonlinearity=nnet.nonlinearities.linear 
    ) 

Ma fonction de perte est:

pred = nnet.layers.get_output(self.network) 
    loss = nnet.objectives.squared_error(pred, self.out) 
    loss = loss.mean() 

Je suis un peu confus quant à la raison pour laquelle je reçois un décalage de dimension. Je passe les types d'entrée et d'étiquette corrects (selon mes variables symboliques), et la forme de mes données d'entrée correspond au paramètre 'shape' attendu que je donne à InputLayer. Je crois que c'est un problème avec la façon dont je spécifie la taille du lot, car quand j'utilise une taille de lot de 1, mon réseau peut s'entraîner sans aucun problème, et la valeur d'entrée [2] .shape [1] du message d'erreur est ma taille de lot. Je suis tout à fait nouveau à l'apprentissage automatique, et toute aide serait grandement appréciée!

Répondre

0

Il s'avère que le problème était que mes étiquettes avaient la mauvaise dimensionnalité.

Mes données avaient des formes:

x_train.shape == (batch_size, 3) 
y_train.shape == (batch_size,) 

et les entrées symboliques à mon filet étaient:

self.inpt = T.dmatrix('inpt') 
self.out = T.dvector('out') 

j'ai pu résoudre mon problème en réorganisant y_train. J'ai ensuite changé la variable de sortie symbolique en une matrice pour tenir compte de ces changements.

y_train = np.reshape(y_train, y_train.shape + (1,)) 
# y_train.shape == (batch_size, 1) 

self.out = T.dmatrix('out')