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