tf.data.Dataset 객체에 대한 맵 또는 필터 또는 축소 메소드를 사용하여 시퀀셜 데이터를 수정하려면 어떻게해야합니까?

Nov 17 2020

파이썬 데이터 생성기가 있습니다.

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)

0에서 4까지의 정수 값으로 다양한 길이 (5에서 8)의 시퀀스를 생성합니다. 다음은 생성기에 의해 생성 된 시퀀스 중 일부입니다.

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.Dataset 메서드를 사용하여 이러한 변환을 수행하려면 어떻게해야 합니까?

답변

MuslimbekAbduganiev Nov 17 2020 at 06:46

귀하의 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)