Keras中Flatten与GRU层input_shape差异原因解析
我在一本图书的示例中发现,输入形状为(samples=128, timesteps=24, features=13),当定义两个接收该相同输入的不同网络时,Flatten层与GRU层的input_shape设置存在差异。
模型1(Flatten+全连接)代码:
model = Sequential() model.add(layers.Flatten(input_shape=(24, 13))) model.add(layers.Dense(32, activation='relu')) model.add(layers.Dense(1))
模型2(GRU+全连接)代码:
model = Sequential() model.add(layers.GRU(32, input_shape=(None, 13))) model.add(layers.Dense(1))
我理解input_shape代表单个输入的形状(不考虑批量大小),因此认为两种情况下的input_shape都应为(24, 13),想请教为何这两个模型的input_shape设置不同?
解答
这是因为Flatten层和GRU层对输入维度的处理逻辑完全不同:
Flatten层的特性:它的作用是把多维输入直接展平成一维向量,比如
(24,13)会被转换成(312,)。这个转换需要明确知道输入的每个维度的固定数值,否则无法计算展平后的总长度。所以必须指定完整的(24,13)作为input_shape,不能用None替代其中任何一个维度。GRU层的特性:作为循环神经网络层,GRU是按时间步依次处理序列数据的,它的权重只和特征维度(这里是13)绑定,和时间步的长度无关。所以它支持处理变长序列——也就是时间步可以是任意值(用
None表示)。写input_shape=(None,13)是告诉模型:特征数固定为13,但输入的时间步长度可以灵活变化(比如24、30、48都可以),这样模型的通用性更强。当然你也可以写成(24,13),但这样模型就只能处理时间步固定为24的输入了。
简单来说,input_shape的设置要匹配层的功能:静态维度转换的层需要固定维度,循环层因为天生支持变长序列,所以允许时间步维度用None来适配更多场景。
内容的提问来源于stack exchange,提问作者imatiasmb

