Keras模型层输出形状规则及示例模型输出与预期不符疑问
Keras层输出形状计算规则及问题解答
问题复现
你搭建的示例模型代码如下:
numberOfLSTMcells=1 n_timesteps_in=129 n_features=61 inp =Input(shape=(n_timesteps_in, n_features)) lstm= LSTM(numberOfLSTMcells,return_sequences=True, return_state=False) (inp) fc=Dense(64,activation='relu',name='hidden_layer')(lstm) out=Dense(1,activation='sigmoid',name='last_layer')(fc) model = Model(inputs=inp, outputs=out)
模型summary输出如下:
Model: "model_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_3 (InputLayer) [(None, 129, 61)] 0 _________________________________________________________________ lstm_2 (LSTM) (None, 129, 1) 252 _________________________________________________________________ hidden_layer (Dense) (None, 129, 64) 128 _________________________________________________________________ last_layer (Dense) (None, 129, 1) 65 ================================================================= Total params: 445 Trainable params: 445 Non-trainable params: 0
你预期最后一层输出为(None,64,1),和实际输出不符,核心原因是对Dense层的作用维度理解有误。
Keras常用层输出形状计算规则
- 通用维度保留规则:除了专门用于维度变换的层(如Pooling、Flatten、Reshape、全局池化类层)外,普通计算层只会修改输入张量的最后一个维度,前面的所有维度会原封不动保留。
- LSTM层输出规则:
- 当设置
return_sequences=True时,会返回所有时间步的输出,输出形状为(batch_size, 时间步长度, LSTM单元数) - 当设置
return_sequences=False时,仅返回最后一个时间步的输出,输出形状为(batch_size, LSTM单元数)
- 当设置
- Dense层输出规则:Dense层仅对输入张量的最后一个维度做全连接变换,前面的所有维度都会原样保留。假设输入形状为
(batch_size, d1, d2, ..., dn),Dense层的单元数为units,则输出形状固定为(batch_size, d1, d2, ..., units)。
示例输出不符的原因
按你的模型结构逐层推导形状:
- 输入层形状为
(None, 129, 61),三个维度分别对应批次大小、时间步长度、单时间步特征数 - LSTM层设置了
return_sequences=True,单元数为1,因此输出保留129个时间步维度,仅将最后一个特征维度改为1,得到形状(None,129,1) - 第一层Dense(hidden_layer)单元数为64,仅作用在最后一个维度,把1转换为64,前面的批次、时间步维度都保留,得到
(None,129,64) - 最后一层Dense单元数为1,同样仅作用在最后一个维度,把64转换为1,前两个维度保持不变,最终得到
(None,129,1),和summary结果完全一致。
如果要得到你预期的(None,64,1)输出,需要额外添加维度变换层调整时间步和特征维度的顺序,或者修改LSTM的return_sequences参数取消时间步维度的保留。
内容的提问来源于stack exchange,提问作者Talha Anwar
相关产品推荐
相关产品推荐

