pad_sequences
处理器会获得固定数量的具有可变属性的序列,并在每个序列中填充缺失的属性,而我需要为每个样本添加更多具有固定属性长度的序列。因此,我认为我无法使用它,因此我分别填充了样本并制作了一个统一的数据集,然后用它填充了我的网络。但是Keras函数有捷径可做吗?
我也听说过在学习过程中屏蔽填充的输入数据,但是我不确定我是否真的需要它,因为我的分类器在处理完整个样本序列后会分配一个类标签。我需要吗?如果是的话,请您举一个简单的示例来帮助我吗?
答案 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]]
您可能会得到意想不到的结果(尽管不一定)。屏蔽通过从训练中排除屏蔽值来避免这种情况。