使用数据集 API 生成平衡的小批量
Produce balanced mini batch with Dataset API
我对新数据集有疑问 API (tensorflow 1.4rc1)。
我有一个关于标签 0
和 1
的不平衡数据集。我的目标是在预处理过程中创建平衡的小批量。
假设我有两个过滤后的数据集:
ds_pos = dataset.filter(lambda l, x, y, z: tf.reshape(tf.equal(l, 1), []))
ds_neg = dataset.filter(lambda l, x, y, z: tf.reshape(tf.equal(l, 0), [])).repeat()
有没有办法合并这两个数据集,使生成的数据集看起来像 ds = [0, 1, 0, 1, 0, 1]
:
像这样:
dataset = tf.data.Dataset.zip((ds_pos, ds_neg))
dataset = dataset.apply(...)
# dataset looks like [0, 1, 0, 1, 0, 1, ...]
dataset = dataset.batch(20)
我目前的做法是:
def _concat(x, y):
return tf.cond(tf.random_uniform(()) > 0.5, lambda: x, lambda: y)
dataset = tf.data.Dataset.zip((ds_pos, ds_neg))
dataset = dataset.map(_concat)
但我感觉还有更优雅的方式。
提前致谢!
你走在正确的轨道上。下面的例子使用Dataset.flat_map()
将每对正例和负例在结果中变成两个连续的例子:
dataset = tf.data.Dataset.zip((ds_pos, ds_neg))
# Each input element will be converted into a two-element `Dataset` using
# `Dataset.from_tensors()` and `Dataset.concatenate()`, then `Dataset.flat_map()`
# will flatten the resulting `Dataset`s into a single `Dataset`.
dataset = dataset.flat_map(
lambda ex_pos, ex_neg: tf.data.Dataset.from_tensors(ex_pos).concatenate(
tf.data.Dataset.from_tensors(ex_neg)))
dataset = dataset.batch(20)
我对新数据集有疑问 API (tensorflow 1.4rc1)。
我有一个关于标签 0
和 1
的不平衡数据集。我的目标是在预处理过程中创建平衡的小批量。
假设我有两个过滤后的数据集:
ds_pos = dataset.filter(lambda l, x, y, z: tf.reshape(tf.equal(l, 1), []))
ds_neg = dataset.filter(lambda l, x, y, z: tf.reshape(tf.equal(l, 0), [])).repeat()
有没有办法合并这两个数据集,使生成的数据集看起来像 ds = [0, 1, 0, 1, 0, 1]
:
像这样:
dataset = tf.data.Dataset.zip((ds_pos, ds_neg))
dataset = dataset.apply(...)
# dataset looks like [0, 1, 0, 1, 0, 1, ...]
dataset = dataset.batch(20)
我目前的做法是:
def _concat(x, y):
return tf.cond(tf.random_uniform(()) > 0.5, lambda: x, lambda: y)
dataset = tf.data.Dataset.zip((ds_pos, ds_neg))
dataset = dataset.map(_concat)
但我感觉还有更优雅的方式。
提前致谢!
你走在正确的轨道上。下面的例子使用Dataset.flat_map()
将每对正例和负例在结果中变成两个连续的例子:
dataset = tf.data.Dataset.zip((ds_pos, ds_neg))
# Each input element will be converted into a two-element `Dataset` using
# `Dataset.from_tensors()` and `Dataset.concatenate()`, then `Dataset.flat_map()`
# will flatten the resulting `Dataset`s into a single `Dataset`.
dataset = dataset.flat_map(
lambda ex_pos, ex_neg: tf.data.Dataset.from_tensors(ex_pos).concatenate(
tf.data.Dataset.from_tensors(ex_neg)))
dataset = dataset.batch(20)