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

Caffe, Pytorch и TensorFlow в наши дни считаются наиболее популярными фреймворками для выполнения операций глубокого обучения. Тем не менее, Pytorch, будучи более надежным и гибким, широко используется в исследованиях благодаря большому количеству хорошо совместимых алгоритмов оптимизации. С другой стороны, у Caffe также есть способ быстрее реализовать и развернуть глубокие нейронные сети на графическом процессоре, поскольку у него есть ускоренные библиотеки, специально предназначенные для этого. Он также поддерживает довольно хороший интерфейс Matlab и Python. Внутренние типы данных расположены аналогично массивам numpy, поэтому их можно рассматривать как массивы numpy.

Я не буду ограничивать эту статью сравнением фреймворка, а сначала сравним процедуру обучения и тестирования Fastai с тем, что я сделал с Caffe. Давайте прыгнем:

Чтобы начать обучение, нам требуется набор данных, и этот набор данных зависит от задачи, которую мы хотим выполнить. Как я уже упоминал, мы будем делать семантическую сегментацию изображений для 5 классов, включая пешеходов, дорожные знаки, автомобили, дорогу и другие препятствия. Для этого я использовал набор данных городского пейзажа, состоящий из 5000 помеченных изображений. Тестовый набор содержит четыре различных типа изображений, таких как изображение с меткой, изображение экземпляра, изображение многоугольника и левое 8-битное изображение.

По сравнению с Fastai, где мы используем изображения для обучения наших различных моделей, Caffe предлагает два разных решения. Один из них аналогичен получению изображений и передаче их на входной слой, как в Fastai, второй предлагает другую структуру, известную как lmdb (база данных с отображением памяти Lightning). Вот две основные причины для использования этого типа, но это зависит от вашего выбора.

  • LMDB использует файлы с отображением памяти, что обеспечивает гораздо лучшую производительность ввода-вывода.
  • Хорошо работает с действительно большими наборами данных. Файлы HDF5 всегда полностью считываются в память, поэтому у вас не может быть файла HDF5, превышающего объем вашей памяти. Однако вы можете легко разделить свои данные на несколько файлов HDF5 (просто укажите несколько путей к h5files в текстовом файле). Опять же, по сравнению с кэшированием страниц LMDB, производительность ввода-вывода будет далеко не такой хорошей.

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

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

learn = ConvLearner.pretrained(arch, data, precompute=True)

пока в кафе…

caffe train \ -gpu 0 \ -solver my_model/solver.prototxt \ -weights my_model/bvlc_reference_caffenet.caffemodel 2&1 | тройник - журнал /my_model.log

Теперь эта простая команда, бывшая Fastai, а затем и в Caffe, может просто запустить вашу тренировку. Разве это не просто?

Используя подход «снизу вверх», который я усвоил из фастая, я попытаюсь объяснить, что именно означают эти две линии.

Сначала для Фастаи,

arch = архитектура, которую мы собираемся использовать

будь то реснет или что-то другое…

данные = входные данные

в нашем случае мы не можем использовать lmdb в fastai, поэтому мы просто выберем изображения

предварительный расчет = правда

true означает использование предварительно обученных весов, замораживание слоев, и поэтому выходные данные из этих наборов слоев не будут меняться в каждой эпохе по мере того, как вы проходите входные данные. Таким образом, вы можете предварительно вычислить выходные данные этих слоев. Это позволяет тренировать более поздние слои, веса которых меняются НАМНОГО быстрее.

Для кафе,

Слово Caffe означает название фреймворка, а «обучение» просто означает, что мы хотим начать обучение.

  • gpu 0 (означает выбор количества gpu, мы также можем использовать несколько gpu, но для этого мы должны включить его в файле caffe make)
  • -решатель (решатель содержит файл, известный как решатель.prototxt, и в этом файле мы определили нашу сеть в два отдельных файла train.prototxt и test.prototxt. Проще говоря, решатель содержит все необходимые гиперпараметры, включая сетевую архитектуру)

train_net: "training/train.prototxt"
test_net: "training/test.prototxt"
test_iter: 125
test_interval: 2000
base_lr: 0,01
display: 100
max_iter: 120000
lr_policy: «многоступенчатый»
gamma: 0,1
power: 1
импульс: 0,9
weight_decay: 0,0001
snapshot: 10000
snapshot_prefix: «обучение/моментальные снимки»
Solver_Mode: GPU
device_id: 0
random_seed: 33
debug_info: false
snapshot_after_train: true
test_initialization: false
stepvalue: 60000
stepvalue: 90000
iter_size: 1
type: «SGD»

Solver.prototxt — это файл конфигурации, используемый для того, чтобы сообщить caffe, как вы хотите обучить сеть.

Параметры

base_lr

Этот параметр указывает базовую (начальную) скорость обучения сети. Значение представляет собой действительное число (с плавающей запятой).

lr_policy

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

Варианты включают:

  1. «шаг» — снизить скорость обучения в размерах шага, указанных параметром гаммы.
  2. «многошаговый» — снизить скорость обучения в размере шага, указанном гаммой, при каждом указанном значении шага.
  3. «фиксированный» — скорость обучения не меняется.
  4. «exp» — base_lr * gamma^iter
  5. «poly» — эффективная скорость обучения соответствует полиномиальному затуханию и равна нулю на max_iter.
    base_lr * (1 — iter/max_iter) ^ (мощность)
  6. «сигмоид» — эффективная скорость обучения соответствует сигмодальному затуханию.
    base_lr * ( 1/(1 + exp(-gamma * (iter — размер шага))))

где base_lr, max_iter, gamma, step, stepvalue и power определены в буфере протокола параметров решателя, а iter — текущая итерация.

гамма

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

размер шага

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

шаговое значение

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

max_iter

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

импульс

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

weight_decay

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

случайное зерно

Случайное начальное число, используемое решателем и сетью (например, в отсевающем слое).

режим_решателя

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

Варианты включают:

  1. Процессор
  2. графический процессор

снимок

Этот параметр указывает, как часто кафе должно выводить модель и состояние решателя. Это значение является положительным целым числом.

snapshot_prefix

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

сеть

Этот параметр указывает расположение обучаемой сети (путь к prototxt). Это значение представляет собой строку в двойных кавычках.

iter_size

Накапливайте градиенты между партиями с помощью поля решателя iter_size. С этим параметром batch_size: 16 с iter_size: 1 и batch_size: 4 с iter_size: 4 эквивалентны.

test_iter

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

test_interval

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

отображать

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

тип

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

Варианты включают:

  1. Стохастический градиентный спуск «SGD»
  2. АдаДельта «АдаДельта»
  3. Адаптивный градиент «АдаГрад»
  4. Адам «Адам»
  5. Ускоренный градиент Нестерова «Нестеров»
  6. RMSprop «RMSProp»

Одно из преимуществ, которое я нашел в fastai, заключается в том, что он преобразовал некоторые из недавних статей в полезные функции, и с Caffe не так много возможностей для адаптации, например. lr_find, В Fastai действительно может быть полезно, что в дальнейшем помогает получить лучшие результаты быстрее, чем при использовании метода проб и ошибок в Caffe.