keras中二维元素的填充序列

Padding sequences of 2D elements in keras

我有一组样本,每个样本都是一组属性的序列(例如,一个样本可以包含 10 个序列,每个序列具有 5 个属性)。属性的数量始终是固定的,但序列的数量(时间戳)可能因样本而异。我想使用此样本集在 Keras 中训练 LSTM 网络以解决 class 化问题,因此我应该将所有批次样本的输入大小填充为相同。但是keras中的pad_sequences处理器获取固定数量的具有可变属性的序列,并在每个序列中填充缺失的属性,而我需要为每个样本添加更多固定属性长度的序列。所以我认为我不能使用它,因此我单独填充了我的样本并制作了一个统一的数据集,然后用它来喂我的网络。但是 Keras 函数是否有快捷方式来执行此操作?

我也听说过在学习过程中屏蔽填充的输入数据,但我不确定我是否真的需要它,因为我的 classifier 在处理整个样本序列后分配了一个 class 标签。我需要它吗?如果是的话,你能帮我举一个简单的例子来说明如何做到这一点吗?

不幸的是,documentation 非常误导,但 pad_sequences 完全符合您的要求。例如,这段代码

length3 = np.random.uniform(0, 1, size=(3,2))
length4 = np.random.uniform(0, 1, size=(4,2))
pad_sequences([length3, length4], dtype='float32', padding='post')

结果

[[[0.0385175  0.4333343 ]
  [0.332416   0.16542904]
  [0.69798684 0.45242336]
  [0.         0.        ]]

 [[0.6518417  0.87938637]
  [0.1491589  0.44784057]
  [0.27607143 0.02688376]
  [0.34607577 0.3605469 ]]]

所以,这里我们有两个不同长度的序列,每个时间步都有两个特征,结果是一个 numpy 数组,其中两个序列中较短的一个用零填充。

关于您的其他问题:根据我的经验,屏蔽是一个棘手的话题。但是 LSTM 应该没问题。只需使用 Masking() 图层作为您的第一个图层。默认情况下,它会使 LSTM 忽略所有零,因此在您的情况下,正是您通过填充添加的那些。但是您可以使用任何值进行屏蔽,就像您可以使用任何值进行填充一样。如果可能,请选择一个未出现在您的数据集中的值。

如果您不使用掩码,则会产生这样的危险,即您的 LSTM 会了解到填充的值确实具有某种意义,而实际上它们并没有。

例如,如果您在训练期间输入序列

[[1,2],
 [2,1],
 [0,0],
 [0,0],
 [0,0]]

以后在经过训练的网络上你只输入

[[1,2],
 [2,1]]

您可能会得到意想不到的结果(但不一定)。屏蔽通过从训练中排除屏蔽值来避免这种情况。