Keras最大化交叉序列相关性
Keras maximize cross-sequence correlation
我正在使用带有 Tensorflow 后端的 Keras 一次一步地同时对多个序列进行序列预测;也就是说,我有 n 个序列,每个序列都有 m 个时间步长,我用一个 model.predict() 命令将它们全部加载到 Keras 中,模型 returns 一个 'n' 元素数组,每个元素对应于为 n 个序列中的每一个序列预测下一步。
所以我的目标是最大限度地提高 Keras 检测序列之间互相关性的能力。例如,假设序列 a 与序列 b 具有一定的时间延迟和比例因子差异,那么理论上 Keras 应该能够使用序列 b 更好地预测序列 a 的下一步。我现在如何使用 4 个序列进行测试,每个序列有 30 个元素长,并将它们发送到我的模型中,输入数据的形状为 (4, 30, 1),输出数据的形状为 (4, 1) :
model = Sequential()
model.add(LSTM(
input_shape=(30, 1),
output_dim=100,
return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(
200,
return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(
output_dim=1,
return_sequences=False))
model.add(Activation("linear"))
model.compile(loss="mse", optimizer="rmsprop")
return model
我想知道 Keras 是否已经在对序列进行交叉关联,或者我的模型当前是否将它们视为独立的并且只是同时预测它们(即它与预测下一个相同步骤顺序 a,然后 b,然后 c,等等)。如果我将它们视为每个时间步长具有 n 个特征的 1 个序列(即,形状为 (1, 30, 4) 的输入数据和形状为 (1, 4) 的输出数据,Keras 是否能够更好地互相关序列)?如果是这样,我是否仍然能够输出一个 n 元素数组,其中每个元素仍然与输入数组之一相关(即它们是否会保持区分能力)?
谢谢!
我继续测试两种方式,发现 - 回答我自己的问题:
- 是的,Keras 最初是单独处理序列,根本没有互相关。
- 是的,因此通过将数据作为具有多个特征的单个序列输入,它能够更好地进行互相关(在这种情况下,这是提供任何互相关的唯一场景)
- 是的,Keras 能够保持特征之间的可区分性。
为了确定这一点,我对每种输入格式进行了多次试验,最初是计算预测与实际测试数据的 chi^2 拟合,以查看输入序列 A-D 是否比仅输入 A 更好地改进了 A 的预测和 B. 然而,当这样做时,我很快注意到在我的原始格式输入中 B-D 对 A 的预测没有影响(使用 4 个输入的预训练模型,切换序列 C 和 D - 因为区分能力得以保持并且 required 应该显着改变了输出 - 导致预测完全没有变化)。当使用新模型对 4 个特征进行相同的输入切换时,A 的预测明显依赖于其他输入 B-D。在多输入模型上使用多特征模型还产生了更平滑的输出,这对我的应用程序更好并且有意义,因为它现在依赖于更多的变量,这些变量可能会控制异常值。
我正在使用带有 Tensorflow 后端的 Keras 一次一步地同时对多个序列进行序列预测;也就是说,我有 n 个序列,每个序列都有 m 个时间步长,我用一个 model.predict() 命令将它们全部加载到 Keras 中,模型 returns 一个 'n' 元素数组,每个元素对应于为 n 个序列中的每一个序列预测下一步。
所以我的目标是最大限度地提高 Keras 检测序列之间互相关性的能力。例如,假设序列 a 与序列 b 具有一定的时间延迟和比例因子差异,那么理论上 Keras 应该能够使用序列 b 更好地预测序列 a 的下一步。我现在如何使用 4 个序列进行测试,每个序列有 30 个元素长,并将它们发送到我的模型中,输入数据的形状为 (4, 30, 1),输出数据的形状为 (4, 1) :
model = Sequential()
model.add(LSTM(
input_shape=(30, 1),
output_dim=100,
return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(
200,
return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(
output_dim=1,
return_sequences=False))
model.add(Activation("linear"))
model.compile(loss="mse", optimizer="rmsprop")
return model
我想知道 Keras 是否已经在对序列进行交叉关联,或者我的模型当前是否将它们视为独立的并且只是同时预测它们(即它与预测下一个相同步骤顺序 a,然后 b,然后 c,等等)。如果我将它们视为每个时间步长具有 n 个特征的 1 个序列(即,形状为 (1, 30, 4) 的输入数据和形状为 (1, 4) 的输出数据,Keras 是否能够更好地互相关序列)?如果是这样,我是否仍然能够输出一个 n 元素数组,其中每个元素仍然与输入数组之一相关(即它们是否会保持区分能力)?
谢谢!
我继续测试两种方式,发现 - 回答我自己的问题:
- 是的,Keras 最初是单独处理序列,根本没有互相关。
- 是的,因此通过将数据作为具有多个特征的单个序列输入,它能够更好地进行互相关(在这种情况下,这是提供任何互相关的唯一场景)
- 是的,Keras 能够保持特征之间的可区分性。
为了确定这一点,我对每种输入格式进行了多次试验,最初是计算预测与实际测试数据的 chi^2 拟合,以查看输入序列 A-D 是否比仅输入 A 更好地改进了 A 的预测和 B. 然而,当这样做时,我很快注意到在我的原始格式输入中 B-D 对 A 的预测没有影响(使用 4 个输入的预训练模型,切换序列 C 和 D - 因为区分能力得以保持并且 required 应该显着改变了输出 - 导致预测完全没有变化)。当使用新模型对 4 个特征进行相同的输入切换时,A 的预测明显依赖于其他输入 B-D。在多输入模型上使用多特征模型还产生了更平滑的输出,这对我的应用程序更好并且有意义,因为它现在依赖于更多的变量,这些变量可能会控制异常值。