gpt4 book ai didi

python - 当我将 numpy 数组发送到 theano 函数中的给定参数时,为什么会收到此 Theano TypeError

转载 作者:太空宇宙 更新时间:2023-11-03 17:11:02 25 4
gpt4 key购买 nike

我是 theano 的新手,一方面仍在与 theano 的“伪代码”风格作斗争,另一方面又在严格的类型检查中挣扎。我更多的是一个C程序员和一个Python程序员。有人可以指出我在这个示例代码中出错的地方吗?该示例代码使用 x 值的预测 y 点和训练 y 点之间的均方误差,以获得线性拟合的最佳斜率和截距?

代码如下:

import numpy as np
import theano
import theano.tensor as T
from collections import OrderedDict

class LinearModel:
def __init__(self,num_points):
self.m = theano.shared(value=0.1,name='m')
self.b = theano.shared(value=1, name='b')
self.params = [self.m, self.b]

def step(x_t):
y_t = self.m * x_t + self.b
return y_t

self.x = T.matrix('x',dtype=theano.config.floatX)
self.y, _ = theano.scan(
fn=step,
sequences=self.x,
)

self.loss = lambda y_train: self.mse(y_train)

def mse(self, y_train):
return T.mean((self.y - y_train) ** 2)

def fit(self,x, y, learning_rate=0.01, num_iter=100):
trainset_x = theano.tensor._shared(x.astype(np.dtype(np.float32)),borrow=True)
trainset_y = theano.tensor._shared(y.astype(np.dtype(np.float32)),borrow=True)
n_train = trainset_x.get_value(borrow=True).shape[0]

cost = self.loss(trainset_y)
gparams = T.grad(cost,self.params)

l_r = T.scalar('l_r', dtype=theano.config.floatX)

updates = OrderedDict()
for param,gparam in zip(self.params,gparams):
updates[param] = param - l_r * gparam

self.train_model = theano.function( inputs=[l_r],
outputs=[cost,self.y],
updates=updates,
givens={
self.x: trainset_x,
}
)

epoch = 0
while epoch < num_iter:
cost, _ = self.train_model(learning_rate)
m = self.m.get_value()
b = self.b.get_value()
print "epoch: ",epoch," cost: ",cost," m: ",m," b: ",b


if __name__ == '__main__':
lin = LinearModel(10)
x = np.arange(10)
y = np.random.rand(10)
lin.fit(x,y,learning_rate=0.01,num_iter=100)
<小时/>

错误是:

Traceback (most recent call last): File "~/EclipseWorkspace/MemoryNetworkQA.Theano/linear_regression.py", line 70, in lin.fit(x,y,learning_rate=0.01,num_iter=100) File "~/EclipseWorkspace/MemoryNetworkQA.Theano/linear_regression.py", line 54, in fit self.x: trainset_x, File "/usr/local/lib/python2.7/dist-packages/theano/compile/function.py", line 266, in function profile=profile) File "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", line 489, in pfunc no_default_updates=no_default_updates) File "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", line 217, in rebuild_collect_shared raise TypeError(err_msg, err_sug)

TypeError: ('An update must have the same type as the original shared variable (shared_var=b, shared_var.type=TensorType(int64, scalar), update_val=Elemwise{sub,no_inplace}.0, update_val.type=TensorType(float64, scalar)).', 'If the difference is related to the broadcast pattern, you can call the tensor.unbroadcast(var, axis_to_unbroadcast[, ...]) function to remove broadcastable dimensions.')

最佳答案

在解决以下问题之前,此代码不会执行。

  1. 问题中报告的错误是由于 self.b 的类型造成的与 self.b 的更新类型不匹配。 self.b没有指定类型,因此已推断出类型。初始值是一个 Python 整数,因此推断的类型是 int64 。更新是floatX因为学习率为 floatX 。您无法更新int64floatX 。解决方案是将初始值设置为 Python 浮点值,从而推断出 floatX类型。更改self.b = theano.shared(value=1, name='b')self.b = theano.shared(value=1., name='b') (注意1后面的小数点)。

  2. 下一个问题是self.x定义为矩阵,但最后一行函数调用中传递的值是向量。解决方案是 reshape x成矩阵,例如更改x = np.arange(10)x = np.arange(10).reshape(1,10) .

  3. 训练集共享变量的类型为 float32但这与使用 floatX 的代码的其他区域发生冲突。如果您floatX=float32那么应该没有问题,但简单地使用 floatX 会更安全始终保持相同的 float 类型。更改trainset_x = theano.tensor._shared(x.astype(np.dtype(np.float32)),borrow=True)trainset_x = theano.tensor._shared(x.astype(theano.config.floatX),borrow=True) trainset_y 也类似.

  4. 纪元数当前没有任何影响,因为 epoch没有被增加。更改while epoch < num_iter:for epoch in xrange(num_iter):并删除 epoch = 0 .

此外,

  • 参数看起来没有更新,但这是一个错误的 View 。由于上面的问题4,迭代很快就不会停止,并且学习率足够大,使得模型收敛得非常快。尝试将学习率更改为更小的值,例如0.0001,并仅查看前 100 个时期的输出。

  • 我建议避免使用 theano.tensor._shared除非你确实需要在 device=gpu 时强制在 CPU 上分配共享变量。 。首选方法是 theano.shared .

  • n_train变量没有在任何地方使用。

  • 您正在使用givens不一致。我建议将它用于 xy ,或两者都不适用。看看logistic regression tutorial有关于此的更多指示。

  • Theano 函数在每次调用 fit 时都会重新编译。但你最好只编译一次并在每个 fit 上重用它.

  • 该模型无需使用 scan 即可实现。一般来说,scan通常仅当步骤的输出是先前步骤的输出的函数时才需要。 scan通常也比替代方案慢得多,应尽可能避免。您可以删除scan通过使用self.y = self.m * self.x + self.b相反。

  • 如果您确实使用扫描,最好通过 strict=True 启用严格模式。在 scan打电话。

  • 显式提供所有共享变量的类型是一种很好的做法。您这样做是为了trainset_xtrainset_y但不适用于self.mself.b .

关于python - 当我将 numpy 数组发送到 theano 函数中的给定参数时,为什么会收到此 Theano TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34083144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com