Keras LSTM TimeDistributed,有状态
Keras LSTM TimeDistributed, stateful
是否有任何详细说明 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)
.
是否对 Dense 层使用 TimeDistributed 是可选的,结果是相同的:如果您的数据是 3D,Dense 层将在第二个维度上重复。
Return 序列:
这在 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一起工作
到目前为止,我可以使用 windows 的唯一方法是复制数据。
输入数组应按 windows 组织。每 window 步一个序列。如果您想将所有 window 步骤保留为单个批处理条目,则可以选择利用 TimeDistributed
包装器。但是您也可以将所有步骤都设为单独的序列。
由于状态的原因,stateful=True
图层无法与 windows 一起使用。如果您批量输入从 1 到 12 的步骤,下一批将期望步骤 13 作为保持连接的第一步。
是否有任何详细说明 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)
.
是否对 Dense 层使用 TimeDistributed 是可选的,结果是相同的:如果您的数据是 3D,Dense 层将在第二个维度上重复。
Return 序列:
这在 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一起工作
到目前为止,我可以使用 windows 的唯一方法是复制数据。
输入数组应按 windows 组织。每 window 步一个序列。如果您想将所有 window 步骤保留为单个批处理条目,则可以选择利用 TimeDistributed
包装器。但是您也可以将所有步骤都设为单独的序列。
由于状态的原因,stateful=True
图层无法与 windows 一起使用。如果您批量输入从 1 到 12 的步骤,下一批将期望步骤 13 作为保持连接的第一步。