【发布时间】:2018-04-04 10:35:24
【问题描述】:
有没有详细的解释 TimeDistributed、stateful 和 return_sequences 是如何工作的?在这两种情况下我都必须设置 shuffle=False 吗?它适用于windows(1-11、2-12、3-13等)还是应该批量使用(1-11、12-22、13-33等)
我对 LSTM 层特别感兴趣。
【问题讨论】:
有没有详细的解释 TimeDistributed、stateful 和 return_sequences 是如何工作的?在这两种情况下我都必须设置 shuffle=False 吗?它适用于windows(1-11、2-12、3-13等)还是应该批量使用(1-11、12-22、13-33等)
我对 LSTM 层特别感兴趣。
【问题讨论】:
这不会影响图层的工作方式。 这样做的目的是增加一个“时间”(可能也不是时间)维度。考虑到这个时间维度,包裹层将应用于输入张量的每个切片。
例如,如果一个层需要一个 3 维的输入形状,比如 (batch, length, features),使用 TimeDistributed 包装器将使其需要 4 维:(batch, timeDimension, length, features)
然后该层将被“复制”并平等地应用于时间维度中的每个元素。
使用 LSTM 层,它的工作原理相同。尽管 LSTM 层在其输入形状中已经期望一个时间维度:(batch, timeSteps, features),但您可以使用TimeDistributed 添加另一个“时间”维度(可能意味着任何东西,而不是确切的时间)并制作这个LSTM 层为这个新时间维度中的每个元素重复使用。
LSTM - 期望输入 (batch, timeSteps, features)
TimeDistributed(LSTM()) - 期望输入 (batch, superSteps, timeSteps, features)
在任何情况下,LSTM 实际上只会在timeSteps 维度中执行其循环计算。另一个时间维度只是多次复制这一层。
时间分布 + 密集:
Dense 层(可能还有其他一些)已经支持 3D 输入,尽管标准是 2D:(batch, inputFeatures)。
是否使用 TimeDistributed 与 Dense 层是可选的,结果是相同的:如果您的数据是 3D,则 Dense 层将在第二维重复。
这在documentation中有很好的解释。
对于循环层,keras 将使用timeSteps 维度来执行其循环步骤。每一步,自然会有一个输出。
您可以选择获取所有步骤的输出 (return_sequences=True) 或仅获取最后一个输出 (return_sequences=False)
考虑像(batch, timeSteps, inputFeatures) 这样的输入形状和具有outputFeatures 单位的层:
return_sequences=True时,输出形状为(batch, timeSteps, outputFeatures)
return_sequences=False时,输出形状为(batch, outputFeatures)
无论如何,如果您使用TimeDistributed 包装器,superSteps 维度将在输入和输出中保持不变。
通常,如果您可以将所有序列及其所有步骤放入一个输入数组中,那么一切都很好,您不需要stateful=True 层。
Keras 为批次中的每个序列创建一个“状态”。批次维度等于序列的数量。当 keras 处理完一个批次后,它会自动重置状态,意思是:我们到达了序列的末尾(最后一个时间步),从第一步开始带来新的序列。
使用stateful=True 时,这些状态不会被重置。这意味着向模型发送另一个批次不会被解释为一组新的序列,而是之前处理过的序列的额外步骤。然后你必须手动model.reset_states() 告诉模型你已经到达序列的最后一步,或者你将开始新的序列。
唯一需要shuffle=False 的情况是stateful=True 情况。因为对于每个批次,输入了许多序列。在每个批次中,这些序列必须保持相同的顺序,这样每个序列的状态就不会混合。
有状态层适用于:
到目前为止,我可以使用 Windows 的唯一方法是复制数据。
输入数组应该在窗口中组织。每个窗口步骤一个序列。如果要将所有窗口步骤保留为单个批处理条目,则可以选择利用 TimeDistributed 包装器。但是您也可以将所有步骤设置为单独的序列。
stateful=True 层由于这些状态而无法与 Windows 一起使用。如果您批量输入从 1 到 12 的步骤,则下一批将期望步骤 13 作为保持连接的第一步。
【讨论】: