Когда я впервые прочитал о Практическом глубоком обучении для программистов, мне было немного трудно поверить, что я могу обучить нейронную сеть с помощью 7 строк кода. Как и у большинства людей, у меня была очень естественная реакция. «Чёрт возьми!?! Это невозможно!"
Вот и я, через 10 минут первого урока, тренирующего VGG-16
сверточную нейронную сеть для классификации изображений кошек и собак. Это было безумно легко. На самом деле, это слишком просто.
С точностью 98% в самую первую эпоху он оказался на удивление точным. «Аарон, ты прирожденный». Да, спасибо, но я это уже знаю.
Неужели я действительно сделал что-нибудь экстраординарное? Нет. После беглого взгляда на Vgg16
класс, который идет с остальной частью кода, используемого для Практического глубокого обучения для кодеров, стало очевидно, что vgg = Vgg16()
инициализирует экземпляр класса, который затемняет не очень красивые части создания модель нейронной сети.
Вот пример того, как это выглядит:
def create(self): model = self.model = Sequential() model.add( Lambda(vgg_preprocess, input_shape=(3,224,224), output_shape=(3,224,224)) ) self.ConvBlock(2, 64) self.ConvBlock(2, 128) self.ConvBlock(3, 256) self.ConvBlock(3, 512) self.ConvBlock(3, 512) model.add(Flatten()) self.FCBlock() self.FCBlock() model.add(Dense(1000, activation='softmax')) fname = 'vgg16.h5' model.load_weights(get_file( fname, self.FILE_PATH+fname, cache_subdir='models' ))
Я не собираюсь делать вид, что я знаю, что означает 100% этого кода, но насколько я понимаю, он инициализирует последовательную модель Keras, а затем определяет входные, выходные и скрытые слои этой модели. Он также загружает в модель предварительно обученные веса.
Хорошо, может быть, я солгал себе о моем так называемом природном таланте, когда дело доходит до глубокого обучения, но я хорошо настроил и подогнал модель vgg
с данными обучения и проверки. Ладно, может, я и об этом лгу ... Это не отменяет того, как здорово учить мой компьютер различать кошек и собак!
Из любопытства я решил запустить этот код на наборе данных Dogs vs. Cats Redux из Kaggle. По общему признанию, моя первая заявка была не такой удачной. Если бы я был тремя месяцами раньше, когда это соревнование было еще открыто, я бы получил ~ 1100 из 1314 человек, уже находящихся в таблице лидеров. Увидев, что моя точность проверки составляет 98%, я решил исследовать.
Проведя два часа, выдирая себе волосы, я наткнулся на этого мерзкого человечка:
Kaggle использует эту функцию для ранжирования представленных материалов. Оказывается, когда вы соревнуетесь на Kaggle, плохо, когда модель настолько уверена в том, что изображение - это кошка, что ставит на него отметку 0. Это приводит к нарушению функции LogLoss на Kaggle, что приводит к ужасным результатам.
Так как я могу сделать это лучше? Почему бы просто не установить крайние значения 0 и 1 равными 0,02 и 0,98 соответственно? БАМ. Именно так я перехожу от ~ 1100 до ~ 500, что позволяет мне попасть в первые 50% таблицы лидеров.
Хорошо, ты поймал меня. Так что, возможно, мне пришлось положиться на Джереми (парня, который преподает курс), чтобы понять, что моя самоуверенная модель была проблемой. Подробности, подробности.
В целом, обучение моего первого CNN было действительно забавным. Не могу дождаться начала лекции 2!
Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсуждать рекламные и спонсорские возможности.
Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!