Я использую тензорный поток 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?
Вкратце, нет, вы не можете фильтровать данные с помощью
map
. Функции карты применяют некоторые преобразования к каждому элементу набора данных. Вы хотите проверить каждый элемент на предмет какого-либо предиката и получить только те элементы, которые удовлетворяют этому предикату.И эта функция называется
filter()
.Итак, вы можете:
Обновление:
Если вы хотите использовать пользовательскую функцию вместо
lambda
, вы можете сделать что-то вроде:Если эта функция передана в
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