Как я могу удалить или опустить данные с помощью метода карты для объектов tf.data.Dataset?

Я использую тензорный поток 2.3.0

У меня есть генератор данных на Python —

import tensorflow as tf
import numpy as np

vocab = [1,2,3,4,5]

def create_generator():
    'generates a random number from 0 to len(vocab)-1'
    count = 0
    while count < 4:
        x = np.random.randint(0, len(vocab))
        yield x
        count +=1

Я делаю это объектом tf.data.Dataset

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

Теперь я хочу выполнить подвыборку элементов с помощью метода map, чтобы генератор tf никогда не выводил четное число.

def subsample(x):
    'remove item if it is present in an even number [2,4]'
    
    '''
    #TODO
    '''
    return x
    
gen = gen.map(subsample)   

Как я могу добиться этого с помощью метода map?

См. также:  FiPy для потока заряженных частиц
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. n0obcoder

    Вкратце, нет, вы не можете фильтровать данные с помощью map. Функции карты применяют некоторые преобразования к каждому элементу набора данных. Вы хотите проверить каждый элемент на предмет какого-либо предиката и получить только те элементы, которые удовлетворяют этому предикату.

    И эта функция называется filter().

    Итак, вы можете:

    gen = gen.filter(lambda x: x % 2 != 0)
    

    Обновление:

    Если вы хотите использовать пользовательскую функцию вместо lambda, вы можете сделать что-то вроде:

    def filter_func(x):
        if x**2 < 500:
            return True
        return False
    gen = gen.filter(filter_func)
    

    Если эта функция передана в filter, будут возвращены все числа, квадрат которых меньше 500.

    Вау! Это было полезно. Могу ли я использовать настраиваемую функцию Python для фильтрации элементов набора данных на основе некоторых настраиваемых правил? person n0obcoder; 17.11.2020

    На самом деле я хочу сделать подвыборку элементов из списка элементов на основе их частоты появления. Список элементов может иметь вид [1,3,4,6,1,3,9], теперь допустим, после применения субдискретизации список элементов уменьшается до [1,3,6,1]. Следующее, что я хочу сделать, это отбросить все последовательности с длиной меньше 2. Если длина ›= 2, я хочу использовать ее. Как я могу это осуществить? person n0obcoder; 17.11.2020

    Да, если ваша пользовательская функция возвращает логическое значение. Я обновлю ответ person n0obcoder; 17.11.2020

    Но логическое значение будет только решать, будет ли этот конкретный элемент набора данных отфильтрован или нет. Я не уверен, как я могу преобразовать элемент набора данных с помощью пользовательской функции Python и отфильтровать последовательность (или элемент набора данных), если длина последовательности равна ‹2. Не могли бы вы помочь мне с этим? Могу ли я даже использовать для этого метод фильтрации? person n0obcoder; 17.11.2020

    для вашей конкретной проблемы, lambda x: gen.count(x) > 2. Но ваш gen должен быть переменной во внешней области видимости. person n0obcoder; 17.11.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: