Я настроил свой конвейер, начиная с очереди имени файла, как в следующем псевдокоде:
filename_queue = tf.train.string_input_producer(["file0.pd", "file1.pd"])
указывает на TFRecords
, содержащий несколько сериализованных tf.train.Example
изображений. Следуя руководству tenorflow, функция, которая читает один пример:
def read_my_file_format(filename_queue):
reader = tf.SomeReader()
key, record_string = reader.read(filename_queue)
example, label = tf.some_decoder(record_string)
processed_example = some_processing(example)
return processed_example, label
который используется для пакетной очереди:
def input_pipeline(filenames, batch_size):
filename_queue = tf.train.string_input_producer(filenames)
example, label = read_my_file_format(filename_queue)
example_batch, label_batch = tf.train.shuffle_batch(
[example, label], batch_size=batch_size, capacity=100,
min_after_dequeue=10)
return example_batch, label_batch
Я ищу способ случайным образом разбить данные на обучающие и тестовые наборы. Я не хочу сохранять обучающий и тестовый набор в разных файлах, но чтобы изображения случайным образом назначались для обучения или тестового набора независимо от файла, из которого они читаются. В идеале я хотел бы разделить входной конвейер на обучающую и тестовую очереди.
Вот что я обычно делаю в numpy, когда мне нужно разбить огромный набор данных
import numpy as np
from numpy.random import choice
from numpy.random import RandomState
queue = range(10)
weights = (.8,.2) # create 2 partitions with this weights
def sampler(partition, seed=0):
rng = RandomState(seed)
return lambda x: rng.choice(np.arange(len(weights)), p=weights) == partition
def split(queue, weights):
# filter the queue for each partition
return [filter(sampler(partition), queue) for partition in range(len(weights)) ]
(train, test) = split(queue, weights)
print(list(train)) # [0, 1, 2, 3, 4, 5, 6, 9]
print(list(test)) # [7, 8]
sklearn.model_selection.train_test_split()
- person igrinis   schedule 10.07.2018