【问题标题】:Theano broadcasting different to numpy'sTheano 广播与 numpy 不同
【发布时间】:2014-12-21 20:21:42
【问题描述】:

考虑以下 numpy 广播示例:

import numpy as np
import theano
from theano import tensor as T

xval = np.array([[1, 2, 3], [4, 5, 6]])
bval = np.array([[10, 20, 30]])
print xval + bval

正如预期的那样,向量bval被添加到矩阵xval的每一行,输出为:

[[11 22 33]
 [14 25 36]]

尝试在 git 版本的 theano 中复制相同的行为:

x = T.dmatrix('x')
b = theano.shared(bval)
z = x + b
f = theano.function([x], z)

print f(xval)

我收到以下错误:

ValueError: Input dimension mis-match. (input[0].shape[0] = 2, input[1].shape[0] = 1)
Apply node that caused the error: Elemwise{add,no_inplace}(x, <TensorType(int64, matrix)>)
Inputs types: [TensorType(float64, matrix), TensorType(int64, matrix)]
Inputs shapes: [(2, 3), (1, 3)]
Inputs strides: [(24, 8), (24, 8)]
Inputs scalar values: ['not scalar', 'not scalar']

我了解Tensor 对象(例如x)具有broadcastable 属性,但我无法找到一种方法来1)为shared 对象正确设置它或2)正确推断。如何在 theano 中重新实现 numpy 的行为?

【问题讨论】:

    标签: numpy matrix theano


    【解决方案1】:

    Theano 需要在编译之前在图中声明所有可广播的维度。 NumPy 使用运行时形状信息。

    默认情况下,所有共享变量尺寸都是不可广播的,因为它们的形状可能会改变。

    要创建具有示例中所需的可广播维度的共享变量:

    b = theano.shared(bval, broadcastable=(True,False))
    

    我会将此信息添加到文档中。

    【讨论】:

    • 它在那里:deeplearning.net/software/theano/library/compile/… 你在哪里找的?也许我们也需要在另一个地方添加它。
    • 啊抱歉,它在 kwargs 里……没看到。无论如何,我认为这是一个重要的功能,可能需要更多的知名度?
    • 我在本节末尾添加了一条注释(尚未合并,但在 PR 中)deeplearning.net/software/theano/tutorial/…
    • 这里有什么限制吗?对于大多数(但不是所有)广播模式,我得到“TypeError:找不到合适的 SharedVariable 构造函数。您确定支持所有 kwargs 吗?我们不支持参数 dtype 或 type。”。我没有意识到有效的广播模式是有限制的。
    • 如何设置子张量的可广播属性,这些子张量是由选择索引产生的,而不是共享的?谢谢!在这里查看我的问题:stackoverflow.com/questions/38309429/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多