Tensorflow和正确读取二进制数据

时间:2018-01-10 14:50:00

标签: python tensorflow tensorflow-datasets

我试图根据this tutorial的固定长度记录部分,通过查看read_cifar10函数here,将我自己的二进制数据正确读入Tensorflow。请注意,我是张力流的新手,所以我的理解可能会消失。

我的数据

我的文件是float32类型的二进制文件。第一个32位样本是标签,剩下的256个样本是数据。我想在最后将数据重新整形为[2,128]矩阵。

我的代码到目前为止:

import tensorflow as tf
import os


def read_data(filename_queue):
    item_type = tf.float32
    label_items = 1
    data_items = 256

    label_bytes = label_items * item_type.size
    data_bytes = data_items * item_type.size
    record_bytes = label_bytes + data_bytes

    reader = tf.FixedLengthRecordReader(record_bytes=record_bytes)
    key, value = reader.read(filename_queue)

    record_data = tf.decode_raw(value, item_type)

    # labels = tf.cast(tf.strided_slice(record_data, [0], [label_items]), tf.int32)
    label = tf.strided_slice(record_data, [0], [label_items])
    data0 = tf.strided_slice(record_data, [label_items], [label_items + data_items])
    data = tf.reshape(data0, [2, data_items/2])
    return data, label


if __name__ == '__main__':
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"  # Set GPU device
    datafiles = ['train_0000.dat', 'train_0001.dat']
    num_epochs = 2
    filename_queue = tf.train.string_input_producer(datafiles, num_epochs=num_epochs, shuffle=True)
    data, label = read_data(filename_queue)
    with tf.Session() as sess:
        init = tf.global_variables_initializer()
        sess.run(init)
        (x, y) = read_data(filename_queue)
        print(y.eval())

这段代码交给print(y.eval()),但我担心我的问题比那更重要。

问题:

当我执行此操作时,我返回了datalabel张量。问题是我不太了解如何从张量中读取数据。例如,我理解autoencoder示例here,但是它有一个mnist.train.next_batch(batch_size)函数被调用来读取下一批。我是否需要为我的函数编写它,或者它是由我的read_data()函数内部处理的。如果我需要编写该函数,它看起来像什么?

他们还有其他任何明显缺失的东西吗?我使用这种方法的目的是减少I / O开销,而不是将所有数据存储在内存中,因为我的文件非常大。

提前致谢。

1 个答案:

答案 0 :(得分:0)

是。你已经完成了很多工作。此时你需要:

1)编写你的神经网络模型model,该模型应该获取你的数据并返回一个标签。

2)编写成本函数C,其中包含网络预测和真实标签,并为您提供成本。

3)选择优化器。

4)把所有东西放在一起:

opt = tf.AdamOptimizer(learning_rate=0.001)
datafiles = ['train_0000.dat', 'train_0001.dat']
num_epochs = 2


with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)    
    filename_queue = tf.train.string_input_producer(datafiles, num_epochs=num_epochs, shuffle=True)
    data, label = read_data(filename_queue)
    example_batch, label_batch = tf.train.shuffle_batch(
  [data, label], batch_size=128)

    y_pred = model(data)
    loss = C(label, y_pred)

之后,您可以使用以下方法迭代并最小化损失:

opt.minimize(loss)

有关相关信息,另请参阅tf.train.string_input_producer behavior in a loop