首页 > 解决方案 > 如何将大浮点数保存为 TFRecord 格式?float_list/float32 似乎截断了值

问题描述

我们将处理后的数据写入 TFRecords,当从 TFRecords 读回时,我们注意到数据丢失。下面的可重现示例。奇怪的是,它不仅会删除小数,而且似乎会随机向上/向下取整值。由于它只允许 float32、int64 和 string,我们不确定要尝试哪些其他选项。

我们正在写下这些价值观

[20191221.1、20191222.1、20191223.1、20191224.1、20191225.1、20191226.1、20191227.1、20191228.1、20191229.1、20191230.1]

但是从 tfrecords 读取会返回这些值

tf.Tensor( [20191222. 20191222. 20191224. 20191224. 20191226. 20191226. 20191228. 20191228. 20191228. 20191230. 20191230.], shape=(10,), dtype=float3

可重现的代码

import tensorflow as tf

def write_date_tfrecord():  
    #writes 10 dummy values to replicate the issue
    data = [20191221.1 + x for x in range(0,10)]
    print("Writing data - ", data)

    example = tf.train.Example(
            features = tf.train.Features(
                feature = {                    
                    'data':tf.train.Feature(float_list=tf.train.FloatList(value=data))                    
                     }
                ))


    writer = tf.io.TFRecordWriter("data.tf_record")
    writer.write(example.SerializeToString())

def parse_function(serialized_example):
        features = {
            'data': tf.io.FixedLenSequenceFeature([], tf.float32,allow_missing=True) 
             }
        features = tf.io.parse_single_example(serialized=serialized_example, features=features)  
        data = features['data']
        return data

def dataset_generator():
    trRecordDataset = tf.data.TFRecordDataset("data.tf_record")
    trRecordDataset = trRecordDataset.map(parse_function, num_parallel_calls = tf.data.experimental.AUTOTUNE)
    return trRecordDataset


if __name__ == '__main__':
    write_date_tfrecord()
    generator = dataset_generator()
    for data in generator:
        print(data)

标签: tensorflowtensorflow-datasets

解决方案


推荐阅读