Keras密集层的输入未被压平

11

这是我的测试代码:

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,则在与内核进行初始点积之前将其展平。

而输出则被重新塑形?


文档让我感到惊讶。我一直以为密集层会在最后一个轴上进行计算,同时保持其他轴不变。 - dennis-w
1个回答

35

目前,与文档所述相反,Dense被应用于输入张量的最后一个轴上

与文档说明相反,我们实际上没有对其进行展平。它是独立地应用于最后一个轴。

换句话说,如果在形状为(n_dim1, n_dim2, ..., n_dimk)的输入张量上应用具有m个单元的Dense层,则其输出形状为(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(每个单元的偏置参数)= 60
更新。下面是上述示例的可视化说明:

Visual illustration of applying a Dense layer on an input with two or more dimensions in Keras


1
有人能给我画个图吗?作为这个库的新手,很难准确理解连接和共享权重的位置。 - Zero
很抱歉重新提起此话题,因为我认为我不应该为此问题提出新的问题。共享权重效应如何影响性能?以及它如何影响强化学习中的性能? - Pedro Pablo Severin Honorato
@PedroPabloSeverinHonorato 这是一个非常广泛的问题,答案完全取决于具体的问题以及模型的架构。总的来说,我们可以说权重共享会减少参数数量;这反过来使得模型更小,因此可能加快模型的训练/测试速度。然而,并不能保证权重共享总是会增加模型的准确性。有各种不同的权重共享方式和模式,可能在特定的问题实例或模型中行之有效或有益,也可能不行。 - today

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接