www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Как я решил свою первую проблему в Kaggle, используя глубокое обучение - часть 1

Дата публикации Jun 10, 2017

В течение последних нескольких недель я брал бесплатно и отличноfast.aiонлайн-курс, который преподает глубокое обучение с практической точки зрения. Исходя из опыта программирования, я обнаружил, что это правильный подход. Однако я дополняю свое теоретическое понимание различными материалами (я настоятельно рекомендую эти заметки изCS231n Стэнфордский курс).

Введите Kaggle

Kaggleэто боевая арена и тренировочная площадка для прикладных задач глубокого обучения, и я был привлечен к одному, в частности:Обнаружение отвлеченных водителей совхозавызов. В этом задании нам дается обучающий набор из около 20 тысяч фотографий водителей, которые находятся в сфокусированном или отвлеченном состоянии (например, держат телефон, укладывают макияж и т. Д.). Тестовый набор состоит из около 80К изображений. Цель состоит в том, чтобы построить модель, которая может точно классифицировать данную фотографию водителя среди набора из 10 классов, минимизируя при этомпотеря журнала(т. е. штрафные баллы увеличиваются каждый раз, когда ваш классификатор получает неправильный прогноз по порядку ведения журнала).

Меня интересует задача совхоза, потому что я сейчас строюKamCar- приложение на основе искусственного интеллекта для телефонов, которое сделает вождение более безопасным и насыщенным. Одна вещь, которую сделает KamCar, это обнаружение отвлечения / сонливости водителя и предупреждение водителей, чтобы избежать катастроф. Отвлечение водителя является причиной 20% автомобильных аварий в соответствии сCDCи я считаю, что с учетом современных достижений в области глубокого обучения и увеличения мощности смартфонов мы можем сделать больше для борьбы с этим бедствием.

Водитель в разных отвлеченных состояниях

Прежде чем внимательно следитьДжереми ХовардИспользуя методологию fast.ai, я попробовал свои собственные глупые методы, которые дали плохие результаты.

Шаг 1. Получите правильную проверку

Насколько я могу судить, не существует четкого правила относительно того, сколько тренировочного набора должно быть в наборе проверки, поэтому я разрабатываю соотношение 80/20 между обучающими и проверочными наборами.

Когда я начал решать задачу совхоза, я просто переместил 20% изображений во всех 10 классах - от обучения к проверке. Но поскольку я запустил простую линейную модель для данных, потери на тренировочном наборе были огромными (более 14), в то время как точность проверочного набора не превысила 17%.

Я вернулся на страницу с запросом совхоза, еще раз прочитал ее детали и заметил следующее:

Поезд и тестовые данные делятся на водителей,так что один водитель может появиться только в поезде или тестовом наборе.

Интересный…Я подумал ... Поскольку мы проверяем (а не обучаем) нашу модель по набору валидации, она должна демонстрировать свойства, аналогичные тестовому набору, верно? Поэтому решение состоит в том, чтобыразделить обучение и проверочный набор таким образом, чтобы процент водителей в проверочном наборе отсутствовал в обучающем наборе.Государственная ферма удобно предоставляет файл CSV, который сопоставляет данный идентификатор драйвера с именем файла, поэтому разделение было довольно простым:

import pandas as pd
import randomdf = pd.read_csv(path + ‘/driver_imgs_list.csv’)
by_drivers = df.groupby(‘subject’)
unique_drivers = by_drivers.groups.keys()# Set validation set percentage with regards to training set
val_pct = 0.2
random.shuffle(unique_drivers)# These are the drivers we will be entirely moving to the validation set
to_val_drivers = unique_drivers[:int(len(unique_drivers) * val_pct)]

Шаг 2 - Начните с набора образцов

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

Набор образцов - это всего лишь набор обучающих и проверочных наборов: ваша модель будет сопоставляться с образцом учебных наборов для быстрой оценки того, что работает, а что нет. Это позволило мне сэкономить много времени! Я выбрал свой набор выборок, чтобы он составлял около 20% данных, где изображения были случайным образом скопированы в набор образцов.

Шаг 3 - Попробуйте модель barebones

Приведенная ниже модель настолько проста, насколько это возможно, на самом деле у нее нет сверточного слоя вообще

def linear_model():
model = Sequential() # image size is 3 (RGB) x 224x224 (WidthxHeight)
model.add(BatchNormalization(axis=1, input_shape=(3, img_size_1D, img_size_1D)))

model.add(Flatten())
# here we have 10 classes
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model

Интересно было увидеть, как удалось достичь почти 40% точности на наборе валидации без свертки и регуляризации!

