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!
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
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,)'. –