keras中二维元素的填充序列

keras中二维元素的填充序列,keras,lstm,padding,masking,Keras,Lstm,Padding,Masking,我有一组样本,每个样本都是一组属性的序列(例如,一个样本可以包含10个序列,每个序列有5个属性)。属性的数量始终是固定的,但序列的数量(即时间戳)可能因样本而异。我想使用这个样本集来训练Keras中的LSTM网络以解决分类问题,因此我应该填充所有批次样本的输入大小,使其相同。但是keras中的pad_sequences处理器获得固定数量的具有可变属性的序列,并在每个序列中填充缺失的属性,而我需要向每个样本添加更多具有固定属性长度的序列。因此,我认为我不能使用它,因此我分别填充了我的样本,并制作了

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

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

不幸的是,这是一个非常错误的解释,但是
pad\u序列
正是你想要的。例如,此代码

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应该可以接受。只需使用一层作为第一层。默认情况下,它将使LSTM忽略所有零,因此在您的情况下,正是通过填充添加的零。但可以使用任何值进行掩蔽,就像可以使用任何值进行填充一样。如果可能,请选择数据集中不出现的值

如果您不使用掩蔽,这将产生一种危险,即您的LSTM会知道填充值确实有一些意义,而实际上它们没有

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

[[1,2],
 [2,1],
 [0,0],
 [0,0],
 [0,0]]
然后在经过训练的网络上,你只需要输入

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

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

还有一个问题:当我定义我的模型时,我应该在LSTM的输入层中指定输入形状(包括序列长度和属性数)。在不重新定义每个批次的模型的情况下,我如何使其变为变量?@Shahriar49仅将
None
放在该维度上。我在样本数据(一系列每次观测6个属性的陆地卫星图像序列)上尝试了一些中小型LSTM网络的土地覆盖分类模拟,我尝试了前填充和后填充以及启用/禁用掩蔽。我发现后填充有时在输出精度上超过前填充,更令人惊讶的是,没有掩蔽有时比掩蔽好(不是相反)。你有什么评论吗?@Shahriar49这确实令人惊讶。你的数据集有多大?如果太小,这可能只是巧合。还有,你所说的“输出精度”到底是什么意思?不要比较在训练中获得的准确度!它们毫无意义!确保您针对一些足够大的测试数据集测试您的训练模型(训练期间不得以任何方式触摸它!)。确保所有不同的模型都基于相同的数据进行培训,并基于相同的数据进行测试。只有这样,测试的准确性才有意义,你可以比较它们。谢谢你的回复。是的,我查看了测试精度(测试数据与训练完全分离),但测试数据大小大约为一万个序列,这不是很大。我将尝试增加测试数据的大小,并了解它的运行情况。但我应该有大的列车数据或测试数据来进行正确的比较吗?我认为训练数据的大小更为重要,因为掩蔽会影响经过训练的分类器。