Python 如何从tf.Dataset API为每个标签创建唯一的批处理
假设我的数据如下: 功能、标签 向量1,1 向量2,1 向量3,0 向量4,1 向量5,0 我想得到一个批次,在批次大小条件下,它应该代表每个迭代中每个标签的随机1个样本,例如2。 例如,对于第一次迭代,我可以收到: 向量1,1 向量3,0 例如,对于第二次迭代,我可以收到: 向量4,1 向量5,0 等等 你能告诉我如何有效地实施吗Python 如何从tf.Dataset API为每个标签创建唯一的批处理,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,假设我的数据如下: 功能、标签 向量1,1 向量2,1 向量3,0 向量4,1 向量5,0 我想得到一个批次,在批次大小条件下,它应该代表每个迭代中每个标签的随机1个样本,例如2。 例如,对于第一次迭代,我可以收到: 向量1,1 向量3,0 例如,对于第二次迭代,我可以收到: 向量4,1 向量5,0 等等 你能告诉我如何有效地实施吗 多谢各位 我会通过在每个标签上使用过滤器将数据集分成两个流,然后将这些流合并回去,例如,通过依赖tf.contrib.data。从数据集中选择 一个优点是在过程中不
多谢各位 我会通过在每个标签上使用
过滤器将数据集
分成两个流,然后将这些流合并回去,例如,通过依赖tf.contrib.data。从数据集
中选择
一个优点是在过程中不会丢失任何样本(与您给出的示例相反)
玩具数据的一个小例子:
import numpy as np
import tensorflow as tf
def gen():
# generate random (value, label) pairs
while True:
yield (np.random.uniform(), np.random.randint(0, 2))
def split_and_merge(ds):
return tf.contrib.data.choose_from_datasets(
[ds.filter(lambda x, label: tf.equal(label, 0)),
ds.filter(lambda x, label: tf.equal(label, 1))],
tf.data.Dataset.range(2).repeat())
batch = (tf.data.Dataset
.from_generator(gen, (tf.float32, tf.int32), (tf.TensorShape([]), tf.TensorShape([])))
.apply(split_and_merge)
.batch(2)
.make_one_shot_iterator()
.get_next())
sess = tf.InteractiveSession()
for _ in range(5):
sess.run(batch)
我会通过在每个标签上使用过滤器将数据集
分成两个流,然后将这些流合并回来,例如,通过依赖tf.contrib.data。从数据集中选择
一个优点是在过程中不会丢失任何样本(与您给出的示例相反)
玩具数据的一个小例子:
import numpy as np
import tensorflow as tf
def gen():
# generate random (value, label) pairs
while True:
yield (np.random.uniform(), np.random.randint(0, 2))
def split_and_merge(ds):
return tf.contrib.data.choose_from_datasets(
[ds.filter(lambda x, label: tf.equal(label, 0)),
ds.filter(lambda x, label: tf.equal(label, 1))],
tf.data.Dataset.range(2).repeat())
batch = (tf.data.Dataset
.from_generator(gen, (tf.float32, tf.int32), (tf.TensorShape([]), tf.TensorShape([])))
.apply(split_and_merge)
.batch(2)
.make_one_shot_iterator()
.get_next())
sess = tf.InteractiveSession()
for _ in range(5):
sess.run(batch)
非常感谢您,您认为此解决方案会扩展到我有1000多个标签的情况吗?除此之外,我还有以下错误module tensorflow.contrib.data“has no attribute”从tf v的数据集中选择。1.8.0升级到tf v。1.10+解决了模块错误。另一方面,我能够运行1000多个标签的代码。不幸的是,它非常慢。我们如何才能在不出现这种性能问题的情况下实现最佳案例?@如果没有进一步的了解,很难说清是谁。我会先尝试通常推荐的技巧,比如预取。此外,如果您可以先加载标签,然后再加载相应的数据,那么在执行拆分和合并
后加载数据可能会更快。如果我能够学会如何在不存在性能问题的情况下接收唯一样本,那将是非常棒的。否则,即使一个时代在不合理的长时间内完成:(非常感谢,你认为这个解决方案会扩展到我有1000多个标签的情况吗?除此之外,我还有以下错误module tensorflow.contrib.data“has not attribute”choose_from_datasets
用于tf v.1.8.0升级到tf v.1.10+解决了模块错误。另一方面,我能够运行你的c对于1000+个标签的ode。不幸的是,它非常慢。我们如何在没有这种性能问题的情况下实现最佳情况?@TheWho如果没有进一步的知识,很难说清是谁。我会先尝试通常推荐的技巧,如预取。此外,如果您有可能先加载标签,然后加载相应的数据,您可以在执行split\u和\u merge
后加载数据可能会更快。如果我能够学会如何在不存在性能问题的情况下接收唯一样本,那将是非常棒的。否则,即使是一个历元也会在不合理的长时间内完成:(