喀拉拉邦2D元素的填充序列

时间:2019-06-10 21:39:17

标签: keras lstm padding masking

我有一组样本,每个样本都是一组属性的序列(例如,一个样本可以包含10个序列,每个序列具有5个属性)。属性的数量始终是固定的,但是序列的数量(时间戳)可以随样本的不同而变化。我想使用该样本集来训练Keras中的LSTM网络以解决分类问题,因此我应该将所有批次样本的输入大小都设置为相同。但是,keras中的pad_sequences处理器会获得固定数量的具有可变属性的序列,并在每个序列中填充缺失的属性,而我需要为每个样本添加更多具有固定属性长度的序列。因此,我认为我无法使用它,因此我分别填充了样本并制作了一个统一的数据集,然后用它填充了我的网络。但是Keras函数有捷径可做吗?

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

1 个答案:

答案 0 :(得分:0)

不幸的是,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]]

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