入力データを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)
上記のエラーメッセージをトリガーします。
このエラーを過ぎてデータをデシリアライズすることは可能ですか?
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の場合float)tf.io.FixedLenFeature()
とは異なり、入力フィーチャを固定サイズにする必要はありません。より多くの情報を見つけることができます こちら 。