使用张量流函数tf.train.shuffle_batch我们通过将tfrecord作为队列读入内存并在队列中进行混洗(如果得到正确的理解)来获得混洗批处理。现在我有一个高度有序的tfrecords(相同标签的图片一起写入)和一个非常大的数据集(约2,550,000图片)。我想用一批随机标签给我的Vgg-net喂食,但它不可能和丑陋地将所有图片读入内存并被洗牌。有没有解决这个问题的方法?如何从内存有限但大型数据集的tfrecords中获取洗牌批次?
我想过,也许第一次做洗牌,然后写他们入TFrecord,但我不能找出一种有效的方式这样做......
我的数据保存在这样:
这里是我的代码获得TFRecords:
dst = "/Users/cory/Desktop/3_key_frame"
classes=[]
for myclass in os.listdir(dst):
if myclass.find('.DS_Store')==-1:
classes.append(myclass)
writer = tf.python_io.TFRecordWriter("train.tfrecords")
for index, name in enumerate(classes):
class_path = dst +'/' + name
#print(class_path)
for img_seq in os.listdir(class_path):
if img_seq.find('DS_Store')==-1:
seq_pos = class_path +'/' + img_seq
if os.path.isdir(seq_pos):
for img_name in os.listdir(seq_pos):
img_path = seq_pos +'/' + img_name
img = Image.open(img_path)
img = img.resize((64,64))
img_raw = img.tobytes()
#print (img,index)
example = tf.train.Example(features=tf.train.Features(feature={
"label":tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
'img_raw':tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))
}))
writer.write(example.SerializeToString())
writer.close()