Sha*_*r49 6 padding masking lstm keras
我有一组样本,每个样本都是一组属性的序列(例如,一个样本可以包含 10 个序列,每个序列有 5 个属性)。属性的数量始终是固定的,但序列(时间戳)的数量可能因样本而异。我想使用这个样本集在 Keras 中训练 LSTM 网络来解决分类问题,因此我应该将所有批次样本的输入大小填充为相同。但是pad_sequenceskeras 中的处理器获取固定数量的具有可变属性的序列,并填充每个序列中缺失的属性,而我需要向每个样本添加更多固定属性长度的序列。所以我认为我不能使用它,因此我单独填充了我的样本并制作了一个统一的数据集,然后用它来喂养我的网络。但是 Keras 函数是否有快捷方式可以做到这一点?
我还听说过在学习过程中屏蔽填充的输入数据,但我不确定我是否真的需要它,因为我的分类器在处理整个样本序列后分配一个类标签。我需要它吗?如果是的话,您能帮我举一个简单的例子来说明如何做到这一点吗?
不幸的是,该文档相当具有误导性,但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)
您可能会得到意想不到的结果(但不一定)。掩蔽通过从训练中排除掩蔽值来避免这种情况。
| 归档时间: |
|
| 查看次数: |
2275 次 |
| 最近记录: |