Если вы следите за любыми из популярных блогов, таких как Исследование Google, FastML, Приключения в стране данных Смолы или одним из таких инди-поп, как Блог Эдвина Чена, вы, вероятно, также использовали ModelZoo. На самом деле, если вы похожи на нашего босса, вы ласково называете его Зоопарк. (На самом деле x 2, если у вас есть интересные блоги, которые вы читаете, дайте нам знать!)

К сожалению, ModelZoo поддерживается только в Caffe. К счастью, мы рассмотрели для вас разницу между ядрами в Keras, Theano и Caffe, и после прочтения этого блога вы сможете загружать модели из ModelZoo в любой из ваших любимых инструментов Python.

Почему этот пост? Почему бы просто не скачать наш код Github?

  • Дело не в простой загрузке данных в массивы графического процессора (хотя это огромно). Существуют некоторые фундаментальные различия в том, как люди видят код глубокого обучения.
  • Этот пост посвящен в первую очередь Keras, а это означает, что простая загрузка нашего кода (или любого другого, на самом деле) может быть быстрым шагом для вас, используя устаревшую технологию. Учитывая, что Франсуа (или многие из вас могут знать его как fchollet) собирается в Google, Керас может отправиться в закат.

Короче говоря, вам лучше понять, как эти вещи работают, прежде чем использовать их. Таким образом, вы будете лучше вооружены для использования новейших наборов инструментов TensorFlow и Neon, если вы создаете прототип и переносите свой код в Caffe.

Выбывать

Итак, есть отсев Хинтона, а затем отсев из Caffe ... и они разные. Вы можете спросить: "Что в этом такого особенного?" Что ж, сэр, у меня есть имя парня для вас, и это Вилли ... мистер. Вилли Нилли. Одна вещь, которая нравится Вилли Нилли, - это число 4096. Еще ему нравится вводить регуляризацию (включая отсев) произвольно, а байесовские теоретики не сторонники этого. Эти люди пытаются вписать свою работу в вероятностные рамки, и они пытаются придерживаться того видения теоретических границ, которые существуют для нейронных сетей. Однако для вас, практикующего, понимание того, кто чем занимается, сэкономит вам часы на отладку кода.

Мы выделили Dropout, потому что способ, которым люди его реализовали, охватывает весь диапазон. На самом деле, у этого варианта есть некоторая история, но никого это не волновало, потому что его оптимизация почти всегда давала аналогичные результаты. Большая часть обсуждения связана с тем, как реализуется правило цепочки, поскольку случайное выбрасывание материала, по-видимому, не является действительно дифференцируемой операцией. Передача градиентов обратно (т. Е. Обратное распространение) - занятие забавное; есть «технически правильный» способ сделать это, а потом есть то, что работает.

Вернемся к ModelZoo, где мы рекомендуем вам отметить единственное предложение по существу в этом разделе, и оно выглядит следующим образом. В то время как Keras и, возможно, другие пакеты умножают градиенты на вероятность удержания во время вывода, Caffe не делает. То есть, если у вас уровень выпадения 0,2, ваша вероятность удержания составляет 0,8, и во время вывода Керас масштабирует результат вашего прогноза на 0,8. Итак, загрузите ModelZoo * .caffemodels, но знайте, что их развертывание в Caffe даст немасштабируемые результаты, в то время как Керас будет.

Хинтон объясняет причину, почему нужно масштабировать, а интуиция такова. Если во время тренировки у вас просачивается только часть сигнала на следующий уровень, вам следует масштабировать ожидание того, какой должна быть энергия вашего окончательного результата. Кажется, странная вещь, о которой нужно заботиться, правда? Аргумент, минимизирующий x, остается таким же, как аргумент, минимизирующий 2x. Это становится проблемой, когда вы передаете несколько градиентов обратно и не реализуете слои равномерно. Caffe работает в таких случаях, как сиамские сети или билинейные сети, но если вы по-разному масштабируете свои сети с двух сторон, не удивляйтесь, если вы получите неожиданные результаты.

Как это выглядит в коде Франсуа? Посмотрите код «Dropout» на Github или в папке установки в keras / Layers / core.py. Если вы хотите создать свой собственный слой для загрузки в модуль Dropout, просто закомментируйте часть кода, которая выполняет это масштабирование:

Вы можете изменить исходный код или создать свой собственный слой. (Мы решили сохранить нашу установку Keras в чистоте и только что реализовали новый класс, расширяющий MaskedLayer.) Кстати, вы должны быть осторожны при использовании Dropout. Наш опыт работы с ними показывает, что они нормально регулируются, но могут очень быстро способствовать исчезновению градиентов.

