当前位置: 首页 > 面试题库 >

TF slice_input_producer不使张量保持同步

阙星渊
2023-03-14
问题内容

我正在将图像读取到我的TF网络中,但是我还需要相关的标签以及它们。

因此,我尝试遵循此答案,但是输出的标签实际上与每个批次中获取的图像都不匹配。

我的图像名称采用格式dir/3.jpg,因此我只是从图像文件名称中提取标签。

truth_filenames_np = ...
truth_filenames_tf = tf.convert_to_tensor(truth_filenames_np)

# get the labels
labels = [f.rsplit("/", 1)[1] for f in truth_filenames_np]

labels_tf = tf.convert_to_tensor(labels)

# *** This line should make sure both input tensors are synced (from my limited understanding)
# My list is also already shuffled, so I set shuffle=False
truth_image_name, truth_label = tf.train.slice_input_producer([truth_filenames_tf, labels_tf], shuffle=False)


truth_image_value = tf.read_file(truth_image_name)
truth_image = tf.image.decode_jpeg(truth_image_value)
truth_image.set_shape([IMAGE_DIM, IMAGE_DIM, 3])
truth_image = tf.cast(truth_image, tf.float32)
truth_image = truth_image/255.0

# Another key step, where I batch them together
truth_images_batch, truth_label_batch = tf.train.batch([truth_image, truth_label], batch_size=mb_size)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)

    for i in range(epochs):
        print "Epoch ", i
        X_truth_batch = truth_images_batch.eval()
        X_label_batch = truth_label_batch.eval()

        # Here I display all the images in this batch, and then I check which file numbers they actually are. 
        # BUT, the images that are displayed don't correspond with what is printed by X_label_batch!
        print X_label_batch
        plot_batch(X_truth_batch)



    coord.request_stop()
    coord.join(threads)

我是在做错什么,还是slice_input_producer实际上没有确保其输入张量得到同步?

在旁边:

我还注意到,当我从tf.train.batch获取批次时,该批次中的元素在我给它的原始列表中彼此相邻,但是批次顺序不在原始顺序中。示例:如果我的数据是[“
dir / 1.jpg”,“ dir / 2.jpg”,“ dir / 3.jpg”,“ dir / 4.jpg”,“ dir / 5.jpg,” dir
/ 6 .jpg“],那么我可能会得到批处理(batch_size = 2)[” dir / 3.jpg“,” dir / 4.jpg“],然后是批处理[”
dir / 1.jpg“,” dir / 2 .jpg“],然后是最后一个。因此,由于订单与批处理订单不匹配,因此甚至很难为标签使用FIFO队列。


问题答案:

这是一个完整的可运行示例,它重现了该问题:

import tensorflow as tf

truth_filenames_np = ['dir/%d.jpg' % j for j in range(66)]
truth_filenames_tf = tf.convert_to_tensor(truth_filenames_np)
# get the labels
labels = [f.rsplit("/", 1)[1] for f in truth_filenames_np]
labels_tf = tf.convert_to_tensor(labels)

# My list is also already shuffled, so I set shuffle=False
truth_image_name, truth_label = tf.train.slice_input_producer(
    [truth_filenames_tf, labels_tf], shuffle=False)

# # Another key step, where I batch them together
# truth_images_batch, truth_label_batch = tf.train.batch(
#     [truth_image_name, truth_label], batch_size=11)

epochs = 7

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    for i in range(epochs):
        print("Epoch ", i)
        X_truth_batch = truth_image_name.eval()
        X_label_batch = truth_label.eval()
        # Here I display all the images in this batch, and then I check
        # which file numbers they actually are.
        # BUT, the images that are displayed don't correspond with what is
        # printed by X_label_batch!
        print(X_truth_batch)
        print(X_label_batch)
    coord.request_stop()
    coord.join(threads)

打印的内容是:

Epoch  0
b'dir/0.jpg'
b'1.jpg'
Epoch  1
b'dir/2.jpg'
b'3.jpg'
Epoch  2
b'dir/4.jpg'
b'5.jpg'
Epoch  3
b'dir/6.jpg'
b'7.jpg'
Epoch  4
b'dir/8.jpg'
b'9.jpg'
Epoch  5
b'dir/10.jpg'
b'11.jpg'
Epoch  6
b'dir/12.jpg'
b'13.jpg'

因此,基本上每个eval调用都会再次运行该操作!添加批处理对此没有任何影响-只是打印批处理(前11个文件名,后11个标签,依此类推)

我看到的解决方法是:

