我正在做一个与实例分割相关的项目。我正在尝试使用我自己的图像数据集训练一个SegNet,该数据集包含一组图像及其相应的掩码,并且我已经成功地使用tf.Dataset加载了我的数据。但是每次我使用feedable迭代器将数据集提供给SegNet时,我的程序总是在没有任何错误或警告的情况下终止。我的代码如下所示。
load_satellite_image()用于读取图片的文件名,dataset()用于通过tf.Dataset加载图片。似乎迭代器无法更新输入管道。
train_path = "data_example/train.txt"
val_path = "data_example/test.txt"
config_file = 'config.json'
with open(config_file) as f:
config = json.load(f)
train_img, train_mask = load_satellite_image(train_path)
val_img, val_mask = load_satellite_image(val_path)
train_dataset = dataset(train_img, train_mask, config, True, 0, 1)
val_dataset = dataset(val_img, val_mask, config, True, 0, 1)
train_iter = train_dataset.make_initializable_iterator()
validation_iter = val_dataset.make_initializable_iterator()
handle = tf.placeholder(tf.string, shape=[])
iterator = tf.data.Iterator.from_string_handle(handle,
train_dataset.output_types,train_dataset.output_shapes)
next_element = iterator.get_next()
with tf.Session() as Sess:
sess.run(train_iter.initializer)
sess.run(validation_iter.initializer)
train_iter_handle = sess.run(train_iter.string_handle())
val_iter_handle = sess.run(validation_iter.string_handle())
for i in range(2):
print("1")
try:
while True:
for i in range(5):
print(sess.run(next_element,feed_dict={handle:train_iter_handle}))
print('----------------------------','\n')
for i in range(2):
print(sess.run(next_element,feed_dict={handle:val_iter_handle}))
except tf.errors.OutOfRangeError:
pass运行上面的代码后,我得到了:
In [2]: runfile('D:/python_code/tensorflow_study/SegNet/load_data.py',
wdir='D:/python_code/tensorflow_study/SegNet')
(tf.float32, tf.int32)
(TensorShape([Dimension(360), Dimension(480), Dimension(3)]), TensorShape([Dimension(360),
Dimension(480), Dimension(1)]))
(tf.float32, tf.int32)
(TensorShape([Dimension(360), Dimension(480), Dimension(3)]), TensorShape([Dimension(360),
Dimension(480), Dimension(1)]))
WARNING:tensorflow:From D:\Anaconda\envs\tensorflow-gpu\lib\site-
packages\tensorflow\python\data\ops\dataset_ops.py:1419: colocate_with (from
tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
In [1]:我很困惑我的代码无缘无故被终止了。正如您所看到的,我可以获得训练/验证图像和蒙版的形状和数据类型,这意味着问题与我的数据集无关。但是,tf.Session()中的for循环并未执行,因此我无法获得print("1")的结果。迭代器也不是由sess.run()执行的。有没有人以前遇到过这个问题?
谢谢!
发布于 2020-05-01 01:02:26
问题解决了。这是一个愚蠢的错误,浪费了我很多时间。我的程序在没有错误消息的情况下被终止的原因是我正在使用愚蠢的Spyder编写代码,而我不知道为什么它没有显示错误消息。实际上,存在一条由TensorFlow生成的错误消息。巧合的是,我通过Anaconda的命令窗口运行我的代码,并得到以下错误消息:
2020-04-30 17:31:03.591207: W tensorflow/core/framework/op_kernel.cc:1401] OP_REQUIRES failed at whole_file_read_ops.cc:114 : Invalid argument: NewRandomAccessFile failed to Create/Open: D:\Study\PhD\python_code\tensorflow_study\SegNet\data_example\trainannot\ges_517405_679839_21.jpg迭代器无法工作,因为Tensorflow找不到掩码位置。图像和蒙版位置存储在文本文件中,如下所示:
data_example\train\ges_517404_679750_21.jpg,data_example\trainannot\ges_517404_679750_21.jpg
data_example\train\ges_517411_679762_21.jpg,data_example\trainannot\ges_517411_679762_21.jpg左侧是原始图像的位置,右侧是其蒙版的位置。一开始,我使用split(",")来分别获取图像和蒙版的位置,但看起来蒙版的位置有问题。因此,我检查了用于生成文本文件的代码:
file.writelines([Train_path[i],',',TrainAnnot_path[i],'\n'])文本文件中的每一行都以\n结尾,这就是Tensorflow无法获取掩码位置的原因。所以我用file.writelines([Train_path[i],' ',TrainAnnot_path[i],'\n'])代替了file.writelines([Train_path[i],',',TrainAnnot_path[i],'\n']),并且使用了strip().split(" ")而不是split(" ")。这就解决了问题。
https://stackoverflow.com/questions/61520550
复制相似问题