Wie kann ich sequenzielle Daten mithilfe einer Map- oder Filter- oder Reduzierungsmethode für tf.data.Dataset-Objekte ändern?

Nov 17 2020

Ich habe einen Python-Datengenerator.

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)

Es werden Sequenzen unterschiedlicher Länge (5 bis 8) mit ganzzahligen Werten von 0 bis 4 generiert. Hier sind einige der vom Generator generierten Sequenzen.

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

Jetzt möchte ich die Sequenzen so ändern, dass

  • Alle geraden Zahlen werden aus jeder Sequenz entfernt
  • Sequenzen (nach Entfernen aller geraden Zahlen) mit Längen <2 werden herausgefiltert

Dies sollte uns ein Ergebnis geben, das so aussieht:

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

Wie kann ich solche Transformationen mit den Methoden tf.data.Dataset durchführen ?

Antworten

MuslimbekAbduganiev Nov 17 2020 at 06:46

Ihre forSchleife sollte folgendermaßen aussehen:

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

print(new_gen)