微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 tfrecord 读取的数组与写入的数组不匹配

如何解决从 tfrecord 读取的数组与写入的数组不匹配

出于某种原因,我写入 tensorflow 记录的 numpy 数组(形状为 55,290)在我再次读取时与同一 tensorflow 记录的输出不匹配。

这是我用来编写 tfrecord 的代码

def _int64_feature(value):
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
def _float_feature(value):
    """Returns a float_list from a float / double."""
    return tf.train.Feature(float_list=tf.train.FloatList(value=value))

def serialize_data(X,y):
    feature = {
        'n_wavelength_channels': _int64_feature(55),'n_time_steps': _int64_feature(290),'rel_radii': _float_feature(y),'rel_flux': _float_feature(X.flatten()),}
    return tf.train.Example(features=tf.train.Features(feature=feature)).SerializetoString()

def tf_record_generator():
        X_file_chunk = ["E:/ml_data_challenge_database/noisy_train/0001_01_01.txt"]
        y_file_chunk = ["E:/ml_data_challenge_database/params_train/0001_01_01.txt"]

        data = []
        labels = []
        for X_file,y_file in zip(X_file_chunk,y_file_chunk):
            X = np.genfromtxt(X_file,dtype=np.float32)[:,10:]
            y = np.genfromtxt(y_file,dtype=np.float32)
            yield serialize_data(X,y)

n_splits = 1
tfrecord_filename = "training_record_{}.tfrecords"

for index in range(n_splits): # Number of splits
    writer = tf.data.experimental.TFRecordWriter(tfrecord_filename.format(index))

    serialized_features_dataset = tf.data.Dataset.from_generator(tf_record_generator,output_types=tf.string,output_shapes=())

    writer.write(serialized_features_dataset)

这是我用来读取刚刚写入的记录的代码

def parse_record(record):
    name_to_features = {
        'n_wavelength_channels': tf.io.FixedLenFeature([],tf.int64),'n_time_steps': tf.io.FixedLenFeature([],'rel_radii': tf.io.FixedLenFeature([55],tf.float32),'rel_flux': tf.io.FixedLenFeature([55*290],}
    return tf.io.parse_single_example(record,name_to_features)
def decode_record(record):
    parsed_record = parse_record(record)
    flux = parsed_record['rel_flux']
    radii = parsed_record['rel_radii']
    return flux,radii
def get_batched_dataset(filenames):
    option_no_order = tf.data.Options()
    option_no_order.experimental_deterministic = False
    dataset = tf.data.Dataset.list_files(filenames)
    dataset = dataset.with_options(option_no_order)
    dataset = dataset.interleave(tf.data.TFRecordDataset,num_parallel_calls=tf.data.AUTOTUNE)
    dataset = dataset.map(decode_record,num_parallel_calls=tf.data.AUTOTUNE)

    dataset = dataset.repeat()
    dataset = dataset.shuffle(2048)
    dataset = dataset.batch(BATCH_SIZE,drop_remainder=True) 
    dataset = dataset.prefetch(tf.data.AUTOTUNE) #

    return dataset
def get_training_dataset():
    return get_batched_dataset(training_filenames)

BATCH_SIZE=1
training_filenames = tf.io.gfile.glob("training_record_*.tfrecords")
training_data = get_training_dataset()
X_batch,y_batch = next(iter(training_data))

def show_batch(X_batch,y_batch):
    for i in X_batch:
        plt.plot(i.reshape(290,55))
        plt.show()


show_batch(X_batch.numpy(),y_batch.numpy())

这是我正在研究的神经网络输入的一部分,我尝试修改它以从单个训练观察中创建一个 tfrecord,然后输出该观察。

tfrecord 的输出如下所示:

tfrecord output

这是它应该是什么样子(原始观察):

X = np.genfromtxt("E:/ml_data_challenge_database/noisy_train/0001_01_01.txt")
plt.plot(X.T[10:,:])
plt.show()

enter image description here

(同时绘制所有 55 行)。

从 tfrecord 读取的 y 值实际上与真实的 y 值匹配,但我不知道为什么 X 数据似乎不正确。我一直在密切关注一些指南,但在处理 TF 数据方面非常新。有人可以看看我的代码并指出我可能做错了什么吗?预先非常感谢您!

这里是 X 数据的 a Google drive link(在 tf_record_generator 内的“X_file_chunk”中引用)和这里是 one to the y data(也在 tf_record_generator 内)

解决方法

当您重新塑造回 2D 时,您会混淆维度 - 它应该是 i.reshape(55,290).T

在这种情况下,绘图与原始数据相同。

顺便说一句,您的数据确实是 float64 格式,因此当您读取/绘制原始数据时,您使用 float64。来自 tf.Dataset 的数据是 float32。虽然这不是你的情节不同的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。