Keras Dense层的输入未展平

时间:2018-08-30 05:10:58

标签: python tensorflow machine-learning keras keras-layer

这是我的测试代码:

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,则为   在具有内核的初始点积之前变平。

输出会被重塑吗?

1 个答案:

答案 0 :(得分:9)

当前,与文档中所述相反,Denseis applied on the last axis of input tensor

  

与文档相反,我们实际上并未对其进行拼合。它的   单独应用于最后一个轴。

换句话说,如果将具有Dense单位的m层应用于形状为(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


更新。这是上面示例的直观图示:

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