Tensorflow 使用谓词(如筛选器)从tf.data.Dataset中获取

Tensorflow 使用谓词(如筛选器)从tf.data.Dataset中获取,tensorflow,machine-learning,deep-learning,Tensorflow,Machine Learning,Deep Learning,TensorFlow的优秀抽象可以使用带谓词的过滤: 筛选器筛选器(谓词)根据谓词筛选此数据集 Args:谓词:映射张量嵌套结构的函数 (具有由self.output_形状定义的形状和类型,以及 self.output_types)到标量tf.bool张量 这是非常强大的,;因为谓词允许您对数据集内容进行筛选 问题是:是否可能有过滤的“反面”:例如过采样? 使用take()似乎不可能,因为这不取决于数据集内容: take take(count)创建一个数据集,其中最多包含来自 这个数据集 Arg

TensorFlow的优秀抽象可以使用带谓词的过滤:

筛选器筛选器(谓词)根据谓词筛选此数据集

Args:谓词:映射张量嵌套结构的函数 (具有由self.output_形状定义的形状和类型,以及 self.output_types)到标量tf.bool张量

这是非常强大的,;因为谓词允许您对数据集内容进行筛选

问题是:是否可能有过滤的“反面”:例如过采样?

使用
take()
似乎不可能,因为这不取决于数据集内容:

take take(count)创建一个数据集,其中最多包含来自 这个数据集

Args:count:A tf.int64标量tf.Tensor,表示 构成新数据集所需的此数据集的元素。 如果计数为-1,或者计数大于此数据集的大小, 新数据集将包含此数据集的所有元素


TensorFlow目前还没有公开此类功能,但您可以使用它实现所需的结果。在本例中,对于输入数据集的每个元素,您将创建一个新的数据集(),该数据集生成此单个示例()的多个副本

例如:

import numpy as np
import tensorflow as tf

def run(dataset):
    el = dataset.make_one_shot_iterator().get_next()
    vals = []
    with tf.Session() as sess:
        try:
            while True:
                vals.append(sess.run(el))
        except tf.errors.OutOfRangeError:
            pass

    return vals

dataset = tf.data.Dataset.from_tensor_slices((np.array([1,2,3,4,5]), np.array([5,4,3,2,1])))
print('Original dataset with repeats')
print(run(dataset))

dataset = dataset.flat_map(lambda v, r: tf.data.Dataset.from_tensors(v).repeat(r))
print('Repeats flattened')
print(run(dataset))
将打印

Original dataset with repeats
[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]
Repeats flattened
[1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5]
Repeats flattened with a little bit of deterministic mixing
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 1, 2, 5, 1]
或者,您可以使用来实现相同的结果,但要混合多个样本的副本(
.flat\u map
.interleave
的一种特殊情况)。例如:

dataset = tf.data.Dataset.from_tensor_slices((np.array([1,2,3,4,5]), np.array([5,4,3,2,1])))
dataset = dataset.interleave(lambda v, r: tf.data.Dataset.from_tensors(v).repeat(r), 4, 1)
print('Repeats flattened with a little bit of deterministic mixing')
print(run(dataset))
将打印

Original dataset with repeats
[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]
Repeats flattened
[1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5]
Repeats flattened with a little bit of deterministic mixing
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 1, 2, 5, 1]

TensorFlow目前还没有公开此类功能,但您可以使用它实现所需的结果。在本例中,对于输入数据集的每个元素,您将创建一个新的数据集(),该数据集生成此单个示例()的多个副本

例如:

import numpy as np
import tensorflow as tf

def run(dataset):
    el = dataset.make_one_shot_iterator().get_next()
    vals = []
    with tf.Session() as sess:
        try:
            while True:
                vals.append(sess.run(el))
        except tf.errors.OutOfRangeError:
            pass

    return vals

dataset = tf.data.Dataset.from_tensor_slices((np.array([1,2,3,4,5]), np.array([5,4,3,2,1])))
print('Original dataset with repeats')
print(run(dataset))

dataset = dataset.flat_map(lambda v, r: tf.data.Dataset.from_tensors(v).repeat(r))
print('Repeats flattened')
print(run(dataset))
将打印

Original dataset with repeats
[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]
Repeats flattened
[1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5]
Repeats flattened with a little bit of deterministic mixing
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 1, 2, 5, 1]
或者,您可以使用来实现相同的结果,但要混合多个样本的副本(
.flat\u map
.interleave
的一种特殊情况)。例如:

dataset = tf.data.Dataset.from_tensor_slices((np.array([1,2,3,4,5]), np.array([5,4,3,2,1])))
dataset = dataset.interleave(lambda v, r: tf.data.Dataset.from_tensors(v).repeat(r), 4, 1)
print('Repeats flattened with a little bit of deterministic mixing')
print(run(dataset))
将打印

Original dataset with repeats
[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]
Repeats flattened
[1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5]
Repeats flattened with a little bit of deterministic mixing
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 1, 2, 5, 1]