2016-03-24 13 views
0

Ich mache mich mit Theano und maschinellem Lernen vertraut. Zu diesem Zweck möchte ich eine lineare Regression berechnen. Mein Code ist inspiriert von der logistic regression example aus der Einleitung zu Theano.Lineare Regression mit Theano - Dimension Mis-match

Ich schrieb den folgenden Code:

import numpy 
    import theano 
    import theano.tensor as T 

    class LinearRegression(object): 
     """ Calculate Linear Regression """ 

     def __init__(self, input): 
      """ Initialize the parameters of the logistic regression 

      Parameters: 
      ----------- 

      :type input: theano.tensor.TensorType 
      :param input: symbolic variable that describes the input of the 
          architecture (one minibatch) 
      """ 
      self.W = theano.shared(
       value=numpy.zeros(1, dtype=theano.config.floatX), 
       name='W', borrow=True 
      ) 

      self.b = theano.shared(
       value=numpy.zeros(1, dtype=theano.config.floatX), 
       name='b', borrow=True 
      ) 

      self.y_pred = T.dot(input, self.W) + self.b 

     def errors(self, y): 
      """ The squared distance 

      Parameters: 
      ---------- 

      :y input: array_like: 
      :param input: the sample data 

      """ 
      errors = y- self.y_pred 
      return T.sum(T.pow(errors, 2)) 


    def sgd_optimization(learning_rate=0.0013, n_epochs=100): 
     """ 
     Demonstrate stochastic gradient descent optimization of a linear model 

     Parameters: 
     ----- 
     :type learning_rate: float 
     :param learning_rate: learning rate used (factor for the stochastic 
           gradient) 

     :type n_epochs: int 
     :param n_epochs: maximal number of epochs to run the optimizer 
     """ 
     x_train = numpy.random.uniform(low=-2, high = 2, size=(50,1)) 
     epsilon = numpy.random.normal(scale=0.01, size=50) 
     y_train = numpy.squeeze(2*x_train) + epsilon 

     costs = [] 
     eta0, x, y = T.scalar('eta0'), T.matrix(name='x'), T.vector(name='y') 

     classifier = LinearRegression(input = x) 
     cost = classifier.errors(y) 
     g_W = T.grad(cost=cost, wrt=classifier.W) 
     g_b = T.grad(cost=cost, wrt=classifier.b) 
     update = [(classifier.W, classifier.W - eta0 * g_W), 
        (classifier.b, classifier.b - eta0 * g_b)] 

     train = theano.function(inputs = [eta0], 
           outputs = cost, 
           updates = update, 
           givens = {x: x_train, y: y_train}) 

     for _ in range(n_epochs): 
      costs.append(train(learning_rate)) 

     return costs, w 

    SSE, regressor = sgd_optimization() 

Leider Python gibt die folgende Fehlermeldung angezeigt, wenn ich den Code ausführen:

ValueError: Input dimension mis-match. (input[0].shape[0] = 1, input[1].shape[0] = 50) 
Apply node that caused the error: Elemwise{Composite{((-i0) + i1)}}[(0, 1)](b, CGemv{no_inplace}.0) 
Inputs types: [TensorType(float64, vector), TensorType(float64, vector)] 
Inputs shapes: [(1,), (50,)] 
Inputs strides: [(8,), (8,)] 
Inputs values: [array([ 0.]), 'not shown'] 

HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'. 
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node. 

Ich vermute, dass der Fehler auf die Daten Probe in Beziehung gesetzt wird, von Dimension (50,1) und der Regressor nur der Dimension von (1,1). Trotzdem habe ich den Fehler in meinem Code seit einiger Zeit nicht mehr korrigieren können. Kann jemand einen Hinweis geben, wie der Fehler behoben werden kann? Ich bin dankbar für jede Hilfe!

Antwort

1

Sie müssen b auszustrahlen:

self.y_pred = T.dot(input, self.W) + self.b[:, None] 

Ich würde Theano erwarten, dass dies automatisch zu tun, aber es scheint dies nicht der Fall ist.


Um das Problem folgen der Fehlermeldung Vorschlag und führt Theano mit hohen Ausnahme Ausführlichkeit

$ THEANO_FLAGS='exception_verbosity=high' python path/to/script.py 

Dies erzeugt eine ganze Reihe von Ausgang einschließlich dem problematischen Knoten zu lokalisieren zusammen mit seinen Operanden

Debugprint of the apply node: 
Elemwise{Composite{((-i0) + i1)}}[(0, 1)] [@A] <TensorType(float64, vector)> '' 
|b [@B] <TensorType(float64, vector)> 
|CGemv{no_inplace} [@C] <TensorType(float64, vector)> '' 
    |<TensorType(float64, vector)> [@D] <TensorType(float64, vector)> 
    |TensorConstant{-1.0} [@E] <TensorType(float64, scalar)> 
    |<TensorType(float64, matrix)> [@F] <TensorType(float64, matrix)> 
    |W [@G] <TensorType(float64, vector)> 
    |TensorConstant{1.0} [@H] <TensorType(float64, scalar)> 

Der Knoten entspricht einer Subtraktion von b von einem temporären Knoten CGemv{no_inplace}. Die einzige Codezeile mit b ist

self.y_pred = T.dot(input, self.W) + self.b 
+0

Vielen Dank für Ihre Antwort. Ihr Vorschlag hat das Problem behoben. Können Sie bitte etwas auf Ihre Antwort eingehen? Wie ist Ihnen aus der Fehlermeldung klar geworden, dass ich den Bias nicht korrekt übertragen habe? – fabian

+0

Ich habe die Antwort mit den Details aktualisiert. Beachten Sie, dass die ursprüngliche Fehlermeldung die gleichen Informationen enthielt, einschließlich der nicht übereinstimmenden Formen: '(1,)' und '(50,)'. –

Verwandte Themen