Tensorflow TFRecord:无法解析序列化的示例

Ste*_*t_R 6 python tensorflow tfrecord

我正在尝试按照本指南进行操作,以便将输入数据序列化为TFRecord格式,但是在尝试读取该错误时,我总是遇到此错误:

InvalidArgumentError:键:my_key。无法解析序列化的示例。

我不确定我要去哪里。这是我无法逾越的问题的最小复制。

序列化一些样本数据:

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()
Run Code Online (Sandbox Code Playgroud)

解析功能和反序列化:

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()
Run Code Online (Sandbox Code Playgroud)

尝试运行此命令时:

with tf.Session() as sess:
  v = sess.run(getnext)
  print (v)
Run Code Online (Sandbox Code Playgroud)

我触发了以上错误消息。

是否有可能克服此错误并反序列化我的数据?

Vla*_*-HC 7

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]),
   })
Run Code Online (Sandbox Code Playgroud)

应该做的工作。

  • @Rama,通常不会。通常,ds = ds.batch() 放在 tfrecord 解析之后。因此,在数据管道的这个阶段,记录尚未分组为批次。因此,无需在这里指定它的大小。 (2认同)

Ris*_*wat 7

作为替代方案,如果您的输入特征长度不固定并且是任意大小,那么您也可以使用tf.io.FixedLenSequenceFeature()参数allow_missing = Truedefault_value=0(在 int 类型和 0.0 表示浮点数的情况下),它不需要输入特征具有固定大小,不像tf.io.FixedLenFeature(). 您可以在此处找到更多信息。