如何读取整个 CSV 文件作为张量流中的一个训练示例?
How to read a whole CSV file as one training example in tensorflow?
我的数据集由数百个具有固定列数和可变行数的 .csv 文件组成。问题是 - 如何将其读入 tensorflow?
filename_queue = tf.train.string_input_producer(['file1.csv','file2.csv'])
features_reader = tf.WholeFileReader()
filename, value = features_reader.read(filename_queue)
现在如果有一些方法可以将值解码为其中的实际数字,那就太好了。有没有办法做到这一点,或者我应该使用不同的 reader 来代替?
所以实际上我通过创建 tf.records - tensorflow 二进制文件用不同的 reader 解决了这个问题,我认为这通常是这种情况下的一种方法。
虽然处理 tf.records 的官方文档并不令人满意,但这里有一个很好的解释:http://web.stanford.edu/class/cs20si/lectures/notes_09.pdf。
第一个需要读取文件并将其转换为二进制格式。在我的例子中,我只是将文件读入一个 numpy 数组。
file = your_custom_reader(csv_file)
file = file.tobytes()
现在,在我的例子中,列数是恒定的,但数据集中的行数是可变的。这可能很棘手——当你读入二进制文件时,它们以张量的形式出现,没有预定义的形状(在笔记的例子中,形状存储在二进制文件中,但这仍然意味着你需要在会话中评估它,这使得它对构建模型无用)。因此,在这一步将张量填充到最大尺寸是很有用的。
file = your_custom_reader(csv_file)
file = pad_to_max_size(file)
file = file.tobytes()
写入 tf.record 很容易。鉴于每个文件都有一个标签 y:
writer = tf.python_io.TFRecordWriter(file_name)
example = tf.train.Example(features=tf.train.Features(feature={
'features': tf.train.Feature(bytes_list=tf.train.BytesList(value=[file])),
'y' : tf.train.Feature(bytes_list=tf.train.BytesList(value=[y.tobytes()]))
}))
writer.write(example.SerializeToString())
writer.close()
现在,可以按如下方式加载二进制文件
tfrecord_file_queue = tf.train.string_input_producer([file_name, file_name_2,...,file_name_N], name='queue')
reader = tf.TFRecordReader()
_, tfrecord_serialized = reader.read(tfrecord_file_queue)
tfrecord_features = tf.parse_single_example(tfrecord_serialized,
features={
'features': tf.FixedLenFeature([],tf.string),
'y' : tf.FixedLenFeature([],tf.string)
}, name='tf_features')
正如我所说,对于其余代码,了解张量的形状很重要。我的是 SHAPE_1 和 SHAPE_2
features = tf.decode_raw(tfrecord_features['features'],tf.float32)
features = tf.reshape(audio_features, (SHAPE_1,SHAPE_2))
features.set_shape((SHAPE_1,SHAPE_2))
y = tf.decode_raw(tfrecord_features['y'],tf.float32)
我在上面喜欢的斯坦福大学的讲座幻灯片中提供了将代码放入函数中的更有条理的示例。我非常推荐这些幻灯片,尤其是因为它们在缺少此答案的地方提供了更多解释。不过,我希望它能有所帮助!
我的数据集由数百个具有固定列数和可变行数的 .csv 文件组成。问题是 - 如何将其读入 tensorflow?
filename_queue = tf.train.string_input_producer(['file1.csv','file2.csv'])
features_reader = tf.WholeFileReader()
filename, value = features_reader.read(filename_queue)
现在如果有一些方法可以将值解码为其中的实际数字,那就太好了。有没有办法做到这一点,或者我应该使用不同的 reader 来代替?
所以实际上我通过创建 tf.records - tensorflow 二进制文件用不同的 reader 解决了这个问题,我认为这通常是这种情况下的一种方法。
虽然处理 tf.records 的官方文档并不令人满意,但这里有一个很好的解释:http://web.stanford.edu/class/cs20si/lectures/notes_09.pdf。
第一个需要读取文件并将其转换为二进制格式。在我的例子中,我只是将文件读入一个 numpy 数组。
file = your_custom_reader(csv_file)
file = file.tobytes()
现在,在我的例子中,列数是恒定的,但数据集中的行数是可变的。这可能很棘手——当你读入二进制文件时,它们以张量的形式出现,没有预定义的形状(在笔记的例子中,形状存储在二进制文件中,但这仍然意味着你需要在会话中评估它,这使得它对构建模型无用)。因此,在这一步将张量填充到最大尺寸是很有用的。
file = your_custom_reader(csv_file)
file = pad_to_max_size(file)
file = file.tobytes()
写入 tf.record 很容易。鉴于每个文件都有一个标签 y:
writer = tf.python_io.TFRecordWriter(file_name)
example = tf.train.Example(features=tf.train.Features(feature={
'features': tf.train.Feature(bytes_list=tf.train.BytesList(value=[file])),
'y' : tf.train.Feature(bytes_list=tf.train.BytesList(value=[y.tobytes()]))
}))
writer.write(example.SerializeToString())
writer.close()
现在,可以按如下方式加载二进制文件
tfrecord_file_queue = tf.train.string_input_producer([file_name, file_name_2,...,file_name_N], name='queue')
reader = tf.TFRecordReader()
_, tfrecord_serialized = reader.read(tfrecord_file_queue)
tfrecord_features = tf.parse_single_example(tfrecord_serialized,
features={
'features': tf.FixedLenFeature([],tf.string),
'y' : tf.FixedLenFeature([],tf.string)
}, name='tf_features')
正如我所说,对于其余代码,了解张量的形状很重要。我的是 SHAPE_1 和 SHAPE_2
features = tf.decode_raw(tfrecord_features['features'],tf.float32)
features = tf.reshape(audio_features, (SHAPE_1,SHAPE_2))
features.set_shape((SHAPE_1,SHAPE_2))
y = tf.decode_raw(tfrecord_features['y'],tf.float32)
我在上面喜欢的斯坦福大学的讲座幻灯片中提供了将代码放入函数中的更有条理的示例。我非常推荐这些幻灯片,尤其是因为它们在缺少此答案的地方提供了更多解释。不过,我希望它能有所帮助!