В последней теме (см. предыдущий пост в https://medium.com/birdie-ai/how-to-use-cnns-as-feature-extractors-54c69c1d4bdf) я представил вводные концепции сверточных сетей (CNN). ) и процесс извлечения признаков с использованием этих архитектур. Извлечение признаков — это широко используемый подход, когда мы хотим воспользоваться потенциалом глубокой сети, не имея необходимого количества примеров для непосредственного обучения сети. Таким образом, мы понимаем, что сверточные сети обладают высокой описательной способностью. С другой стороны, когда у нас есть значительное количество обучающих примеров, мы можем использовать второй ресурс: тонкая настройка сети. Этот подход также повторно использует предварительно обученную сеть; однако адаптировать предыдущую тренировку к текущей задаче. Мы знаем, что начальные слои сети обеспечивают изучение низкоуровневых функций, цветов и форм, которые не зависят от используемого набора данных. Таким образом, независимо от контекста, который мы хотим применить, эти слои предоставляют очень похожие функции, то есть эти слои являются более общими. Напротив, последние слои сети более специфичны, в которых ее обучение полностью зависит от примеров, предоставленных для обучения [Yosinski, 2014]. Поэтому мы можем уточнить предыдущее обучение сети для новой задачи, подкорректировав веса сети, особенно в конечных слоях.

Итак, перейдем непосредственно к практическому примеру. Как и в процедуре извлечения признаков, мы загружаем предварительно обученную модель (ResNet50 [He, 2016]) и определяем, до какого уровня мы хотим рассмотреть. Например, мы рассматриваем от первого слоя (входного) к предпоследнему (-2). Исходная модель была подготовлена ​​для прогнозирования 1000 классов из обучающей выборки (ImageNet [Russakovsky, 2015]). В нашем примере используемый набор данных содержит всего 10 классов. Следовательно, мы изменим окончательный слой предсказания, добавив плотный слой с 10 нейронами (numberClasses = 10). Обратите внимание, что выбранная функция активации была softmax, которая преобразует полученные значения в вероятности. Наша новая архитектура готова. Теперь нам нужно скомпилировать структуру с настройками обучения. Для каждой CNN требуется функция потерь и метод оптимизации, а также метрика оценки. Для подробностей и разнообразия возможностей этих элементов я рекомендую прочитать более подробную статью [Ponti, 2017] и/или документацию библиотеки Keras (https://keras.io/api/). Для нашего примера выбрана функция потерь categorial_crossentropy с оптимизатором adam.

Теперь нам нужно переобучить сеть, чтобы мы могли проверить ее производительность в нашем тестовом наборе. Чтобы перетасовать обучающий набор, мы можем применить перестановку, а затем обучить сеть, используя концепцию пакетной обработки. Библиотека Keras предлагает и другие обучающие функции, но я выбрал эту, чтобы дидактика по отношению к батчу была более наглядной. Когда мы обучаем CNN, мы хотим, чтобы все изображения передавались архитектуре. Однако доступной оперативной памяти может не хватить для загрузки всех примеров. Затем размер пакета определяет определенное количество изображений, которые будут передаваться в CNN за раз. Таким образом, когда все изображения загружены в сеть, эпоха завершается. Мы должны выполнить этот процесс для «n» эпох (numberEpochs в коде). В литературе у нас есть несколько эвристик для определения идеального размера партии, но мы оставим это для будущей темы.

По окончании обучения мы использовали тестовый набор для проверки достигнутой производительности. Следовательно, мы просто используем функцию оценки в обученной модели. См. полный пример на https://github.com/fernandopersan/medium/blob/main/CNNFineTuning.ipynb

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

Ссылки:

[He, 2016] K. He, X. Zhang, S. Ren и J. Sun, «Глубокое остаточное обучение для распознавания изображений», в материалах конференции IEEE по компьютерному зрению и распознаванию образов, 2016 г., стр. 770– 778.

[Ponti, 2017] M. Ponti, LS Ribeiro, TS Nazare, T. Bui и J. Collomosse, «Все, что вы хотели знать о глубоком обучении для компьютерного зрения, но боялись спросить», на 30-й конференции SIBGRAPI по графике, Учебники по узорам и изображениям (SIBGRAPI-T 2017), 2017, стр. 17–41.

[Русаковский, 2015] О. Русаковский, Дж. Денг, Х. Су, Дж. Краузе, С. Сатиш, С. Ма, З. Хуанг, А. Карпати, А. Хосла, М. Бернштейн и др., «Imagenet крупномасштабная задача визуального распознавания», Международный журнал компьютерного зрения, том. 115, нет. 3, стр. 211–252, 2015.

[Сантос, 2020] Сантос, Ф. П.; «Возможности переноса обучения между областями для задач распознавания изображений и видео», докторская диссертация Университета Сан-Паулу, 2020 г.

[Йосински, 2014] Дж. Йосински, Дж. Клун, Ю. Бенжио и Х. Липсон, «Насколько переносимы функции в глубоких нейронных сетях?» в Достижениях в области нейронных систем обработки информации, 2014 г., стр. 3320–3328.