theano 函数的错误输入参数
Bad input argument to theano function
我是theano的新手。我正在尝试实现简单的线性回归,但我的程序抛出以下错误:
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()
此错误背后的解释是什么? (没有从错误消息中得到)。提前致谢。
在 Theano 中,定义计算图和使用此类图计算结果的函数之间存在重要区别。
当你定义
out = T.dot(X, W)
predict = theano.function(inputs=[X], outputs=out)
你首先根据X
和W
建立了out
的计算图。请注意 X
是一个纯符号变量,它没有任何值,但是 out
的定义告诉 Theano,"given a value for X
, this is how to compute out
".
另一方面,predict
是一个 theano.function
,它采用 out
的计算图和 X
的实际数值来生成数字输出。调用 theano.function
时传入的内容始终必须具有实际数值。所以这样做根本没有意义
y = predict(X)
因为X
是一个符号变量,没有实际值。
您想这样做的原因是您可以使用 y
进一步构建您的计算图。但是不需要为此使用 predict
:predict
的计算图已经在前面定义的变量 out
中可用。因此,您可以简单地完全删除定义 y
的行,然后将成本定义为
cost = T.mean(T.sqr(out - Y))
其余代码将不加修改地工作。
我是theano的新手。我正在尝试实现简单的线性回归,但我的程序抛出以下错误:
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()
此错误背后的解释是什么? (没有从错误消息中得到)。提前致谢。
在 Theano 中,定义计算图和使用此类图计算结果的函数之间存在重要区别。
当你定义
out = T.dot(X, W)
predict = theano.function(inputs=[X], outputs=out)
你首先根据X
和W
建立了out
的计算图。请注意 X
是一个纯符号变量,它没有任何值,但是 out
的定义告诉 Theano,"given a value for X
, this is how to compute out
".
另一方面,predict
是一个 theano.function
,它采用 out
的计算图和 X
的实际数值来生成数字输出。调用 theano.function
时传入的内容始终必须具有实际数值。所以这样做根本没有意义
y = predict(X)
因为X
是一个符号变量,没有实际值。
您想这样做的原因是您可以使用 y
进一步构建您的计算图。但是不需要为此使用 predict
:predict
的计算图已经在前面定义的变量 out
中可用。因此,您可以简单地完全删除定义 y
的行,然后将成本定义为
cost = T.mean(T.sqr(out - Y))
其余代码将不加修改地工作。