python - 为什么在尝试更新共享变量时会出现 Theano TypeError?

标签 python theano

我正在尝试对函数 y=x^2 运行一个非常简单的梯度下降。 我尝试使用以下代码实现它:

import theano
from theano import tensor as T
x = theano.shared(2)
y = x ** 2

dy_dx = T.grad(y, x)
learning_rate = 1
updates = [(x, x - learning_rate * dy_dx)]
fn = theano.function([], [y], updates = updates)

但是当我尝试编译函数“fn”时,出现以下错误:

TypeError: ('An update must have the same type as the original shared 
variable (shared_var=<TensorType(int64, scalar)>, 
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.')

我认为这可能是 learning_rate 变量的问题,因为它可能与 x 共享变量不是同一类型,但是如果我修改代码如下:

updates = [(x, x - dy_dx)]

我仍然遇到同样的错误。

我卡住了 :( 有什么想法吗?

最佳答案

问题是您的共享变量 x 没有指定类型,因此正在推断。由于您提供的值是 Python 整数文字,因此假定类型为 int32。这是一个问题,因为梯度不能很好地处理整数,所以 dy_dx 实际上是一个 float64。这反过来也使更新值成为 float64。共享变量只能用相同类型的值更新(这是错误消息)所以你遇到了问题:共享变量是 int32 但更新是 float64.

一种解决方案是将共享变量也设为 float 。这可以通过简单地在 x 的初始值上加上一个小数点来实现。

x = theano.shared(2.)

关于python - 为什么在尝试更新共享变量时会出现 Theano TypeError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33229748/

相关文章:

python - 自定义 View 在带有 Elastic Search 的 Django Haystack 中不显示结果

python - Theano GPU 计算比 numpy 慢

python-2.7 - Theano 获得张量中的唯一值

python - Nvidia Theano docker 图像不可用

python - tkinter 的 Tk 和 Toplevel 类有什么区别?

python : no module named selenium

python - 如何从手绘电路的扫描图像中检测逻辑门?

python - 将 CudaNdarraySharedVariable 转换为 TensorVariable

python - Anaconda Theano - 安装错误

python - 不考虑子包中的文件