Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow:如何确保每个批次中的所有样品具有相同的标签?_Tensorflow_Batch Processing - Fatal编程技术网

Tensorflow:如何确保每个批次中的所有样品具有相同的标签?

Tensorflow:如何确保每个批次中的所有样品具有相同的标签?,tensorflow,batch-processing,Tensorflow,Batch Processing,我想知道是否有一些方法可以对要在Tensorflow中生成的批次应用约束。例如,假设我们正在一个巨大的数据集上训练一个CNN来进行图像分类。是否可以强制Tensorflow生成所有样本都属于同一类的批次?比如,一批图像全部标记为“苹果”,另一批样本全部标记为“橙色” 我问这个问题的原因是我想做一些实验,看看不同级别的洗牌如何影响最终训练的模型。为CNN培训做样本级洗牌是常见的做法,每个人都在这样做。我只是想亲自检查一下,从而对它有一个更加生动和第一手的了解 谢谢 Dataset.filter()

我想知道是否有一些方法可以对要在Tensorflow中生成的批次应用约束。例如,假设我们正在一个巨大的数据集上训练一个CNN来进行图像分类。是否可以强制Tensorflow生成所有样本都属于同一类的批次?比如,一批图像全部标记为“苹果”,另一批样本全部标记为“橙色”

我问这个问题的原因是我想做一些实验,看看不同级别的洗牌如何影响最终训练的模型。为CNN培训做样本级洗牌是常见的做法,每个人都在这样做。我只是想亲自检查一下,从而对它有一个更加生动和第一手的了解

谢谢

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))