【问题标题】:Why does keras function "expand_dims" change the type?为什么keras函数“expand_dims”会改变类型?
【发布时间】:2017-08-15 08:16:15
【问题描述】:

我正在使用带有 theano 后端的 keras。现在我有一个变量 x,它是一个带有类型字段“TensorType(float32, 3D)”的 theano 张量。
我加了

    from keras import backend as K

在我的文件的开头。然后我写道:

    x = K.expand_dims(x, dim = 1)

我希望 x 的类型字段应该是“TensorType(float32, 4D)”。但是,它是“TensorType(float32, (False, True, False, False))”,我无法弄清楚原因。此外,keras 的文档没有提供此功能的更多信息,它只是说“在索引“dim”处添加 1 尺寸的维度”。
此外,如果我执行

    x = K.squeeze(x, 1)

,x的类型字段将是“TensorType(float32, matrix)”,这是预期的。

【问题讨论】:

    标签: theano keras keras-layer


    【解决方案1】:

    命令expand_dims 具有dimshuffle 引擎盖下的Theano 操作。元组(False, True, False, False) 告诉您可广播的维度。你可能知道 Numpy 的广播能力。它与一些关键区别相似。

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

    请参阅thisthis 了解更多详情。

    在您的 4-D 数组的情况下,第二维,即频道是可广播的。因此,让我们假设您的 4-D 数组大小为(10,N,20,30)。现在,您可以对 4-D 数组和另一个大小为 (10,1,20,30) 的数组进行逐元素乘法,而无需重复第二维 N 次。这称为广播。现在您尝试将您的 4-D 数组与另一个大小为 (1,N,20,30) 的数组相乘。这将失败,因为第一个维度不可广播。我希望这很清楚。

    【讨论】:

    • 我了解广播机制。实际上,我正在尝试将TensorType(float32, 4D) 的张量压缩为TensorType(float32, 3D) 的张量,对其进行操作,然后将其恢复为TensorType(float32, 4D) 的张量。但是,我可以将其恢复为TensorType(float32, (False, True, False, False)) 的张量,我想知道如何将其恢复为TensorType(float32, 4D) 的张量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多