You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)。

示例输出不符的原因

按你的模型结构逐层推导形状:

  1. 输入层形状为(None, 129, 61),三个维度分别对应批次大小、时间步长度、单时间步特征数
  2. LSTM层设置了return_sequences=True,单元数为1,因此输出保留129个时间步维度,仅将最后一个特征维度改为1,得到形状(None,129,1)
  3. 第一层Dense(hidden_layer)单元数为64,仅作用在最后一个维度,把1转换为64,前面的批次、时间步维度都保留,得到(None,129,64)
  4. 最后一层Dense单元数为1,同样仅作用在最后一个维度,把64转换为1,前两个维度保持不变,最终得到(None,129,1),和summary结果完全一致。

如果要得到你预期的(None,64,1)输出,需要额外添加维度变换层调整时间步和特征维度的顺序,或者修改LSTM的return_sequences参数取消时间步维度的保留。

内容的提问来源于stack exchange,提问作者Talha Anwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:15:06