model = linear_model()
model.optimizer.lr = 10e-5model.fit_generator(sample_train_batches, samples_per_epoch=sample_train_batches.nb_sample, nb_epoch=3,
validation_data=sample_val_batches, nb_val_samples=sample_val_batches.nb_sample, verbose=1)Epoch 1/3
1803/1803 [==============================] - 29s - loss: 5.7358 - acc: 0.2806 - val_loss: 10.9750 - val_acc: 0.1741
Epoch 2/3
1803/1803 [==============================] - 24s - loss: 1.6279 - acc: 0.6339 - val_loss: 4.6160 - val_acc: 0.3304
Epoch 3/3
1803/1803 [==============================] - 24s - loss: 0.5111 - acc: 0.8358 - val_loss: 3.1399 - val_acc: 0.3951

Очевидно, вы можете сказать, что он в значительной степени соответствует обучающему набору, поскольку всего за 3 полных прогона он достигает точности более 80%, а точность набора проверки в два раза хуже. Проблема в том, что наша простая модель научилась запоминать правильные веса для большинства изображений, что мешает ей хорошо обобщать образы драйверов, с которыми никогда раньше не сталкивались (и угадайте, что они все в наборе проверки!).

Шаг 4 - Добавьте немного свертки в вашу жизнь

Пример сверточной нейронной сети - из блога Адита Дешпандеhttps: //adeshpande3.github -й /

Хорошо, вот тут-то и начинается самое интересное ... Я создал модель модели с несколькими свертками, чтобы проверить, улучшится ли точность с такой архитектурой:

def simple_convnet():
model = Sequential([
BatchNormalization(axis=1, input_shape=(3,224,224)),
Convolution2D(32,3,3, activation='relu'),
BatchNormalization(axis=1),
MaxPooling2D((3,3)),
Convolution2D(64,3,3, activation='relu'),
BatchNormalization(axis=1),
MaxPooling2D((3,3)),
Flatten(),
Dense(200, activation='relu'),
BatchNormalization(),
Dense(10, activation='softmax')
])model.compile(Adam(lr=1e-5), loss='categorical_crossentropy', metrics=['accuracy'])
return model

Удивительно (по крайней мере для меня), модель довольно плохо работала на проверочном наборе, но достигла 100% точности на обучающем наборе довольно быстро:

Epoch 1/3
1803/1803 [==============================] - 34s - loss: 1.2825 - acc: 0.6184 - val_loss: 2.0999 - val_acc: 0.2612
Epoch 2/3
1803/1803 [==============================] - 25s - loss: 0.2360 - acc: 0.9590 - val_loss: 2.2691 - val_acc: 0.2098
Epoch 3/3
1803/1803 [==============================] - 26s - loss: 0.0809 - acc: 0.9939 - val_loss: 2.4817 - val_acc: 0.1808
Epoch 1/3
1803/1803 [==============================] - 30s - loss: 0.0289 - acc: 0.9994 - val_loss: 2.6927 - val_acc: 0.1585
Epoch 2/3
1803/1803 [==============================] - 29s - loss: 0.0160 - acc: 1.0000 - val_loss: 2.7905 - val_acc: 0.1540
Epoch 3/3
1803/1803 [==============================] - 26s - loss: 0.0128 - acc: 1.0000 - val_loss: 2.7741 - val_acc: 0.1562

Шаг 5 - Когда есть желание, есть увеличение

Увеличение данных позволяет нам применять случайные модификации к изображению, чтобы уменьшить способность модели запоминать веса для этого конкретного изображения. Некоторые типы увеличения включают вращение, сдвиг ширины / высоты,сдвиги смена каналов RGB. Я попробовал несколько параметров и остановился на следующем для лучших результатов:

gen_all = image.ImageDataGenerator(rotation_range=15, height_shift_range=0.05, shear_range=0.15, channel_shift_range=10, width_shift_range=0.1)

После многих прогонов мне удалось достичь 60% точности набора проверки, что очень радует:

Epoch 13/15
1803/1803 [==============================] - 26s - loss: 0.4834 - acc: 0.8697 - val_loss: 1.4806 - val_acc: 0.5625
Epoch 14/15
1803/1803 [==============================] - 26s - loss: 0.4944 - acc: 0.8658 - val_loss: 1.4361 - val_acc: 0.5759
Epoch 15/15
1803/1803 [==============================] - 27s - loss: 0.4959 - acc: 0.8597 - val_loss: 1.3884 - val_acc: 0.6004

Неплохо для такой простой модели, не правда ли?

Совсем неплохо, по словам Мишель Обамы

Я работаю над частью 2 этой серии, где мы будем использовать полный набор данных и выполнятьтрансферное обучениеиспользуя на уже предварительно подготовленныхVGG Netмодель. Код скоро будет доступен на моемGitHubтакже.

Оставайтесь с нами, делитесь, если хотите, и не стесняйтесь оставлять комментарии :).


Я зданиеKamCar, приложение для видеорегистратора с питанием от AI, которое делает вождение более безопасным и насыщенным. Если вы разработчик мобильных приложений и хотите поработать над интересной технологией и продуктом, которые имеют РЕАЛЬНОЕ влияние, или просто кто-то, кто хочет дать какой-то совет, напишите мнещебетили здесь :)

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map