180512 ValueError: Cannot capture a stateful node xxx by value

问题

ValueError: Cannot capture a stateful node (name:matching_filenames_1, type:VariableV2) by value.

当使用files = tf.train.match_filenames_once()遍历匹配tfrecords数据后,再调用dataset.make_one_shot_iterator()时会出现上述错误。

代码

files = tf.train.match_filenames_once(['flowers/_train*'])
print(files)  # 返回的是一个tf.Variable(),后面的操作目前还不支持

#解决方法一: 如果改用明确的字符串地址,可以正确运行后面操作
#files = ['flowers\\_train_00000-of-00005.tfrecord'] 

dataset = tf.data.TFRecordDataset(files)

dataset = dataset.map(parser)
#
iterator = dataset.make_one_shot_iterator()
#
image,label= iterator.get_next()

with tf.Session() as sess:
    sess.run(tf.local_variables_initializer())
    sess.run(tf.global_variables_initializer())
    im,la = sess.run([image,label])
#    print(sess.run(files))

原因
原因是:files返回得到的是一个<tf.Variable 'matching_filenames_2:0' shape=<unknown> dtype=string_ref>。目前后面的操作还不支持输入是tf.Variable()的运算。

方法一
可选用上述代码中被注释的代码,通过明确字符串变量,从而正确运行。

# 取消这个
files = tf.train.match_filenames_once(['flowers/_train*'])
# 改用这个
files = ['flowers\\_train_00000-of-00005.tfrecord'] 

方法二
iterator = dataset.make_initializable_iterator()
取代iterator = dataset.make_one_shot_iterator()
TensorFlow: “Cannot capture a stateful node by value” in tf.contrib.data API

这里写图片描述

参考如下代码:

# 从TFRecord文件创建数据集,具体文件路径是一个placeholder,稍后再提供具体路径。
input_files = tf.placeholder(tf.string)
dataset = tf.data.TFRecordDataset(input_files)
dataset = dataset.map(parser)

# 定义遍历dataset的initializable_iterator。
iterator = dataset.make_initializable_iterator()
image, label = iterator.get_next()

with tf.Session() as sess:
    # 首先初始化iterator,并给出input_files的值。
    sess.run(iterator.initializer,
             feed_dict={input_files: ["output.tfrecords"]})
    # 遍历所有数据一个epoch。当遍历结束时,程序会抛出OutOfRangeError。
    while True:
        try:
            x, y = sess.run([image, label])
        except tf.errors.OutOfRangeError:
            break 

猜你喜欢

转载自blog.csdn.net/qq_33039859/article/details/80294616