简体   繁体   中英

Linear Regression with Theano - Dimension Mis-match

I am familiarizing myself with Theano and machine learning. To that end, I'd like to calculate a linear regression. My code is inspired by the logistic regression example from the introduction to Theano.

I wrote the following 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()

Unfortunately, Python returns the following error message when I run the code:

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.

I suspect the error is related to the sample data being of dimension (50,1) and the regressor only of dimension of (1,1). Nevertheless, I failed to correct the error in my code since some time. Can somebody provide a hint for how to correct the mistake? I'm grateful for any help!

You need to broadcast b :

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

I would expect Theano to do this automatically, but it seems this is not the case.


To locate the problem follow the error message suggestion and run Theano with high exception verbosity

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

This produces quite a lot of output including the problematic node along with its operands

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

The node corresponds to a subtraction of b from a temporary node CGemv{no_inplace} . The only line of code involving b is

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM