Заполнение и маскирование набора данных партии - PullRequest
1 голос
/ 23 апреля 2020

При представлении нескольких строк на естественном языке количество символов в каждой строке может не совпадать. Затем возвращаемый результат можно поместить в tf.RaggedTensor, где длина самого внутреннего измерения изменяется в зависимости от количества символов в каждой строке:

rtensor = tf.ragged.constant([
                      [1, 2], 
                      [3, 4, 5],
                      [6]
                      ])
rtensor
#<tf.RaggedTensor [[1, 2], [3, 4, 5], [6]]>

В свою очередь, применяя метод to_tensor, преобразует этот RaggedTensor в обычный tf.Tensor и, следовательно, применяет операцию заполнения:

batch_size=3
max_length=8
tensor = rtensor.to_tensor(default_value=0, shape=(batch_size, max_length))
#<tf.Tensor: shape=(3, 8), dtype=int32, numpy=
#array([[1, 2, 0, 0, 0, 0, 0, 0],
#       [3, 4, 5, 0, 0, 0, 0, 0],
#       [6, 0, 0, 0, 0, 0, 0, 0]], dtype=int32)>

Теперь существует ли подход для генерации также дополнения тензор, показывающий что такое исходные данные и что такое заполнение? Для приведенного выше примера это будет:

<tf.Tensor: shape=(3, 8), dtype=int32, numpy=
array([[1, 1, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0]], dtype=int32)>

1 Ответ

1 голос
/ 23 апреля 2020

Как подсказывает Таким образом, v89 , вы можете просто проверить ненулевые значения. Это может быть так же просто, как преобразование в логическое значение и обратно.

import tensorflow as tf

rtensor = tf.ragged.constant([[1, 2],
                              [3, 4, 5],
                              [6]])
batch_size = 3
max_length = 8
tensor = rtensor.to_tensor(default_value=0, shape=(batch_size, max_length))
mask = tf.dtypes.cast(tf.dtypes.cast(tensor, tf.bool), tensor.dtype)
print(mask.numpy())
# [[1 1 0 0 0 0 0 0]
#  [1 1 1 0 0 0 0 0]
#  [1 0 0 0 0 0 0 0]]

Единственный возможный недостаток заключается в том, что у вас изначально могли быть значения 0. Вы можете использовать другое значение в качестве значения по умолчанию при преобразовании в тензор, например -1, если вы знаете, что ваши данные всегда будут неотрицательными:

tensor = rtensor.to_tensor(default_value=-1, shape=(batch_size, max_length))
mask = tf.dtypes.cast(tensor >= 0, tensor.dtype)

Но если вы хотите, чтобы ваши Маска для работы с любыми значениями, которые вы имеете, вы также можете просто использовать tf.ones_like с рваным тензором:

rtensor_ones = tf.ones_like(rtensor)
mask = rtensor_ones.to_tensor(default_value=0, shape=(batch_size, max_length))

Таким образом, mask всегда будет таким, где rtensor имеет значение.

...