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