Свертка

Каждый день, кроме воскресенья и некоторых праздников, несколько избранных профессоров машинного обучения и некоторые руководители обработки сигналов встречаются в неизвестном месте рано утром. Тема их обсуждения почти всегда звучит так: «Как заставить исследователей и практиков глубокого обучения кодировать ошибки в своих программах?» Некоторое время назад был сделан один из выводов: определения свертки и умножения плотных матриц (или взаимной корреляции) должны быть в точности противоположны друг другу. Таким образом, когда люди создают алгоритмы, которые называют себя «сверточными нейронными сетями», никто не будет знать, какая реализация фактически используется для самой части свертки.

Для тех, кто не знает, свертки и быстрое матричное умножение по массиву данных отличаются тем, что свертки будут переворачиваться перед перемещением по массиву. Определение из Википедии:

С другой стороны, если вы проводите перемножение матриц по массиву данных, вы, по сути, делаете кросс-корреляцию, которая в Википедии выглядит так:

Как мы уже сказали, единственная разница в том, что чертов знак минус / плюс, который вызывал у нас головную боль.

Нам известно, что Теано и Каффе придерживаются разных взглядов. И снова Caffe не утруждает себя любезностями и простыми кодами эффективного матричного умножения. Чтобы загрузить модели из ModelZoo в Keras и Theano, потребуется преобразование, поскольку они строго следуют определению свертки. Простое решение - перевернуть его самостоятельно, когда вы загружаете веса в свою модель. Для 2D-свертки это выглядит так:

weights = weights [:,:, :: - 1, :: - 1]

Здесь переменная «веса» будет вставлена ​​в параметры вашей модели. Вы можете установить веса путем индексации в модели. Например, скажем, я хочу установить вес 9-го слоя. Я бы напечатал:

model.layers [9] .set_weights (веса)

Между прочим, и это важно, при загрузке любой * .caffemodel в Python вам, возможно, придется транспонировать ее, чтобы использовать. Вы можете быстро узнать это, загрузив его, если получите сообщение об ошибке, но мы подумали, что это стоит отметить.

Материалы по программной инженерии

Хорошо, хорошо, мы знаем, для чего ты здесь на самом деле; просто получаю код и работаю с ним. Итак, у нас есть пример кода, который классифицирует с помощью Keras и сети VGG из Интернета в нашем Git (см. Ссылку ниже). Но давайте пройдемся через это немного. Вот пошаговое описание того, что вам нужно сделать, чтобы использовать модель кафе VGG.

  • Большинство людей используют 16-слойную сеть VGG, которая определена этим протоколом в ModelZoo. Актуальную модель можно скачать здесь.
  • Теперь, когда вы скачали его, загрузите эти suckas в Python с помощью следующего кода:

  • Вышеупомянутое просто принимает имя сети (то есть файл prototxt) и набор параметров (то есть файл * .caffemodel). Кстати, весь этот код связан на нашей странице Git. Результатом является упорядоченный словарь всех параметров в переменной «params». На самом деле, мы просто вызываем функцию загрузки caffe с помощью caffe.Net.
  • Далее делаем модель в Керасе:

  • На самом деле, все, что я сделал, это просмотрел файл prototxt и просто реализовал его в Keras. Кстати, это более старая версия Keras, поэтому определения немного нечеткие. Например, в Convolutions и Dense вам не нужно указывать размер ввода, если только вы не первый слой, который вам может понадобиться. В любом случае, вы поняли. (Мы собираемся исправить / обновить это, когда дойдем до него; проверьте нашу страницу Git.)
  • Затем загрузите все веса. Напомним, что двумерная свертка является обратной (из нашего раздела выше). Например, для сверточного слоя:

  • Здесь «params» - это параметры CNN, загруженные с помощью caffe.Net. Переменная «model1» - это сеть Keras. Вы действительно можете получить доступ к слоям внутри ваших моделей. Итак, это доступ к 0-му и 1-му слоям модели. Затем вы устанавливаете эти параметры. Сделайте это для всех слоев.
  • Везде, где у вас есть Dropout, вы должны убедиться, что вы не масштабируете, поскольку модель Caffe не масштабируется.
  • Вуаля, классифицируйте с помощью model.predict!

Это все, ребята!

И теперь у вас есть основы! Идите вперед и загляните на наш Github, чтобы найти некоторые вкусности. Дайте нам знать!

Первоначально опубликовано на www.lab41.org 13 декабря 2015 г.