keras中二维元素的填充序列
Padding sequences of 2D elements in keras
我有一组样本,每个样本都是一组属性的序列(例如,一个样本可以包含 10 个序列,每个序列具有 5 个属性)。属性的数量始终是固定的,但序列的数量(时间戳)可能因样本而异。我想使用此样本集在 Keras 中训练 LSTM 网络以解决 class 化问题,因此我应该将所有批次样本的输入大小填充为相同。但是keras中的pad_sequences
处理器获取固定数量的具有可变属性的序列,并在每个序列中填充缺失的属性,而我需要为每个样本添加更多固定属性长度的序列。所以我认为我不能使用它,因此我单独填充了我的样本并制作了一个统一的数据集,然后用它来喂我的网络。但是 Keras 函数是否有快捷方式来执行此操作?
我也听说过在学习过程中屏蔽填充的输入数据,但我不确定我是否真的需要它,因为我的 classifier 在处理整个样本序列后分配了一个 class 标签。我需要它吗?如果是的话,你能帮我举一个简单的例子来说明如何做到这一点吗?
不幸的是,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]]
您可能会得到意想不到的结果(但不一定)。屏蔽通过从训练中排除屏蔽值来避免这种情况。
我有一组样本,每个样本都是一组属性的序列(例如,一个样本可以包含 10 个序列,每个序列具有 5 个属性)。属性的数量始终是固定的,但序列的数量(时间戳)可能因样本而异。我想使用此样本集在 Keras 中训练 LSTM 网络以解决 class 化问题,因此我应该将所有批次样本的输入大小填充为相同。但是keras中的pad_sequences
处理器获取固定数量的具有可变属性的序列,并在每个序列中填充缺失的属性,而我需要为每个样本添加更多固定属性长度的序列。所以我认为我不能使用它,因此我单独填充了我的样本并制作了一个统一的数据集,然后用它来喂我的网络。但是 Keras 函数是否有快捷方式来执行此操作?
我也听说过在学习过程中屏蔽填充的输入数据,但我不确定我是否真的需要它,因为我的 classifier 在处理整个样本序列后分配了一个 class 标签。我需要它吗?如果是的话,你能帮我举一个简单的例子来说明如何做到这一点吗?
不幸的是,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]]
您可能会得到意想不到的结果(但不一定)。屏蔽通过从训练中排除屏蔽值来避免这种情况。