问题
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