Как я могу модифицировать данные последовательности, используя метод map или filter или reduce для tf.data.Объекты набора данных?

#python #tensorflow #tensorflow2.0 #tensorflow-datasets #tf.data.dataset

#python #тензорный поток #tensorflow2.0 #tensorflow-datasets #tf.data.dataset

Вопрос:

У меня есть генератор данных python-

 import numpy as np
import tensorflow as tf

vocab_size = 5
def create_generator():
    'generates sequences of varying lengths(5 to 7) with random number from 0 to voca_size-1'
    count = 0
    while count < 5:
        sequence_len = np.random.randint(5, 8) # length varies from 5 to 7
        seq = np.random.randint(0, vocab_size, (sequence_len))
        yield seq
        count  =1

gen = tf.data.Dataset.from_generator(create_generator, 
                             args=[], 
                             output_types=tf.int32, 
                             output_shapes = (None, ), )

for g in gen:
    print(g)
  

Он генерирует последовательности различной длины (от 5 до 8) с целочисленными значениями от 0 до 4.
Вот некоторые из последовательностей, сгенерированных генератором-

 tf.Tensor([4 0 0 1 4 1], shape=(7,), dtype=int32) # 1st sequence
tf.Tensor([3 4 4 4 0], shape=(5,), dtype=int32)   # 2nd sequence
tf.Tensor([4 4 2 1 4 3], shape=(5,), dtype=int32) # 3rd sequence
tf.Tensor([1 0 2 4 0], shape=(7,), dtype=int32)   # 4th sequence
tf.Tensor([1 4 0 2 2], shape=(6,), dtype=int32)   # 5th sequence
  

Теперь я хочу изменить последовательности таким образом, чтобы-

  • все четные числа удаляются из каждой последовательности
  • последовательности (после удаления всех четных чисел) с длиной <2 отфильтровываются

Это должно дать нам результат, который выглядит следующим образом-

 [1 1] # 1st sequence
[1 3] # 3rd sequence
  

Как я могу выполнить такие преобразования, используя tf.data.Методы набора данных?

Ответ №1:

Ваш for цикл должен выглядеть так:

 new_gen = []
for g in gen:
    arr = np.array(g) % 2 != 0: 
    if len(list(arr)) >= 2:
        new_gen.append(arr)

print(new_gen)
  

Комментарии:

1. Я хочу использовать tf.data. Методы набора данных для этого, чтобы я мог оптимизировать конвейер ввода при обучении модели на машине multi_GPU с использованием параллелизма данных. Мой конвейер ввода данных является узким местом, которое я пытаюсь оптимизировать. Вот почему я хочу, чтобы это было сделано с помощью tf.data. Методы набора данных, поскольку они поддерживают параллелизм данных.