web-dev-qa-db-ja.com

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()

関数の解析とデシリアライズ:

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)

上記のエラーメッセージをトリガーします。

このエラーを過ぎてデータをデシリアライズすることは可能ですか?

6
Stewart_R

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]),
   })

仕事をする必要があります。

7
Vlad-HC

別の方法として、入力フィーチャの長さが固定されておらず、任意のサイズである場合、引数_allow_missing = True_および_default_value=0_とともにtf.io.FixedLenSequenceFeature()を使用することもできます(int型および0.0の場合float)tf.io.FixedLenFeature()とは異なり、入力フィーチャを固定サイズにする必要はありません。より多くの情報を見つけることができます こちら

1