【问题标题】:How to Encode Data of Variable Input Length?如何对可变输入长度的数据进行编码?
【发布时间】:2021-02-21 16:22:00
【问题描述】:

当我遇到这个问题时,我正在做一些数据科学工作,我正在尝试为监督任务创建一个模型,其中输入和输出都是可变长度的。

以下是输入和输出的示例:

Input[0]: [2.42, 0.43, -5.2, -54.9]
Output[0]: ['class1', 'class3', 'class12']

问题是在我拥有的数据集中,输入和输出是可变长度的,所以为了能够使用整个数据集,我需要找到一种编码这些数据的方法。

首先,我对 Outputs 类进行了编码,并添加了一个填充以等于数据集中的所有 Outputs 长度(假设为 length=(6,)):

Encoded_output[0]: [1, 3, 12, 0, 0, 0]

但我无法找到对输入进行编码的方法,因为由于原始输入数据是浮点数,我无法创建编码并添加填充。我不知道我还有什么其他选择,我想听听你会如何解决这个问题。

【问题讨论】:

    标签: python tensorflow machine-learning nlp


    【解决方案1】:

    解决这个问题的方法是:

    1. 找出可变数据的最大长度。
    2. 找出每个训练实例的真实长度。

    根据这两件事,您可以创建一个掩码,并让您的网络为您想要忽略的内容计算零梯度。

    示例

    import tensorflow as tf
    
    # pretend the longest data instance we will have is 5
    MAX_SEQ_LEN = 5
    
    # batch of indices indicating true length of each instance
    idxs = tf.constant([3, 2, 1])
    
    # batch of variable-length data
    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)
    
    # use indices to create a boolean mask. We can use this mask in
    # layers in our network to ignore gradients
    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]])>
    

    此用例通常出现在 RNNs 中。您可以看到call() 方法中有一个mask 选项,您可以在其中为可变长度时间序列数据传递二进制掩码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2017-07-12
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      相关资源
      最近更新 更多