Всем привет!

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

Мы считаем, что лучший способ понять, как это работает, - наблюдать, как это работает!

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

В этом примере мы будем следовать инструкциям курса Fastai DL-1. Большое им спасибо за заставили нейронные сети снова перестать крутиться!

Контекст сообщения:

  1. Выбор набора данных
  2. Исследовательский анализ данных и расширение данных
  3. Создание модели и ученика
  4. Обучение
  5. Анализ результата с помощью тепловой карты

1. Выбор набора данных

Когда вы экспериментируете с новыми вещами, лучший способ следовать - использовать для нас предварительно очищенный набор данных. Потому что мы не хотим терять мотивацию при очистке и подготовке данных для модели. Лучшее место для поиска качественного набора данных и опробования новых вещей - Kaggle!

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

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

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

2. Исследовательский анализ данных и расширение данных

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

tfms = get_transforms(flip_vert=True, max_lighting=0.1, max_zoom=1.05, max_warp=0.)
data = ImageDataBunch.from_folder(
    path = path,
    valid_pct = 0.2,
    bs = 16,
    size = 224,
    ds_tfms = tfms,
).normalize(imagenet_stats)
data
print(data.classes)
data.show_batch()

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

  • Сначала я определился со спецификациями увеличения данных. Я применил вертикальное отражение и некоторую деформацию, чтобы увеличить изображения. Кроме того, поскольку некоторые изображения более темные и на них изображены крошечные растения, я использовал эффект освещения и масштабирование.
  • Я сэкономил 20% набора данных в качестве проверки, чтобы понаблюдать за своим обучением.
  • Я использовал переносное обучение в этой задаче, поэтому нормализовал изображения со статистикой изображения. Также изменил их размер, как в исходном наборе данных imagenet.

3. Создание модели и ученика

Fastai - отличная библиотека для глубокого обучения с простыми в использовании и понятными характеристиками. В этом эксперименте я использовал CNN Learner для обучения моей модели. Итак, у нас есть отличная функция в библиотеке под названием cnn_learner (). Но мы не просто пользователь инструмента, который просто копирует и вставляет коды; мы хотим глубоко понять, что происходит под мостом. В нашей библиотеке есть еще одна замечательная функция doc (). Итак, давайте воспользуемся этим, чтобы понять функцию cnn_learner ():

doc(cnn_learner)
Result:
cnn_learner(data:DataBunch, base_arch:Callable, cut:Union[int, Callable]=None, pretrained:bool=True, lin_ftrs:Optional[Collection[int]]=None, ps:Floats=0.5, custom_head:Optional[Module]=None, split_on:Union[Callable, Collection[ModuleList], NoneType]=None, bn_final:bool=False, init='kaiming_normal_', concat_pool:bool=True, **kwargs:Any)

Итак, теперь мы можем исследовать каждую переменную в этой функции!

После этого мы можем создать нашего ученика. В этой задаче я не акцентирую внимание на точности. Я хочу получить хороший результат, но не буду тратить слишком много времени на тонкую настройку и другие шаги. Я выбрал предварительно обученную модель - resnet34. Эта модель имеет 34 слоя и обучена на наборе данных imagenet. Поскольку в моей задаче есть растения, я считал, что результатов мне будет достаточно.

Давайте создадим учащегося:

learn = cnn_learner(data, models.resnet34, metrics=accuracy)

4. Обучение

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

learn.recorder.plot()

Итак, давайте обучим эту модель:

lr = 0.01
learn.fit_one_cycle(5, slice(lr))

У нас точность 93%, и мне этого достаточно. Если бы я участвовал в этом конкурсе, я бы использовал более сложную архитектуру с тонкой настройкой, а также работал бы над некоторой предварительной обработкой данных, но, поскольку мы сосредоточены на понимании того, что происходит, этого результата более чем достаточно.

5. Анализ результата с помощью тепловой карты

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

def show_heatmap(hm):
    _,ax = plt.subplots()
    xb_im.show(ax)
    ax.imshow(hm, alpha=0.6, extent=(0,224,224,0),
              interpolation='bilinear', cmap='magma')

Я создал функцию тепловой карты для наших изображений размером 224–224 пикселей, используя значение альфа 0,6 и метод магмы. Итак, давайте попробуем это на изображении:

show_heatmap(avg_acts)

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

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

Цель этого поста - объяснить вес в извилинах с помощью радостной методики. Я продолжу писать другие примеры. Пожалуйста, поделитесь со мной своими мыслями!