for i in range(epochs):
    print("Epoch ", i)
    pair = tf.convert_to_tensor([truth_image_name, truth_label]).eval()
    print(pair[0])
    print(pair[1])

正确打印:

Epoch  0
b'dir/0.jpg'
b'0.jpg'
Epoch  1
b'dir/1.jpg'
b'1.jpg'
# ...

但对于违反最不惊奇原则的行为却无能为力。

编辑 :另一种方法:

import tensorflow as tf

truth_filenames_np = ['dir/%d.jpg' % j for j in range(66)]
truth_filenames_tf = tf.convert_to_tensor(truth_filenames_np)
labels = [f.rsplit("/", 1)[1] for f in truth_filenames_np]
labels_tf = tf.convert_to_tensor(labels)
truth_image_name, truth_label = tf.train.slice_input_producer(
    [truth_filenames_tf, labels_tf], shuffle=False)
epochs = 7
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    tf.train.start_queue_runners(sess=sess)
    for i in range(epochs):
        print("Epoch ", i)
        X_truth_batch, X_label_batch = sess.run(
            [truth_image_name, truth_label])
        print(X_truth_batch)
        print(X_label_batch)

这是一个更好的方法,因为tf.convert_to_tensor并且co只接受相同类型/形状等的张量。

请注意,为简单起见,我删除了协调器,但是会导致警告:

W c:\ tf_jenkins \ home \ workspace \ release-win \ device \ cpu \ os \
windows \ tensorflow \ core \ kernels \ queue_base.cc:294] _0_input_producer
/ input_producer / fraction_of_32_full / fraction_of_32_full:跳过未关闭队列的取消入队尝试

看到这个



 类似资料:
  • FreeBSD 的 Ports Collection 在持续地进行修改。 这里提供了一些关于如何保持同步的信息。 14.1. FreshPorts 最简单的了解已经被 commit 到 ports 中的更新的方法, 是订阅 FreshPorts。 您可以选择多个 ports 并对其进行监视。 强烈建议维护人员订阅它, 这样就不仅能接收到他们自己所做的修改, 而且能看到其它 FreeBSD comm

  • SVN 使用唯一的中央仓库作为开发者之间沟通的桥梁,在开发者的工作拷贝和中央仓库之间传递变更集合(changeset),协作得以发生。这和Git的协作模型有所不同,Git 给予每个开发者一份自己的仓库拷贝,拥有自己完整的本地历史和分支结构。用户通常共享一系列的提交而不是单个变更集合。Git 允许你在仓库间共享整个分支,而不是从工作副本提交一个差异集合到中央仓库。 下面的命令让你管理仓库之间的连接,

  • 我试图在张量流图中使用条件随机场损失。 我正在执行序列标记任务: 我有一系列元素作为输入。每个元素可以属于三个不同类中的一个。类以一种热编码方式表示:属于类0的元素由向量[表示。 我的输入标签(y)有大小(xx)。 我的网络产生相同形状的日志。 假设我所有的序列都有长度4。 这是我的代码: 我得到以下错误: 文件“/usr/local/lib/python2.7/dist-packages/ten

  • 问题内容: 我们将进行并行测试,以将旧系统与新的闪亮版本进行比较。我们有一个Oracle数据库表A,用于存储遗留系统的数据,以及一个等效表B,用于存储新系统的数据,因此在测试期间,该数据库将被非规范化。(此外,旧版系统和表A是固定的- 不允许更改) 我想做的是允许A上不常见的DML操作传播到B,反之亦然。我从一对触发器开始,但是遇到了一个明显的问题,即当触发器运行时,表正在变异,并引发异常。 是否

  • 问题内容: 我不确定这是否可能。 我的“活动”网站正在处理注册并将其保存到我们的数据库中,但是我们的主站点负责处理信用卡处理。通过在主网站上处理当前的购买,会话可用于将数据传递到付款/抄送屏幕。 不必更改我的付款代码(例如接受$ _GET参数),我的变量是否应该传递过来? 例: 我的页面在上面查找地址会话变量。 问题答案: 跨域会话ID 默认情况下,使用cookie传递会话ID。由于您的网站位于不

  • 问题内容: 我在格式化输入字段时遇到问题,而基础范围变量未格式化。 我要实现的是一个显示货币的文本字段。它应该在处理错误输入的同时即时格式化自己。我可以正常工作,但是我的问题是我要将非格式化值存储在我的范围变量中。输入的问题在于,它需要一个双向运行的模型,因此更改输入字段会更新该模型,反之亦然。 我来了,这似乎是我想要的。不幸的是,它们并没有相互影响(实际上可能会避免无休止的循环)。 我创建了一个