这是我的测试代码:
from keras import layersinput1 = layers.Input((2,3))output = layers.Dense(4)(input1)print(output)
输出结果是:
<tf.Tensor 'dense_2/add:0' shape=(?, 2, 4) dtype=float32>
但这是怎么回事?
文档中提到:
注意: 如果输入层的秩大于2,则在与核进行初始点积之前会先将其展平。
而输出结果是重塑的?
回答:
目前,与文档中所述相反,Dense
层是应用在输入张量的最后一个轴上:
与文档相反,我们实际上并没有将其展平。它是独立应用在最后一个轴上的。
换句话说,如果一个具有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: 60Trainable params: 60Non-trainable params: 0_________________________________________________________________
如你所见,Dense
层只有60个参数。这是怎么回事? Dense
层中的每个单元都与输入中每行的5个元素连接,并且使用相同的权重,因此10 * 5 + 10 (每个单元的偏置参数) = 60
。
更新。 这里是上述示例的视觉插图: