Keras Dense 层输入未展平

Posted

技术标签:

【中文标题】Keras Dense 层输入未展平【英文标题】:Keras Dense layer's input is not flattened 【发布时间】:2019-02-04 23:02:53 【问题描述】:

这是我的测试代码:

from keras import layers
input1 = layers.Input((2,3))
output = layers.Dense(4)(input1)
print(output)

输出是:

<tf.Tensor 'dense_2/add:0' shape=(?, 2, 4) dtype=float32>

但是发生了什么?

文档说:

注意:如果层的输入的秩大于 2,那么它是 在与内核的初始点积之前展平。

虽然输出被重塑?

【问题讨论】:

文档让我大吃一惊。我一直以为 Dense 层会在最后一个轴上计算,同时让另一个轴完好无损。 【参考方案1】:

目前,与文档中所述相反,Dense 层 is applied on the last axis of input tensor:

与文档相反,我们实际上并没有将其展平。它是 独立应用于最后一个轴。

换句话说,如果将具有m 单元的Dense 层应用于形状为(n_dim1, n_dim2, ..., n_dimk) 的输入张量,则其输出形状为(n_dim1, n_dim2, ..., m)


附带说明:这使得TimeDistributed(Dense(...))Dense(...) 彼此等价。


另一个说明:请注意,这具有共享权重的效果。例如,考虑这个玩具网络:

model = Sequential()
model.add(Dense(10, input_shape=(20, 5)))

model.summary()

模型总结:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 20, 10)            60        
=================================================================
Total params: 60
Trainable params: 60
Non-trainable params: 0
_________________________________________________________________

如您所见,Dense 层只有 60 个参数。如何? Dense 层中的每个单元都以相同的权重连接到输入中每一行的 5 个元素,因此 10 * 5 + 10 (bias params per unit) = 60


更新。以下是上述示例的直观说明:

【讨论】:

谁能给我画张图?作为图书馆的新手,我很难准确地了解连接和共享权重的位置。 很抱歉重新讨论这个话题,因为我认为我不应该为此提出新问题。共享权重效应如何影响性能?它对强化学习的性能有何影响? @PedroPabloSeverinHonorato 这是一个非常广泛的问题,答案完全取决于具体问题以及模型的架构。但总的来说,我们可以说权重共享减少了参数的数量。这反过来又使模型更小,因此可以加快模型的训练/测试。但是,不能保证权重共享也总是会提高模型的准确性。权重共享有多种方式和模式,它们在特定的问题实例或模型中可能有效,也可能无效。

以上是关于Keras Dense 层输入未展平的主要内容,如果未能解决你的问题,请参考以下文章

Keras 序列模型输入层

如何在keras中递归扩展/解析/展平嵌套模型?

Keras 输入形状错误

深度学习-Keras-层及损失函数

深度学习-Keras-层及损失函数

从Keras Layer获得权重