2017-03-11 2 views
1

Wenn ich meinen Code ausführen, bekomme ich einen Wert Fehler mit der folgenden Meldung:(Nudelauflauf) Valueerror: Eingang Dimension mis-match

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

Meine Trainingsdaten eine Matrix von Einträgen sind wie ..

[ 815.257786 320.447 310.841] 

und die Chargen ich meine Trainingsfunktion bin Eingabe haben eine Form von (batch_size, 3) und Typ TensorType (float64, Matrix)

Mein neuronales Netz ist sehr einfach:

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 
    ) 

Meine Verlustfunktion ist:

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

ich ein wenig verwirrt bin, warum ich eine Dimension Mismatch bekommen. Ich übergebe die richtigen Eingabe- und Bezeichnungstypen (gemäß meiner symbolischen Variablen), und die Form meiner Eingabedaten entspricht dem erwarteten 'Shape' Parameter, den ich meiner InputLayer gebe. Ich glaube, es ist ein Problem damit, wie ich die Batchgröße festlege, denn wenn ich eine Batchgröße von 1 verwende, kann mein Netzwerk ohne Probleme trainieren, und der Input [2] .shape [1] -Wert aus der Fehlermeldung ist Meine Losgröße. Ich bin ziemlich neu im maschinellen Lernen, und jede Hilfe würde sehr geschätzt werden!

Antwort

0

Es stellte sich heraus, dass mein Etiketten die falsche Dimensionalität hatte.

Meine Daten Formen hatte:

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

Und die symbolischen Eingänge zu meinem Netz waren:

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

konnte ich mein Problem y_train durch Umformen lösen. Ich habe dann die symbolische Ausgabevariable in eine Matrix geändert, um diese Änderungen zu berücksichtigen.

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

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