我的问题是如何从多个(或切分的)tfrecords中获取批量输入。我读过这个例子。基本流程是,以训练集为例,(1)首先从这些文件名生成一系列tfrecords(例如,train-000-of-005
、train-001-of-005
、…),(2)生成一个列表并将其输入到tf.train.string_input_producer
中以获取队列,(3)同时生成一个tf.RandomShuffleQueue
以执行其他操作,(4)使用tf.train.batch_join
生成批处理iNETP.
我认为这很复杂,我不确定这个过程的逻辑。在我的例子中,我有一个.npy
文件的列表,我想生成切分的tfrecords(多个单独的tfrecords,而不仅仅是一个大文件)。每个.npy
文件包含不同数量的阳性和阴性样本(2类)。一种基本的方法是生成一个大的tfrecord文件。但文件太大(~20Gb
)。所以我求助于碎片的TFrecords。有没有更简单的方法?谢谢。
最佳答案
使用Dataset API
简化整个过程。这两个部分都是:(1): Convert numpy array to tfrecords
和(2,3,4): read the tfrecords to generate batches
。
1。从numpy数组创建tfrecords:
def npy_to_tfrecords(...):
# write records to a tfrecords file
writer = tf.python_io.TFRecordWriter(output_file)
# Loop through all the features you want to write
for ... :
let say X is of np.array([[...][...]])
let say y is of np.array[[0/1]]
# Feature contains a map of string to feature proto objects
feature = {}
feature['X'] = tf.train.Feature(float_list=tf.train.FloatList(value=X.flatten()))
feature['y'] = tf.train.Feature(int64_list=tf.train.Int64List(value=y))
# Construct the Example proto object
example = tf.train.Example(features=tf.train.Features(feature=feature))
# Serialize the example to a string
serialized = example.SerializeToString()
# write the serialized objec to the disk
writer.write(serialized)
writer.close()
2。使用数据集API读取tfrecords(tensorflow>=1.2):
# Creates a dataset that reads all of the examples from filenames.
filenames = ["file1.tfrecord", "file2.tfrecord", ..."fileN.tfrecord"]
dataset = tf.contrib.data.TFRecordDataset(filenames)
# for version 1.5 and above use tf.data.TFRecordDataset
# example proto decode
def _parse_function(example_proto):
keys_to_features = {'X':tf.FixedLenFeature((shape_of_npy_array), tf.float32),
'y': tf.FixedLenFeature((), tf.int64, default_value=0)}
parsed_features = tf.parse_single_example(example_proto, keys_to_features)
return parsed_features['X'], parsed_features['y']
# Parse the record into tensors.
dataset = dataset.map(_parse_function)
# Shuffle the dataset
dataset = dataset.shuffle(buffer_size=10000)
# Repeat the input indefinitly
dataset = dataset.repeat()
# Generate batches
dataset = dataset.batch(batch_size)
# Create a one-shot iterator
iterator = dataset.make_one_shot_iterator()
# Get batch X and y
X, y = iterator.get_next()