Tensorflow:如何确保每个批次中的所有样品具有相同的标签?
我想知道是否有一些方法可以对要在Tensorflow中生成的批次应用约束。例如,假设我们正在一个巨大的数据集上训练一个CNN来进行图像分类。是否可以强制Tensorflow生成所有样本都属于同一类的批次?比如,一批图像全部标记为“苹果”,另一批样本全部标记为“橙色” 我问这个问题的原因是我想做一些实验,看看不同级别的洗牌如何影响最终训练的模型。为CNN培训做样本级洗牌是常见的做法,每个人都在这样做。我只是想亲自检查一下,从而对它有一个更加生动和第一手的了解 谢谢Tensorflow:如何确保每个批次中的所有样品具有相同的标签?,tensorflow,batch-processing,Tensorflow,Batch Processing,我想知道是否有一些方法可以对要在Tensorflow中生成的批次应用约束。例如,假设我们正在一个巨大的数据集上训练一个CNN来进行图像分类。是否可以强制Tensorflow生成所有样本都属于同一类的批次?比如,一批图像全部标记为“苹果”,另一批样本全部标记为“橙色” 我问这个问题的原因是我想做一些实验,看看不同级别的洗牌如何影响最终训练的模型。为CNN培训做样本级洗牌是常见的做法,每个人都在这样做。我只是想亲自检查一下,从而对它有一个更加生动和第一手的了解 谢谢 Dataset.filter()
Dataset.filter()
可用于:
labels = np.random.randint(0, 10, (10000))
data = np.random.uniform(size=(10000, 5))
ds = tf.data.Dataset.from_tensor_slices((data, labels))
ds = ds.filter(lambda data, labels: tf.equal(labels, 1)) #comment this line out for unfiltered case
ds = ds.batch(5)
iterator = ds.make_one_shot_iterator()
vals = iterator.get_next()
with tf.Session() as sess:
for _ in range(5):
py_data, py_labels = sess.run(vals)
print(py_labels)
使用ds.filter()
:
不带ds.filter()
:
编辑。下面的代码显示了如何使用feedable迭代器动态执行批标签选择。请参阅“”
这方面的典型输出如下所示。请注意,数据
值在Apple和Orange批中单调增加,表明迭代器没有重置
> (array([2, 3, 6, 7], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([0, 1, 4, 5], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))
(array([ 9, 13, 15, 19], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([ 8, 10, 11, 12], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))
(array([21, 22, 23, 25], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([14, 16, 17, 18], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))
Dataset.filter()
可用于:
labels = np.random.randint(0, 10, (10000))
data = np.random.uniform(size=(10000, 5))
ds = tf.data.Dataset.from_tensor_slices((data, labels))
ds = ds.filter(lambda data, labels: tf.equal(labels, 1)) #comment this line out for unfiltered case
ds = ds.batch(5)
iterator = ds.make_one_shot_iterator()
vals = iterator.get_next()
with tf.Session() as sess:
for _ in range(5):
py_data, py_labels = sess.run(vals)
print(py_labels)
使用ds.filter()
:
不带ds.filter()
:
编辑。下面的代码显示了如何使用feedable迭代器动态执行批标签选择。请参阅“”
这方面的典型输出如下所示。请注意,数据
值在Apple和Orange批中单调增加,表明迭代器没有重置
> (array([2, 3, 6, 7], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([0, 1, 4, 5], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))
(array([ 9, 13, 15, 19], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([ 8, 10, 11, 12], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))
(array([21, 22, 23, 25], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([14, 16, 17, 18], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))
在上面显示的示例中,过滤器应用于每个示例。我想知道每批货都能用这个过滤器吗?我需要每个批次的样品都有相同的标签(都有1个,都有2个,都有3个,等等),不一定只有1个。如果没有一个批次包含两个标签不同的样品,则可以。总而言之:我想筛选包含不同标签样本的批次。或者我想强制Tensorflow生成符合此规则的批处理。我不确定我是否完全理解。上面的条件语句可以更改为
tf.equal(labels,target)
其中target
可以在别处设置为您想要的任何标签。如果将过滤器应用于批次,那么批次大小似乎会在步骤之间发生变化。让我充分理解:像这样的批次(4个样本)[苹果,苹果,苹果,苹果]或像这样的批次[橙色,橙色,橙色],都可以。我只希望所有样品的标签在每批都是一样的,没有额外的约束或要求的标签。所以你建议,我在培训期间动态设置“target”以选择“Apple”或“Orange”?好的,我编辑了我的答案,以展示如何使用可反馈迭代器动态过滤批次。我以前从未使用过,所以这对我来说是一次很好的体验。希望它能满足你的需要。谢谢!这正是我想要的。在上面显示的示例中,过滤器应用于每个样本。我想知道每批货都能用这个过滤器吗?我需要每个批次的样品都有相同的标签(都有1个,都有2个,都有3个,等等),不一定只有1个。如果没有一个批次包含两个标签不同的样品,则可以。总而言之:我想筛选包含不同标签样本的批次。或者我想强制Tensorflow生成符合此规则的批处理。我不确定我是否完全理解。上面的条件语句可以更改为tf.equal(labels,target)
其中target
可以在别处设置为您想要的任何标签。如果将过滤器应用于批次,那么批次大小似乎会在步骤之间发生变化。让我充分理解:像这样的批次(4个样本)[苹果,苹果,苹果,苹果]或像这样的批次[橙色,橙色,橙色],都可以。我只希望所有样品的标签在每批都是一样的,没有额外的约束或要求的标签。所以你建议,我在培训期间动态设置“target”以选择“Apple”或“Orange”?好的,我编辑了我的答案,以展示如何使用可反馈迭代器动态过滤批次。我以前从未使用过,所以这对我来说是一次很好的体验。希望它能满足你的需要。谢谢!这正是我想要的。
> (array([2, 3, 6, 7], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([0, 1, 4, 5], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))
(array([ 9, 13, 15, 19], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([ 8, 10, 11, 12], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))
(array([21, 22, 23, 25], dtype=int32), array([b'Apple', b'Apple', b'Apple', b'Apple'], dtype=object))
(array([14, 16, 17, 18], dtype=int32), array([b'Orange', b'Orange', b'Orange', b'Orange'], dtype=object))