Обучение нейронной сети 18 различным действиям.

Архитектура сверточной нейронной сети (CNN) может быть довольно универсальной для задач зрения. В этой статье я расскажу о своем опыте использования одной и той же сетевой архитектуры для 18 различных задач классификации.

В задачи классификации входят такие черты лица, как длина подбородка (3 градации), тип волос (111 типов), цвет волос (10 цветов волос) и т. Д.

Я буду использовать набор данных CartoonSet 100k Image от Google, доступный здесь. Мой код для этих экспериментов доступен здесь.

Для этих экспериментов я использовал версию набора данных 10K. При первоначальном исследовании набор данных состоит из 10 папок. Первым делом необходимо загрузить набор данных с веб-сайта и извлечь его. Вы увидите эти 10 папок:

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

Внутри каждой подпапки находятся файлы изображений мультфильма «.png» и файл дескриптора .csv.

['cs11502169095236683120.csv',
 'cs11502169095236683120.png',
 'cs11502298889929094331.csv',
 'cs11502298889929094331.png',
 'cs11502404786906647764.csv',
 'cs11502404786906647764.png',
 'cs11502407216397343631.csv',
 'cs11502407216397343631.png',
 'cs11502919926067511421.csv',
 'cs11502919926067511421.png']

Сделаем быструю визуализацию: (посмотрите мой код в github)

Существуют соответствующие файлы .csv (с тем же именем, что и у изображений), которые имеют описания в формате:

«Face_shape», 4, 7
«facial_hair», 14, 15
«hair», 29, 111
«eye_color», 2, 5

Каждое из этих описаний может быть особенностями, на основе которых мы можем построить сеть глубокого обучения для классификации изображений. Согласно описанию набора данных page, «Каждое лицо мультфильма в этих наборах состоит из 18 компонентов, которые различаются по 10 атрибутам изображения, 4 атрибутам цвета и 4 атрибута пропорции ”. Количество вариантов для каждого атрибута (которые станут классами для каждой модели) составляет 3 для длины подбородка и 111 для прически.

Согласно странице дизайна набора данных: Каждый из этих компонентов и их вариации были нарисованы одним и тем же художником, Ширазом Фуманом, в результате получилось примерно 250 иллюстраций компонентов мультфильмов и ~ 10 ^ 13 возможные комбинации .

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

Сначала определение сети:

Немного предыстории по различным слоям

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

Максимальное количество слоев в пуле предназначены для дискретизации на основе выборки с целью понизить выборку входного представления. Вы можете видеть, что карты функций начинаются с входного размера (256, 256, 3) и постепенно становятся менее широкими и более глубокими по мере прохождения по сети из-за слоев максимального объединения, а также выбранного шага.

Пакетная нормализация - это способ сдвинуть входные данные к нулевому среднему и единичной дисперсии. Понимание очень высокого уровня помогает сделать данные сопоставимыми по функциям. Общеизвестно, что это приводит к более быстрому обучению (хотя есть и другие интерпретации его эффективности).

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

Теперь перейдем к обучению сети. Для быстрой итерации я хотел использовать image_dataset_from_directory keras, поскольку он заботится о преобразовании размеров изображений, проверочных разделениях, интерполяции и пакетной обработке. Функция приводит к набору данных тензорного потока, с которым довольно просто манипулировать и работать с ним.

train_dataset = tf.keras.preprocessing.image_dataset_from_directory (
training_dir,
labels = ”inferred”,
label_mode = ”int”,
class_names = None,
color_mode = ”Rgb”,
batch_size = 32,
image_size = (256, 256),
shuffle = True,
seed = 42,
validation_split = .2, < br /> subset = "обучение",
interpolation = "bilinear",
follow_links = False,
)

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

Кроме того, я установил обратный вызов tenorboard, чтобы визуализировать потерю. Вот образец визуализации нейронной сети, созданной для классификации «face_shapes».

Наконец, вот таблица, показывающая точность, полученную различными сетями. Я тренировал все это на NVIDIA 2080 Ti.

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

а) Взрывающиеся градиенты - ваш LR слишком велик

б) Функция ошибочной потери - вы используете настраиваемую потерю или правильно используете стандартную. Однажды я использовал выходной слой с меньшим количеством узлов, чем количество классов, которые я предсказывал, и получил нанс на весь день.

в) Входные данные. Есть ли поврежденные экземпляры? - как в случае с первой сетью здесь.

г) Гиперпараметры - у некоторых из них есть взаимозависимости, поэтому перед изменением значений по умолчанию проверьте документацию.

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

Наконец, интерпретируемость.

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

ДЛИНА ПОДБОРОЧКА: 97%

ЦВЕТ ГЛАЗ: 85%

РАССТОЯНИЕ ОТ ГЛАЗ: 84%

ЦВЕТ ОЧКОВ: 54.66%

ЦВЕТ ЛИЦА: 26,04%

Вот как прошла подготовка к этому:

ЦВЕТ ВОЛОС: 96,13%

СТИЛЬ ВОЛОС: 99,70%

Если вы хотите узнать немного больше об интерпретируемости и общем подполе объяснимого ИИ, посмотрите этот пост.

Анализ затраченного времени:

Я потратил около 3 часов на программирование, и все 18 моделей тренировались за ночь на NVIDIA 2080 Ti в течение 30 эпох.

Вывод:

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

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

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