Tensorflow TFRecord:无法解析序列化示例
Tensorflow TFRecord: Can't parse serialized example
我正在尝试按照 this guide 将我的输入数据序列化为 TFRecord 格式,但我在尝试读取它时一直遇到此错误:
InvalidArgumentError: Key: my_key. Can't parse serialized Example.
我不确定哪里出错了。这是我无法解决的问题的最小再现。
序列化一些示例数据:
with tf.python_io.TFRecordWriter('train.tfrecords') as writer:
for idx in range(10):
example = tf.train.Example(
features=tf.train.Features(
feature={
'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[1,2,3])),
'test': tf.train.Feature(float_list=tf.train.FloatList(value=[0.1,0.2,0.3]))
}
)
)
writer.write(example.SerializeToString())
writer.close()
解析函数&反序列化:
def parse(tfrecord):
features = {
'label': tf.FixedLenFeature([], tf.int64, default_value=0),
'test': tf.FixedLenFeature([], tf.float32, default_value=0.0),
}
return tf.parse_single_example(tfrecord, features)
dataset = tf.data.TFRecordDataset('train.tfrecords').map(parse)
getnext = dataset.make_one_shot_iterator().get_next()
尝试运行时:
with tf.Session() as sess:
v = sess.run(getnext)
print (v)
我触发了上面的错误信息。
是否可以解决此错误并反序列化我的数据?
tf.FixedLenFeature()用于读取固定大小的数据数组。并且数据的形状应该事先定义。将解析函数更新为
def parse(tfrecord):
return tf.parse_single_example(tfrecord, features={
'label': tf.FixedLenFeature([3], tf.int64, default_value=[0,0,0]),
'test': tf.FixedLenFeature([3], tf.float32, default_value=[0.0, 0.0, 0.0]),
})
应该完成这项工作。
作为替代方案,如果您的输入特征长度不固定且具有任意大小,那么您还可以使用带有参数 allow_missing = True
和 default_value=0
的 tf.io.FixedLenSequenceFeature()
(如果类型int 和 0.0 for float) 不像 tf.io.FixedLenFeature()
,它不需要输入特征是固定大小。您可以找到更多信息 here.
我正在尝试按照 this guide 将我的输入数据序列化为 TFRecord 格式,但我在尝试读取它时一直遇到此错误:
InvalidArgumentError: Key: my_key. Can't parse serialized Example.
我不确定哪里出错了。这是我无法解决的问题的最小再现。
序列化一些示例数据:
with tf.python_io.TFRecordWriter('train.tfrecords') as writer:
for idx in range(10):
example = tf.train.Example(
features=tf.train.Features(
feature={
'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[1,2,3])),
'test': tf.train.Feature(float_list=tf.train.FloatList(value=[0.1,0.2,0.3]))
}
)
)
writer.write(example.SerializeToString())
writer.close()
解析函数&反序列化:
def parse(tfrecord):
features = {
'label': tf.FixedLenFeature([], tf.int64, default_value=0),
'test': tf.FixedLenFeature([], tf.float32, default_value=0.0),
}
return tf.parse_single_example(tfrecord, features)
dataset = tf.data.TFRecordDataset('train.tfrecords').map(parse)
getnext = dataset.make_one_shot_iterator().get_next()
尝试运行时:
with tf.Session() as sess:
v = sess.run(getnext)
print (v)
我触发了上面的错误信息。
是否可以解决此错误并反序列化我的数据?
tf.FixedLenFeature()用于读取固定大小的数据数组。并且数据的形状应该事先定义。将解析函数更新为
def parse(tfrecord):
return tf.parse_single_example(tfrecord, features={
'label': tf.FixedLenFeature([3], tf.int64, default_value=[0,0,0]),
'test': tf.FixedLenFeature([3], tf.float32, default_value=[0.0, 0.0, 0.0]),
})
应该完成这项工作。
作为替代方案,如果您的输入特征长度不固定且具有任意大小,那么您还可以使用带有参数 allow_missing = True
和 default_value=0
的 tf.io.FixedLenSequenceFeature()
(如果类型int 和 0.0 for float) 不像 tf.io.FixedLenFeature()
,它不需要输入特征是固定大小。您可以找到更多信息 here.