Всем привет!
Все мы используем некоторые инструменты глубокого обучения для создания приложений для наших проектов. Поскольку в нашу эпоху создать приложение компьютерного зрения очень просто, в отличие от прошлого, иногда эти инструменты мешают нам изучить рабочий механизм алгоритмов.
Мы считаем, что лучший способ понять, как это работает, - наблюдать, как это работает!
Итак, мы поэкспериментируем, как работает CNN и как она делает классификацию с помощью тепловой карты. Это даст нам лучшее понимание свертки, используемой в нейронных сетях, а также важности весов в наших алгоритмах.
В этом примере мы будем следовать инструкциям курса Fastai DL-1. Большое им спасибо за заставили нейронные сети снова перестать крутиться!
Контекст сообщения:
- Выбор набора данных
- Исследовательский анализ данных и расширение данных
- Создание модели и ученика
- Обучение
- Анализ результата с помощью тепловой карты
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)
Результат лучше, чем я предполагал. Почва в верхнем левом углу изображения практически не влияет на результат. И это здорово, потому что в этой области нет ни одной части растения. Кроме того, мы ясно видим, что центр растения больше всего влияет на результат. После этого внешние части растения, расположенные вверху справа и слева внизу изображения, имеют большое влияние на результат.
Тепловые карты - отличные инструменты визуализации, позволяющие понять, что происходит внутри функции свертки. И мы можем применить их к другим областям исследований.
Цель этого поста - объяснить вес в извилинах с помощью радостной методики. Я продолжу писать другие примеры. Пожалуйста, поделитесь со мной своими мыслями!