Adnan
Adnan

Reputation: 182

Bad input argument to theano function

I am new to theano. I am trying to implement simple linear regression but my program throws following error:

TypeError: ('Bad input argument to theano function with name "/home/akhan/Theano-Project/uog/theano_application/linear_regression.py:36" at index 0(0-based)', 'Expected an array-like object, but found a Variable: maybe you are trying to call a function on a (possibly shared) variable instead of a numeric array?')

Here is my code:

import theano
from theano import tensor as T
import numpy as np
import matplotlib.pyplot as plt

x_points=np.zeros((9,3),float)
x_points[:,0] = 1
x_points[:,1] = np.arange(1,10,1)
x_points[:,2] = np.arange(1,10,1) 
y_points = np.arange(3,30,3) + 1


X = T.vector('X')
Y = T.scalar('Y')

W = theano.shared(
            value=np.zeros(
                (3,1),
                dtype=theano.config.floatX
            ),
            name='W',
            borrow=True
        )

out = T.dot(X, W)
predict = theano.function(inputs=[X], outputs=out)

y = predict(X)  # y = T.dot(X, W) work fine

cost = T.mean(T.sqr(y-Y))

gradient=T.grad(cost=cost,wrt=W)

updates = [[W,W-gradient*0.01]]

train = theano.function(inputs=[X,Y], outputs=cost, updates=updates, allow_input_downcast=True)


for i in np.arange(x_points.shape[0]):
    print "iteration" + str(i)
    train(x_points[i,:],y_points[i])

sample = np.arange(x_points.shape[0])+1
y_p = np.dot(x_points,W.get_value())
plt.plot(sample,y_p,'r-',sample,y_points,'ro')
plt.show()

What is the explanation behind this error? (didn't got from the error message). Thanks in Advance.

Upvotes: 3

Views: 2971

Answers (1)

cfh
cfh

Reputation: 4666

There's an important distinction in Theano between defining a computation graph and a function which uses such a graph to compute a result.

When you define

out = T.dot(X, W)
predict = theano.function(inputs=[X], outputs=out)

you first set up a computation graph for out in terms of X and W. Note that X is a purely symbolic variable, it doesn't have any value, but the definition for out tells Theano, "given a value for X, this is how to compute out".

On the other hand, predict is a theano.function which takes the computation graph for out and actual numeric values for X to produce a numeric output. What you pass into a theano.function when you call it always has to have an actual numeric value. So it simply makes no sense to do

y = predict(X)

because X is a symbolic variable and doesn't have an actual value.

The reason you want to do this is so that you can use y to further build your computation graph. But there is no need to use predict for this: the computation graph for predict is already available in the variable out defined earlier. So you can simply remove the line defining y altogether and then define your cost as

cost = T.mean(T.sqr(out - Y))

The rest of the code will then work unmodified.

Upvotes: 5

Related Questions