- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 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.')
最佳答案
在解决以下问题之前,此代码不会执行。
问题中报告的错误是由于 self.b
的类型造成的与 self.b
的更新类型不匹配。 self.b
没有指定类型,因此已推断出类型。初始值是一个 Python 整数,因此推断的类型是 int64
。更新是floatX
因为学习率为 floatX
。您无法更新int64
与 floatX
。解决方案是将初始值设置为 Python 浮点值,从而推断出 floatX
类型。更改self.b = theano.shared(value=1, name='b')
至self.b = theano.shared(value=1., name='b')
(注意1
后面的小数点)。
下一个问题是self.x
定义为矩阵,但最后一行函数调用中传递的值是向量。解决方案是 reshape x
成矩阵,例如更改x = np.arange(10)
至x = np.arange(10).reshape(1,10)
.
训练集共享变量的类型为 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
也类似.
纪元数当前没有任何影响,因为 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
不一致。我建议将它用于 x
和y
,或两者都不适用。看看logistic regression tutorial有关于此的更多指示。
Theano 函数在每次调用 fit
时都会重新编译。但你最好只编译一次并在每个 fit
上重用它.
该模型无需使用 scan
即可实现。一般来说,scan
通常仅当步骤的输出是先前步骤的输出的函数时才需要。 scan
通常也比替代方案慢得多,应尽可能避免。您可以删除scan
通过使用self.y = self.m * self.x + self.b
相反。
如果您确实使用扫描,最好通过 strict=True
启用严格模式。在 scan
打电话。
显式提供所有共享变量的类型是一种很好的做法。您这样做是为了trainset_x
和trainset_y
但不适用于self.m
和self.b
.
关于python - 当我将 numpy 数组发送到 theano 函数中的给定参数时,为什么会收到此 Theano TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34083144/
如何通过索引向量在 Theano 中索引矩阵? 更准确地说: v 的类型为 theano.tensor.vector(例如 [0,2]) A 具有 theano.tensor.matrix 类型(例如
我是theano的新手。我正在尝试实现简单的线性回归,但我的程序抛出以下错误: TypeError: ('Bad input argument to theano function with name
我有一个被多次调用的 Theano 函数,每次都使用不同的共享变量。按照现在的实现方式,Theano 函数在每次运行时都会重新定义。我假设,这会使整个程序变慢,因为每次定义 Theano 函数时,都会
我正在阅读http://deeplearning.net/tutorial/logreg.html给出的逻辑函数代码。我对函数的inputs和givens变量之间的区别感到困惑。计算微型批次中的模型所
我是 Theano 的新手。 尝试设置配置文件。 首先,我注意到我没有 .theanorc 文件: locate .theanorc - 不返回任何内容 echo $THEANORC - 不返回任何内
我不明白为什么我们在 Theano 中需要 tensor.reshape() 函数。文档中说: Returns a view of this tensor that has been reshaped
给定一个张量 v = t.vector(),我该如何翻转它?例如,[1, 2, 3, 4, 5, 6] 翻转后是 [6, 5, 4, 3, 2, 1]。 最佳答案 您可以简单地执行 v[::-1].e
我是 Theano 的新手,正在尝试一些示例。 import numpy import theano.tensor as T from theano import function import da
出于诊断目的,我定期获取网络的梯度。一种方法是将梯度作为 theano 函数的输出返回。然而,每次都将梯度从 GPU 复制到 CPU 内存可能代价高昂,所以我宁愿只定期进行。目前,我通过创建两个函数对
我阅读了网络上所有关于人们忘记将目标向量更改为矩阵的问题的帖子,由于更改后问题仍然存在,我决定在这里提出我的问题。下面提到了解决方法,但出现了新问题,我感谢您的建议! 使用卷积网络设置和带有 sigm
我需要通过扫描多次执行 theano 函数,以便总结成本函数并将其用于梯度计算。我熟悉执行此操作的深度学习教程,但我的数据切片和其他一些复杂情况意味着我需要做一些不同的事情。 下面是我正在尝试做的一个
我正在尝试学习(和比较)不同的深度学习框架,到时候它们是 Caffe 和 Theano。 http://caffe.berkeleyvision.org/gathered/examples/mnist
下面的代码: import theano import numpy as np from theano import tensor as T h1=T.as_tensor_variable(np.ze
我发现 Theano/Lasagne 的所有示例都处理像 mnist 和 cifar10 这样的小数据集,它们可以完全加载到内存中。 我的问题是如何编写高效的代码来训练大规模数据集?具体来说,为了让
我正在做图像分类,我必须检测图像是否包含飞机。 我完成了以下步骤: 1. 从图像数据集中提取特征作为描述符 2. 用 K 完成 - 表示聚类并生成描述符语料库 3.将语料数据在0-1范围内归一化并保存
一些简单的 theano 代码完美运行,当我导入 pymc3 时停止运行 为了重现错误,这里有一些片段: #Initial Theano Code (this works) import the
我在做this对于 NumPy 。 seq 是一个带有索引的列表。 IE。这实现了 1-of-k 编码(也称为 one-hot)。 def 1_of_k(seq, num_classes): nu
Keras 将数据批量加载到 GPU 上(作者注明here)。 对于小型数据集,这是非常低效的。有没有办法修改 Keras 或直接调用 Theano 函数(在 Keras 中定义模型之后)以允许将所有
Theano导入失败,theano配置cnmem = 1 知道如何确保 GPU 完全分配给 theano python 脚本吗? Note: Display is not used to avoid
例如,我可以定义一个递归 Python lambda 函数来计算斐波那契数列,如下所示: fn = lambda z: fn(z-1)+fn(z-2) if z > 1 else z 但是,如果我尝试
我是一名优秀的程序员,十分优秀!