我在进行数据科学工作时遇到了这个问题,我正在尝试为一个监督任务创建模型,其中输入和输出都是可变长度的。
以下是输入和输出的示例:
Input[0]: [2.42, 0.43, -5.2, -54.9]Output[0]: ['class1', 'class3', 'class12']
问题在于,在我拥有的数据集中,输入和输出都是可变长度的,因此为了能够使用整个数据集,我需要找到一种编码这些数据的方法。
首先,我对输出的类别进行了编码,并添加了填充以使数据集中所有输出的长度相同(假设长度为length=(6,)
):
Encoded_output[0]: [1, 3, 12, 0, 0, 0]
但是,我无法找到编码输入的方法,因为原始输入数据是浮点数,我无法创建编码并添加填充。我不知道还有哪些其他选项,我很想听听你是如何解决这个问题的。
回答:
解决这个问题的方法是:
- 找出可变数据的最大长度。
- 找出每个训练实例的真实长度。
通过这两点,你可以创建一个掩码,让你的网络对你想要忽略的部分计算零梯度。
示例:
import tensorflow as tf# 假设我们将拥有的最长数据实例为5MAX_SEQ_LEN = 5# 指示每个实例真实长度的索引批次idxs = tf.constant([3, 2, 1])# 可变长度数据批次rt = tf.ragged.constant( [ [0.234, 0.123, 0.654], [0.111, 0.222], [0.777], ], dtype=tf.float32)t = rt.to_tensor(shape=[3, MAX_SEQ_LEN])print(t)# tf.Tensor(# [[0.234 0.123 0.654 0. 0. ]# [0.111 0.222 0. 0. 0. ]# [0.777 0. 0. 0. 0. ]], shape=(3, 5), dtype=float32)# 使用索引创建一个布尔掩码。我们可以将此掩码用于# 网络中的层以忽略梯度mask = tf.sequence_mask(idxs, MAX_SEQ_LEN)print(mask)# <tf.Tensor: shape=(3, 5), dtype=bool, numpy=# array([[ True, True, True, False, False],# [ True, True, False, False, False],# [ True, False, False, False, False]])>
这种用例常见于RNN中。你可以看到在call()
方法中有一个mask
选项,你可以为可变长度的时间序列数据传递一个二进制掩码。