keras中二维元素的填充序列

Sha*_*r49 6 padding masking lstm keras

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

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

seb*_*ckm 7

不幸的是,该文档相当具有误导性,但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')
Run Code Online (Sandbox Code Playgroud)

结果是

[[[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 ]]]
Run Code Online (Sandbox Code Playgroud)

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

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

如果您不使用掩蔽,则会产生这样的危险:您的 LSTM 得知填充值确实具有某种意义,而实际上却没有。

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

[[1,2],
 [2,1],
 [0,0],
 [0,0],
 [0,0]]
Run Code Online (Sandbox Code Playgroud)

然后在经过训练的网络上,您只需输入

[[1,2],
 [2,1]]
Run Code Online (Sandbox Code Playgroud)

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