为什么在尝试更新共享变量时会出现 Theano TypeError?
Why do I get a Theano TypeError when trying to update a shared variable?
我正在尝试 运行 对函数 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
.
一个解决方案是将共享变量也设为浮点数。这可以通过简单地在 x
.
的初始值上添加一个小数点来实现
x = theano.shared(2.)
我正在尝试 运行 对函数 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
.
一个解决方案是将共享变量也设为浮点数。这可以通过简单地在 x
.
x = theano.shared(2.)