2015-05-27 4 views
2

Я новичок в theanano. Я пытаюсь реализовать простой линейной регрессии, но моя программа бросает следующее сообщение об ошибке:Плохой входной аргумент функции anano

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

Вот мой код:

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

Что такое объяснение за этой ошибки? (не получен из сообщения об ошибке). Заранее спасибо.

ответ

4

В Theano существует важное различие между определением графика вычислений и функцией, которая использует такой график для вычисления результата.

При определении

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

сначала создать вычислительный граф для out с точки зрения X и W. Обратите внимание, что X является чисто символической переменной, но не имеет значения, но определение для out сообщает Theano, «заданное значение для X, вот как вычислить out».

С другой стороны, predict является theano.function, который принимает вычисления график для out и фактические числовые значения для X, чтобы произвести цифровой выход. То, что вы передаете в theano.function, когда вы вызываете его, всегда должно иметь фактическое числовое значение. Так что просто нет смысла делать

y = predict(X) 

потому что X является символической переменной и не имеет фактического значения.

Причина, по которой вы хотите сделать это, заключается в том, что вы можете использовать y для дальнейшего построения графика вычислений. Но нет необходимости использовать predict для этого: вычисляющий график для predict уже доступен в переменной out, определенной ранее. Таким образом, вы можете просто удалить строку, определяющую y в целом, а затем определить ваши расходы, как

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

Остальная часть кода будет работать без изменений.

+0

Я получил его и спасибо за объяснение. – Adnan

Смежные вопросы