Наборы данных Tensorflow: создание пакетов с данными различной формы - PullRequest
0 голосов
/ 07 января 2020
import tensorflow_datasets as tfds
import tensorflow as tf

def input_fn():

    dataset_builder = tfds.builder("oxford_flowers102")
    dataset_builder.download_and_prepare()

    ds = dataset_builder.as_dataset(split=tfds.Split.TRAIN)
    ds = ds.repeat()
    ds = ds.batch(32)
    return ds

приведет к

InvalidArgumentError: Cannot batch tensors with different shapes in component 1. 
First element had shape [500,666,3] and element 1 had shape [752,500,3]. 
[Op:IteratorGetNextSync]

Это может быть решено с помощью функции изменения размера / заполнения, которая возвращает изображения такой же формы, как показано здесь и здесь

ds = ds.map(resize_or_pad_function)
ds = ds.batch(...)

Однако я не хочу изменять размер или дополнять мои изображения, поскольку я хочу сохранить исходный размер и формат изображений. Он предназначен для обучения сверточной нейронной сети, которая может принимать изображения разных размеров.

Что мне делать, если мне нужны партии тензоров с формой (32, None, None, 3), где каждое изображение имеет разную высоту и ширину?

1 Ответ

1 голос
/ 07 января 2020

В графическом процессоре вычисления ускоряются путем передачи тензоров (одинаковой формы) в граф, где арифметические c и логические c операции выполняются на всем тензоре, когда они проходят через граф (в отличие от их выполнения). по одному). AFAIK - это то, что сейчас поддерживается tenorflow (даже с поддержкой Eager).

Эти тензоры должны иметь нули, и вычисления могут быть выполнены, что мы и сделали бы путем заполнения. В конечном итоге сети придется научиться игнорировать активацию, вызванную черными областями, поскольку они не зависят от метки. Итак, нужно выполнить одно из следующих действий:

  1. Обрезать изображения
  2. Дополнить изображения
  3. Сочетание обоих

любой из которых должен возвращать тензор с определенной формой для любой данной партии.

Тем не менее, все еще возможно иметь нейронную сеть, которая принимает любое изображение на этапе прогнозирования / оценки, как это не будет в пакетном режиме (при запуске в режиме реального времени).

Во время обучения, чтобы избежать

  1. потери информации: например, изменение размера изображения 2048 x 2048 для изображения 28 x 28
  2. чрезмерное заполнение: например, заполнение 28 x 28 изображений с нулями, чтобы сделать его 2048 x 2048

. Лучше объединить вместе изображения почти одинакового размера и разбить набор данных на пакеты разных размеров (при этом в любой партии все еще будут изображения одинакового размера) , как @ xenote cc упоминается в комментариях.

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

Связано:

...