我试图根据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())
,但我担心我的问题比那更重要。
问题:
当我执行此操作时,我返回了data
和label
张量。问题是我不太了解如何从张量中读取数据。例如,我理解autoencoder示例here,但是它有一个mnist.train.next_batch(batch_size)
函数被调用来读取下一批。我是否需要为我的函数编写它,或者它是由我的read_data()
函数内部处理的。如果我需要编写该函数,它看起来像什么?
他们还有其他任何明显缺失的东西吗?我使用这种方法的目的是减少I / O开销,而不是将所有数据存储在内存中,因为我的文件非常大。
提前致谢。
答案 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。