Как сохранить большой поплавок в формате TFRecord? float_list / float32, похоже, усекает значения - PullRequest
0 голосов
/ 11 января 2020

Мы записываем обработанные данные в 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]

1008 * Но чтение из tfrecords возвращает эти значения

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

Воспроизводимый код

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