Онлайн передискретизация во входном конвейере Tensorflow

У меня есть входной конвейер, похожий на тот, что вСверточная нейронная сеть руководство. Мой набор данных несбалансирован, и я хочу использовать передискретизацию меньшинства, чтобы попытаться справиться с этим. В идеале я хочу сделать это "онлайн", то есть я не хочу дублировать образцы данных на диске.

По сути, я хочу дублировать отдельные примеры (с некоторой вероятностью) на основе метки. Я немного читал о потоке управления в Tensorflow. И похожеtf.cond(pred, fn1, fn2) это путь Я просто изо всех сил пытаюсь найти правильную параметризацию, так какfn1 а такжеfn2 потребуется выводить списки тензоров, где списки имеют одинаковый размер.

Это примерно то, что я имею до сих пор:

image = image_preprocessing(image_buffer, bbox, False, thread_id)            
pred = tf.reshape(tf.equal(label, tf.convert_to_tensor([2])), [])
r_image = tf.cond(pred, lambda: [tf.identity(image), tf.identity(image)], lambda: [tf.identity(image),])
r_label = tf.cond(pred, lambda: [tf.identity(label), tf.identity(label)], lambda: [tf.identity(label),])

Тем не менее, это вызывает ошибку, как я уже упоминал ранее:

ValueError: fn1 and fn2 must return the same number of results.

Есть идеи?

П.С .: Это мой первый вопрос о переполнении стека. Любая обратная связь по моему вопросу приветствуется.

 Yaroslav Bulatov20 июл. 2016 г., 18:05
Обычно это решается с помощью FIFOQueue
 MRsAIbot20 июл. 2016 г., 18:42
Спасибо за чаевые. Это действительно дало мне правильный ответ. Я редактировал тему.

Ответы на вопрос(1)

я нашел решение для того, что я хотел сделать. Я забыл упомянуть, что код, упомянутый в моем вопросе, сопровождается пакетным методом, таким какbatch() или жеbatch_join().

Эти функции принимают аргумент, который позволяет группировать тензоры различного размера пакета, а не только тензоры одного примера. Аргументenqueue_many и должен быть установлен вTrue.

Следующий кусок кода помогает мне:

for thread_id in range(num_preprocess_threads):

    # Parse a serialized Example proto to extract the image and metadata.
    image_buffer, label_index = parse_example_proto(
            example_serialized)

    image = image_preprocessing(image_buffer, bbox, False, thread_id)

    # Convert 3D tensor of shape [height, width, channels] to 
    # a 4D tensor of shape [batch_size, height, width, channels]
    image = tf.expand_dims(image, 0)

    # Define the boolean predicate to be true when the class label is 1
    pred = tf.equal(label_index, tf.convert_to_tensor([1]))
    pred = tf.reshape(pred, [])

    oversample_factor = 2
    r_image = tf.cond(pred, lambda: tf.concat(0, [image]*oversample_factor), lambda: image)
    r_label = tf.cond(pred, lambda: tf.concat(0, [label_index]*oversample_factor), lambda: label_index)
    images_and_labels.append([r_image, r_label])

images, label_batch = tf.train.shuffle_batch_join(
    images_and_labels,
    batch_size=batch_size,
    capacity=2 * num_preprocess_threads * batch_size,
    min_after_dequeue=1 * num_preprocess_threads * batch_size,
    enqueue_many=True)

Ваш ответ на вопрос