При рассмотрении методов глубокого обучения для обучения наших данных мы часто сталкиваемся с двумя проблемами, которые требуют: огромный объем обучающих данных и мощная вычислительная инфраструктура.

Крупные компании, такие как Google, Amazon, часто проводят исследования на больших наборах данных, таких как ImageNet, которые содержат более миллиона изображений и используют большое количество графических процессоров.

Мы можем решить проблему вычислительной мощности, используя Amazon AWS, Google Cloud Platform, Azure или Google Colab, где мы можем использовать бесплатную мощность GPU и TPU. Подробнее о Google Colab читайте в этом блоге.



Теперь перейдем к другой проблеме, т. е. большим обучающим данным. Первый вопрос, который приходит нам на ум, —

1. Почему требуется большой объем данных?

Когда вы обучаете модель глубокого обучения, на самом деле вы настраиваете ее параметры таким образом, чтобы она могла сопоставлять определенные входные данные (например, изображение) с некоторыми выходными данными (меткой). Наша цель оптимизации состоит в том, чтобы преследовать ту золотую середину, где потери нашей модели низки, что происходит, когда ваши параметры настроены правильно. Естественно, если у вас много параметров, вам нужно будет показать вашей модели машинного обучения пропорциональное количество примеров, чтобы добиться хорошей производительности. Кроме того, количество необходимых вам параметров пропорционально сложности задачи, которую должна выполнять ваша модель.

Более высокая точность достигается, если у вас есть больший набор изображений для обучения.

2) Сколько данных мне нужно?

«Это зависит» — так ответит большинство практикующих специалистов, когда вы впервые зададите этот вопрос.

Объем данных, необходимых для глубокого обучения, зависит от многих факторов, таких как:

  • Сложность проблемы
  • Сложность алгоритма обучения

Для использования глубокого обучения не нужны большие объемы данных

Но это противоречит утверждениям, написанным выше, так как же это возможно?

Да, это правда. Даже обычный человек, имеющий всего 100–1000 образцов, может увидеть некоторую пользу от глубокого обучения.

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

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

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

Увеличение изображения Keras

Вы немного ленивы и считаете, что должен быть какой-то 'магический блок кода', чтобы увеличивать обучающие изображения в вышеуказанных случаях без написания вручную код для искусственного увеличения изображений с помощью функций cv2 (перевороты, сдвиги, повороты) ?

Что ж, в этом посте мы обсудим ImageDataGenerator Keras, который может избавить вас от вышеуказанных проблем. Класс ImageDataGenerator определяет конфигурацию для подготовки и дополнения данных изображения.

keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsilon=1e-06, rotation_range=0, width_shift_range=0.0, height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0, channel_shift_range=0.0, fill_mode='nearest', cval=0.0, horizontal_flip=False, vertical_flip=False, rescale=None, preprocessing_function=None, data_format=None, validation_split=0.0, dtype=None)

Сюда входят такие возможности, как:

  1. Образцовая стандартизация
  2. Разумная стандартизация функций
  3. ZCA отбеливание
  4. Случайное вращение, сдвиги, сдвиг, масштабирование и флипы
  5. Изменение порядка измерения
  6. Сохранение дополненных изображений на диск

Начнем с импорта пакетов

Здесь ImageDataGenerator используется для указания таких параметров, как вращение, масштабирование, ширина, которые мы будем использовать для создания изображений, о чем будет рассказано позже. img_to_array используется для преобразования данного изображения в массив Numpy, который будет использоваться ImageDataGenerator, load_img будет использоваться для загрузки изображения для изменения в нашу программу. cv2, matplotlib будет использоваться для получения и построения измененных изображений.

Загрузите изображение из локальной папки и преобразуйте его в массив Numpy с помощью img_to_array, а затем измените форму массива Numpy. Здесь мы загрузили изображение бабочки.

Здесь мы использовали ImageDataGenerator(), чтобы указать параметры для создания нашего изображения, что можно объяснить следующим образом:

  • rotation_range : количество поворотов.
  • width_shift_range , height_shift_range :величина смещения по ширине, высоте
  • shear_range : угол сдвига против часовой стрелки в радианах.
  • zoom_range :диапазон произвольного масштабирования.
  • horizontal_flip : логическое значение (истина или ложь). Произвольно отразить входы по горизонтали
  • fill_mode : один из {"констант", "ближайший", "отражающий" или "обертывающий"}. Точки вне границ ввода заполняются в соответствии с заданным режимом

Мы запускаем цикл 16 раз, и для каждой итерации мы используем функцию datatgen.flow(). Мы дали img- массив numpy для входного изображения, save_to_dir- каталог для сохранения вывода, save_prefix- префикс для имен изображений и save_format- формат изображения в качестве входных данных.

Поскольку мы указали 17 итераций, 17 изображений бабочки с изменениями, указанными в датагене, будут созданы и сохранены в папке с именем modified.

Затем с помощью cv2 мы загружаем эти изображения в mod_img и строим подзаговор, используя matplotlib. Окончательный результат, который мы получаем, —

Обратите внимание, что каждое изображение немного отличается от другого из-за масштабирования, поворота, смещения ширины или высоты и т. д. Это поможет модели, которую вы будете строить, распознавать большое количество изображений, что сделает ее более эффективной.

Теперь не откладывайте; Начать

Теперь не позволяйте проблеме размера тренировочного набора помешать вам приступить к обучению модели глубокого обучения. Получите все данные, какие только сможете, расширьте имеющиеся у вас данные с помощью дополнения данных и посмотрите, насколько эффективны модели для решения вашей проблемы.

Дальнейшее чтение:

  1. Вы, вероятно, можете использовать глубокое обучение, даже если ваши данные не такие большие
  2. Построение мощных моделей классификации изображений с использованием очень небольшого количества данных
  3. Увеличение изображения для глубокого обучения с помощью Keras