Когда я впервые прочитал о Практическом глубоком обучении для программистов, мне было немного трудно поверить, что я могу обучить нейронную сеть с помощью 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. Сейчас мы принимаем заявки и рады обсуждать рекламные и спонсорские возможности.

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