2018.05.25 Дообучение нейронной сети VGG16 для различения кошки
Запись от jvf размещена 25.05.2018 в 13:58
В прошлых блогах я рассказывал, что решил для развлечения написать две программы, в которых будут задействованы алгоритмы машинного обучения. Первая -- программа автоматически будет делать скриншоты моего рабочего стола, а потом я буду пытаться как-то их изучать с помощью алгоритмов машинного обучения. Вторая -- у меня есть веб-камера, она будет непрерывно установлена, и когда кто-то будет проходить мимо, то будет срабатывать детектор движения. Цель программы -- отличить кошку от меня и ложных срабатываний. В этих программах нет большого практического смысла, я их пишу просто для развлечения. Эти программы я уже написал. И первая, и вторая собирают статистику. Но пока данных очень мало, особенно по кошке, потому что она редко проходит рядом с камерой, а, соответственно, и данные набираются очень медленно. Можно, конечно, ждать сто лет, прежде чем начать писать нейронную сеть, пока не наберу достаточных данных, но хочется действовать уже сейчас. Поэтому вчера я написал программу: так как данных по кошке очень мало (ленивое животное предпочитает спать, а не ходить рядом с камерой), то решил попробовать дообучить нейронную сеть VGG16 на около 100 снимках. Вот код. Импортируем необходимые библиотеки:
validation_data_dir - где лежат данные для валидации
Start Epoch 1/5 200/200 [==============================] - 541s 3s/step - loss: 0.1820 - acc: 0.9200 - val_loss: 0.4298 - val_acc: 0.8571 Epoch 2/5 200/200 [==============================] - 610s 3s/step - loss: 0.1115 - acc: 0.9487 - val_loss: 0.4841 - val_acc: 0.8776 Epoch 3/5 200/200 [==============================] - 622s 3s/step - loss: 0.0856 - acc: 0.9644 - val_loss: 0.4927 - val_acc: 0.8980 Epoch 4/5 200/200 [==============================] - 449s 2s/step - loss: 0.0623 - acc: 0.9744 - val_loss: 0.5442 - val_acc: 0.8571 Epoch 00004: early stopping <keras.callbacks.History at 0x7fe24c865240> Мы видим, что обучение прервалось на 4-ой эпохи, потому что значения val_vacc упали. Иными словами, нам хватит трёх эпох.
test_data_dir - папка, где лежат тестовые данные nb_test_samples - количество файлов с тестовыми данными
Что мы видим? Аккуратность на данных на обучении равна 0.9744, а на валидации и на тесте -- 85 и 87 процентов. Возможно, всё равно наша сеть переобучена, и имеет смысл сократить число нейронов на выходном слое. Один из критериев переобучения -- когда результаты на обучающей выборе значительно лучше, чем на тестовой. У нас разница в 10 процентов, поэтому, возможно, мы имеем переобучение, и в следующей раз стоит попробовать запустить сеть с меньшим числом нейронов на выходном слое. Интересное видео о машинном обучении: Сверточные нейронные сети | Глубокие нейронные сети на Python https://www.youtube.com/watch?v=52U4BG0ENiM Интересные мысли из видео: 1. В свёрточных нейронных сетях меньше количество параметров по сравнению с обычными. 2. Изображение представляется в виде плоского массива, теряется информация о топологии сети 3. Чтобы избавиться от этих проблем, были предложены другие сети под название "свёрточные нейронные сети", они используются сейчас для распознавания изображений, видео. 4. Операция свёртка -- это когда мы берём один участок изображения. Затем у нас есть некая свёртка -- массив данных. Им перемножаем две таблички, затем складываем полученные значения. Затем к этому значению может применять некоторая функция активации. 5. Было придумано много ядер свёртки, например, размытие, выделение границ, повышение чёткости и т.п. 6. В нейронных сетях ядра свёртки определяются автоматически в процессе обучения 7. Ещё один принцип в свёрточных нейронных сетях -- уменьшение их размерности (subsampling). Мы берём некоторую часть изображения, и находим в этой части максимальный элемент. Затем получаем новую табличку с максимальными элементами. 8. Свёрточные нейронные сети -- это сети, где чередуются слои свёртки (convolutions) и подвыборки (subsampling). 9. В каждом слое используется не обязательно одно ядро свёртки. Их может быть несколько. Набор слоёв нейронов, каждый их которых использует разные ядра свёртки для поиска разных признаков, называется картой признаков. 10. В конце свёрточной нейронной сети находится обычные слои, так называемся Full connection. Последний слой -- выходной. Интересные тексты о машинном обучении: https://www.kaggle.com/yassine... -997-top-6 Здесь рассказывается о том, как понять, нет ли у нас переобучения нашей сети. Мы строим графики "Training loss", "validation loss", "Training accuracy", "Validation accuracy". На одном графике размещаем линии с "Training loss" и "validation loss", а на втором графике -- "Training accuracy" и "Validation accuracy"
Соответственно, мне тоже нужно будет построить этот график для моей модели и посмотреть, будет ли мой график похож на график автора (и вообще что за график я получу): Согласно тексту автор графики двух кривых, если модель подобрана верно, должен быть приблизительно таким: http://img1.imagilive.com/0717... ss_acc.png В приложении к этому тексту находится изображения, которые собирает мой детектор кошки: мы видим не всю кошку, а только то, что попало в детектор движения. Плюс мы немного расширяем детектор движения, чтобы изображения были побольше. Вот мы и получили около 250 подобных снимков. Все они маленькие, все они немного размытые, но всё равно, думаю, что с ними будет возможно что-то сделать. |
Всего комментариев 2
Комментарии
-
Цитата:У нас очень мало данных
Запись от VTsaregorodtsev размещена 25.05.2018 в 20:42 -
Спасибо за идею, отличная мысль.
Запись от jvf размещена 26.05.2018 в 15:33