Часть I. Введение в проблему и простое решение

Часть II: Работа с данными из реального мира

Это прекрасное время, чтобы заняться машинным обучением. Существуют инструменты и ресурсы, которые помогут любому, у кого есть некоторые навыки программирования и проблема, которую нужно решить, сделать интересную работу. Я слежу за Практическим глубоким обучением для программистов и Курсом обучения с подкреплением Дэвида Сильве р. Машинное обучение без докторской степени - отличное введение в технологии глубокого обучения. Они, наряду со всеми статьями, на которые есть ссылки из Hacker News и Two Minute Papers, вдохновили меня попробовать некоторые идеи.

В прошлом я работал над процессом настройки устройства IoT, подключаясь к нему с iPhone через BTLE. Одна из уязвимостей использования одного канала для настройки - это атака Man-in-the-middle. Один из способов обойти MitM - использовать внеполосную аутентификацию открытых ключей, которыми обмениваются. Это может быть сделано путем кодирования случайного битового шаблона на светодиодах устройств и считывания их с камеры на телефоне. Это будет менее сложная версия протокола настройки Apple Watch, но все же очень эффективная.

Устройство, о котором я думаю, имеет на передней панели набор огней 5x5. 2²⁵ может кодировать 33 554 432 варианта, что идеально подходит для проверки обмена ключами. Теперь задача состоит в том, чтобы найти способ автоматического извлечения битового шаблона из изображения.

Сначала я попытался адаптировать сеть VGG16, использовавшуюся в ранней части Fast.ai MOOC. Я попробовал несколько раундов обучения и применения стандартных советов по тонкой настройке сети. Это не дало значимых результатов. VGG16 и подобные глубокие сети отлично подходят для определения одной категории, но я не был уверен, сможет ли он отслеживать 25 огней. В Части II я показываю, как может работать сеть типа VGG16. Сделав перерыв, подумав и прочитав о других проектах и ​​техниках, я наткнулся на автоэнкодеры. Автоэнкодер - это нейронная сеть, которая кодирует входные данные в меньший вектор, а затем декодирует этот вектор до исходного размера. Функция потерь используется для сравнения разницы между входом и выходом. Затем автокодер можно обучить, чтобы минимизировать потери.

Автоэнкодеры - не самая сложная техника, но лучше начать с простого решения. Создание автоэнкодеров в Керасе - отличное введение, и мои исследования здесь внимательно следят за этой публикацией.

Генерация изображений

Чтобы обучить автоэнкодер, нам понадобятся изображения. Ниже приведен код Python для рисования изображения, которое мы хотим распознать. К счастью, мы можем легко создавать образы, с которыми нужно тренироваться. Изображения реального мира будет сложнее получить в тех объемах, которые здесь необходимы.

Простой автоэнкодер

Теперь, когда у нас есть генератор изображений, мы можем сделать очень простой автокодировщик. Это почти идентично первому автоэнкодеру из блога Keras.

После 500 итераций с размером пакета 128 мы получаем потери 0,1012. Это примерно уровень потерь с первой попытки в блоге автоэнкодера. Вот что мы видим. Входное изображение вверху, декодированное внизу.

Это выглядит не так хорошо, как я ожидал, но обратите внимание на небольшое изменение цвета точек. Давайте сделаем еще несколько тысяч итераций.

5000 итераций приводят к потере 0,0031.

Это больше походит на это. Теперь еще 5000, и все должно быть хорошо.

После 10 000 итераций потеря составляет 0,000288.

Выглядит неплохо, но эта простая сеть не выдержит ввода реального мира. Посмотрите мой следующий пост, где я покажу, что нужно, чтобы распознать точечный узор на фотографиях. Тогда как запустить сеть на iPhone с помощью CoreML.

Часть II: Работа с данными из реального мира