我是theano的新手.我试图实现简单的线性回归,但我的程序抛出以下错误:
TypeError :('ofano函数的错误输入参数,名称为"/home/akhan/Theano-Project/uog/theano_application/linear_regression.py:36",索引0(从0开始)','预期类似于数组的对象,但是找到了一个变量:也许你试图在(可能是共享的)变量而不是数值数组上调用函数?')
这是我的代码:
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()
Run Code Online (Sandbox Code Playgroud)
这个错误背后的解释是什么?(没有从错误消息中获得).提前致谢.
在Theano中定义计算图和使用这样的图计算结果的函数之间有一个重要的区别.
当你定义
out = T.dot(X, W)
predict = theano.function(inputs=[X], outputs=out)
Run Code Online (Sandbox Code Playgroud)
首先out根据X和设置计算图W.请注意,这X是一个纯粹的符号变量,它没有任何值,但定义out告诉Theano,"给定值X,这是如何计算out".
另一方面,predict是theano.function将计算图out和实际数值用于X产生数字输出的a.theano.function当你调用它时传入的内容总是必须有一个实际的数值.所以这样做毫无意义
y = predict(X)
Run Code Online (Sandbox Code Playgroud)
因为它X是一个符号变量而没有实际值.
您希望这样做的原因是您可以使用y进一步构建计算图.但是没有必要使用predict它:计算图predict已经在out前面定义的变量中可用.因此,您只需删除y完全定义的行,然后将成本定义为
cost = T.mean(T.sqr(out - Y))
Run Code Online (Sandbox Code Playgroud)
其余代码将不加修改地工作.
| 归档时间: |
|
| 查看次数: |
2763 次 |
| 最近记录: |