Нейронные сети картинки – 16 навыков, которыми нейросети овладели в совершенстве (Это может сыграть на руку мошенникам)

alexxlab
alexxlab
10.03.2020

Содержание

Как нейронные сети рисуют картины / .io corporate blog / Habr

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

Недавно Google на своем блоге опубликовали интересный способ использования нейронных сетей, распознающих картинки. Далее свободный перевод публикации.


Каждая нейронная сеть обучается с помощью миллионов тренировочных картинок. Сеть имеет от 10 до 30 вложенных слоев с различными уровнями абстракции. Вначале картинка поступает на входной слой, который делает свою работу и передает информацию в следующий слой, пока на выходе не получится ожидаемый результат.

Важно понять, что именно происходит на каждом уровне системы. Каждый последующий слой извлекает новые черты изображения. Допустим первый уровень определяет углы и ребра на картинке, второй — формы, и именно последние несколько слоев принимают решение о том, что изображено на картинке.

Распознавание наоборот

Чтобы нейронная сеть начала рисовать картины на её вход подается изображение рандомного шума и ставится задача — найти в нем определенную форму и утрировать её. Например, нарисовать банан.

Это нужно для того, чтобы понять научилась ли нейронная сеть распознавать тот или иной образ. Например, её обучали узнавать вилку по определенным характеристикам: 2-4 зубца и ручка. При этом форма и цвет предмета не должны влиять на решение.

Хороший способ проверить, действительно ли сеть научилась распознавать образ — это попросить её нарисовать его.

В некоторых случаях можно выявить явную ошибку в обучении. Система не смогла нарисовать правильную гантель. Скорее всего, при обучении она видела гантели только в комплекте с рукой.

Нижние слои

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

Продвинутые слои

Если для интерпретации выбрать более продвинутый слой, то сеть постарается найти в картинке те образы, на которых тренировалась.

На вход нейронной сети, которая обучалась на фотках животных подали изображение облаков.

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

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

Например, линия горизонта замещается пагодами и башнями, очертания деревьев и скал — постройками, а листья превращаются в птиц и насекомых.

Техника обратного рисования дает разработчикам оценить качество распознавания того или иного слоя.

Сами разработчики называют эту технику «Inceptionism» (инцепционизм). Еще картины.

Итерации

На вход нейронной сеть можно подавать немного увеличенную картинку с выхода и получить невероятные цветовые пространства. Если начать с рандомного шума, то выходную картину можно считать исключительно творением нейронной сети.

Эта техника помогает понять и визуализировать как именно нейронная сеть выполняет задачи классификации, как улучшить архитектуру и проверить чему она научилась.

Конспект

  1. Нейронная сеть имеет от 10 до 30 вложенных слоев с разным уровнем абстракции.
  2. Чтобы нейронная сеть начала рисовать картины на её вход подается картинка и ставится задача — найти в нем определенную форму и утрировать её.
  3. Техника «инцепционизм» помогает понять и визуализировать как нейронная сеть выполняет задачи классификации.

habr.com

Применение нейросетей в распознавании изображений / Habr

Про нейронные сети, как один из инструментов решения трудноформализуемых задач уже было сказано достаточно много. И здесь, на хабре, было показано, как эти сети применять для распознавания изображений, применительно к задаче взлома капчи. Однако, типов нейросетей существует довольно много. И так ли хороша классическая полносвязная нейронная сеть (ПНС) для задачи распознавания (классификации) изображений?
1. Задача

Итак, мы собрались решать задачу распознавания изображений. Это может быть распознавание лиц, объектов, символов и т.д. Я предлагаю для начала рассмотреть задачу распознавания рукописных цифр. Задача эта хороша по ряду причин:
  • Для распознавания рукописного символа довольно трудно составить формализованный (не интеллектуальный) алгоритм и это становится понятно, стоит только взглянуть на одну и туже цифру написанную разными людьми
  • Задача довольно актуальна и имеет отношение к OCR (optical character recognition)
  • Существует свободно распространяемая база рукописных символов, доступная для скачивания и экспериментов
  • Существует довольно много статей на эту тему и можно очень легко и удобно сравнить различные подходы

В качестве входных данных предлагается использовать базу данных MNIST. Эта база содержит 60 000 обучающих пар (изображение — метка) и 10 000 тестовых (изображения без меток). Изображения нормализованы по размеру и отцентрованы. Размер каждой цифры не более 20х20, но вписаны они в квадрат размером 28х28. Пример первых 12 цифр из обучающего набора базы MNIST приведен на рисунке:

Таким образом задача формулируется следующим образом: создать и обучить нейросеть распознаванию рукописных символов, принимая их изображения на входе и активируя один из 10 выходов
. Под активацией будем понимать значение 1 на выходе. Значения остальных выходов при этом должны (в идеале) быть равны -1. Почему при этом не используется шкала [0,1] я объясню позже.
2. «Обычные» нейросети.

Большинство людей под «обычными» или «классическими» нейросетями понимает полносвязные нейронные сети прямого распространения с обратным распространением ошибки:

Как следует из названия в такой сети каждый нейрон связан с каждым, сигнал идет только в направлении от входного слоя к выходному, нет никаких рекурсий. Будем называть такую сеть сокращенно ПНС.
Сперва необходимо решить как подавать данные на вход. Самое простое и почти безальтернативное решение для ПНС — это выразить двумерную матрицу изображения в виде одномерного вектора. Т.е. для изображения рукописной цифры размером 28х28 у нас будет 784 входа, что уже не мало. Дальше происходит то, за что нейросетевиков и их методы многие консервативные ученые не любят — выбор архитектуры. А не любят, поскольку выбор архитектуры это чистое шаманство. До сих пор не существует методов, позволяющих однозначно определить структуру и состав нейросети исходя из описания задачи. В защиту скажу, что для трудноформализуемых задач вряд ли когда-либо такой метод будет создан. Кроме того существует множество различных методик редукции сети (например OBD [1]), а также разные эвристики и эмпирические правила. Одно из таких правил гласит, что количество нейронов в скрытом слое должно быть хотя бы на порядок больше количества входов. Если принять во внимание что само по себе преобразование из изображения в индикатор класса довольно сложное и существенно нелинейное, одним слоем тут не обойтись. Исходя из всего вышесказанного грубо прикидываем, что количество нейронов в скрытых слоях у нас будет порядка
15000
(10 000 во 2-м слое и 5000 в третьем). При этом для конфигурации с двумя скрытыми слоями количество настраиваемых и обучаемых связей будет 10 млн. между входами и первым скрытым слоем + 50 млн. между первым и вторым + 50 тыс. между вторым и выходным, если считать что у нас 10 выходов, каждый из которых обозначает цифру от 0 до 9. Итого грубо 60 000 000 связей. Я не зря упомянул, что они настраиваемые — это значит, что при обучении для каждой из них нужно будет вычислять градиент ошибки.
Ну это ладно, что уж тут поделаешь, красота искусственный интеллект требует жертв. Но вот если задуматься, на ум приходит, что когда мы преобразуем изображение в линейную цепочку байт, мы что-то безвозвратно теряем. Причем с каждым слоем эта потеря только усугубляется. Так и есть — мы теряем топологию изображения, т.е. взаимосвязь между отдельными его частями. Кроме того задача распозравания подразумевает умение нейросети быть устойчивой к небольшим сдвигам, поворотам и изменению масштаба изображения, т.е. она должна извлекать из данных некие инварианты, не зависящие от почерка того или иного человека. Так какой же должна быть нейросеть, чтобы быть не очень вычислительно сложной и, в тоже время, более инвариантной к различным искажениям изображений?
3. Сверточные нейронные сети

Решение этой проблемы было найдено американским ученым французского происхождения Яном ЛеКуном, вдохновленным работами нобелевских лауреатов в области медицины Torsten Nils Wiesel и David H. Hubel. Эти ученые исследовали зрительную кору головного мозга кошки и обнаружили, что существуют так называемые простые клетки, которые особо сильно реагируют на прямые линии под разными углами и сложные клетки, которые реагирую на движение линий в одном направлении. Ян ЛеКун предложил использовать так называемые сверточные нейронные сети [2].
Идея сверточных нейронных сетей заключается в чередовании сверточных слоев (C-layers), субдискретизирующих слоев (S-layers) и наличии полносвязных (F-layers) слоев на выходе.

Такая архитектура заключает в себе 3 основных парадигмы:
  1. Локальное восприятие.
  2. Разделяемые веса.
  3. Субдискретизация.

Локальное восприятие подразумевает, что на вход одного нейрона подается не все изображение (или выходы предыдущего слоя), а лишь некоторая его область. Такой подход позволил сохранять топологию изображения от слоя к слою.
Концепция разделяемых весов предполагает, что для большого количества связей используется очень небольшой набор весов. Т.е. если у нас имеется на входе изображение размерами 32х32 пикселя, то каждый из нейронов следующего слоя примет на вход только небольшой участок этого изображения размером, к примеру, 5х5, причем каждый из фрагментов будет обработан одним и тем же набором. Важно понимать, что самих наборов весов может быть много, но каждый из них будет применен ко
всему
изображению. Такие наборы часто называют ядрами (kernels). Нетрудно посчитать, что даже для 10 ядер размером 5х5 для входного изображения размерами 32х32 количество связей окажется равным примерно 256000 (сравниваем с 10 млн.), а количество настраиваемых параметров всего 250!
А как же, спросите вы, это скажется на качестве распознавания? Как ни странно, в лучшую сторону. Дело в том, что такое искусственно введенное ограничение на веса улучшает обобщающие свойства сети (generalization), что в итоге позитивно сказывается на способности сети находить инварианты в изображении и реагировать главным образом на них, не обращая внимания на прочий шум. Можно посмотреть на этот подход немного с другой стороны. Те, кто занимался классикой распознавания изображений и знает как это работает на практике (например в военной технике) знают, что большинство таких систем строятся на основе двумерных фильтров. Фильтр представляет собой матрицу коэффициентов, обычно заданную вручную. Эта матрица применяется к изображению с помощью математической операции, называемой
сверткой
. Суть этой операции в том, что каждый фрагмент изображения умножается на матрицу (ядро) свертки поэлементно и результат суммируется и записывается в аналогичную позицию выходного изображения. Основное свойство таких фильтров заключается в том, что значение их выхода тем больше чем больше фрагмент изображения похож на сам фильтр. Таким образом изображение свернутое с неким ядром даст нам другое изображение, каждый пиксел которого будет означать степень похожести фрагмента изображения на фильтр. Иными словами это будет карта признаков.
Процесс распространения сигнала в C-слое я попытался изобразить на рисунке:

Каждый фрагмент изображения поэлементно умножается на небольшую матрицу весов (ядро), результат суммируется. Эта сумма является пикселом выходного изображения, которое называется картой признаков. Здесь я опустил тот факт, что взвешенная сумма входов еще пропускается через функцию активации (как в любой другой нейросети). На самом деле это может происходить и в S-слое, принципиальной разницы нет. Следует сказать, что в идеале не разные фрагменты проходят последовательно через ядро, а параллельно все изображение проходит через идентичные ядра. Кроме того, количество ядер (наборов весов) определяется разработчиком и зависит от того какое количество признаков необходимо выделить. Еще одна особенность сверточного слоя в том, что он немного уменьшает изображение за счет краевых эффектов.
Суть субдискретизации и S-слоев заключается в уменьшении пространственной размерности изображения. Т.е. входное изображение грубо (усреднением) уменьшается в заданное количество раз. Чаще всего в 2 раза, хотя может быть и не равномерное изменение, например, 2 по вертикали и 3 по горизонтали. Субдискретизация нужна для обеспечения инвариантности к масштабу.
Чередование слоев позволяет составлять карты признаков из карт признаков, что на практике означает способность распознавания сложных иерархий признаков.
Обычно после прохождения нескольких слоев карта признаков вырождается в вектор или даже скаляр, но таких карт признаков становится сотни. В таком виде они подаются на один-два слоя полносвязной сети. Выходной слой такой сети может иметь различные функции активации. В простейшем случае это может быть тангенциальная функция, также успешно используются радиальные базисные функции.
4. Обучение

Для того чтобы можно было начать обучение нашей сети нужно определиться с тем, как измерять качество распознавания. В нашем случае для этого будем использовать самую распространенную в теории нейронных сетей функцию среднеквадратической ошибки (СКО, MSE) [3]:

В этой формуле Ep — это ошибка распознавания для p-ой обучающей пары, Dp — желаемый выход сети, O(Ip,W) — выход сети, зависящий от p-го входа и весовых коэффициентов W, куда входят ядра свертки, смещения, весовые коэффициенты S- и F- слоев. Задача обучения так настроить веса W, чтобы они для любой обучающей пары (Ip,Dp) давали минимальную ошибку Ep. Чтобы посчитать ошибку для всей обучающей выборки просто берется среднее арифметическое по ошибкам для всех обучающих пар. Такую усредненную ошибку обозначим как E.
Для минимизации функции ошибки Ep самыми эффективными являются градиентные методы. Рассмотрим суть градиентных методов на примере простейшего одномерного случая (т.е. когда у нас всего один вес). Если мы разложим в ряд Тейлора функцию ошибки Ep, то получим следующее выражение:

Здесь E — все та же функция ошибки, Wc — некоторое начальное значение веса. Из школьной математики мы помним, что для нахождения экстремума функции необходимо взять ее производную и приравнять нулю. Так и поступим, возьмем производную функции ошибки по весам, отбросив члены выше 2го порядка:

из этого выражения следует, что вес, при котором значение функции ошибки будет минимальным можно вычислить из следующего выражения:

Т.е. оптимальный вес вычисляется как текущий минус производная функции ошибки по весу, деленная на вторую производную функции ошибки. Для многомерного случая (т.е. для матрицы весов) все точно также, только первая производная превращается в градиент (вектор частных производных), а вторая производная превращается в Гессиан (матрицу вторых частных производных). И здесь возможно два варианта. Если мы опустим вторую производную, то получим алгоритм наискорейшего градиентного спуска. Если все же захотим учитывать вторую производную, то обалдеем от того сколько вычислительных ресурсов нам потребуется, чтобы посчитать полный Гессиан, а потом еще и обратить его. Поэтому обычно Гессиан заменяют чем-то более простым. Например, один из самых известных и успешных методов — метод Левенберга-Марквардта (ЛМ) заменяет Гессиан, его аппроксимацией с помощью квадрадного Якобиана. Подробности здесь рассказывать не буду.
Но что нам важно знать об этих двух методах, так это то, что алгоритм ЛМ требует обработки всей обучающей выборки, тогда как алгоритм градиентного спуска может работать с каждой отдельно взятой обучающей выборкой. В последнем случае алгоритм называют стохастическим градиентом. Учитывая, что наша база содержит 60 000 обучающих образцов нам больше подходит стохастический градиент. Еще одним преимуществом стохастического градиента является его меньшая подверженность попаданию в локальный минимум по сравнению с ЛМ.
Существует также стохастическая модификация алгоритма ЛМ, о которой я, возможно, упомяну позже.
Представленные формулы позволяют легко вычислить производную ошибки по весам, находящимся в выходном слое. Вычислить ошибку в скрытых слоях позволяет широко известный в ИИ метод обратного распространения ошибки.
5. Реализация

Лично я использую для реализации различных алгоритмов, от которых не требуется функционирование в реальном времени Matlab. Это очень удобный пакет, M-язык которого позволяет сосредоточиться на самом алгоритме не заботясь о выделении памяти, операциях в/в и т.д. Кроме того, множество различных тулбоксов позволяет создавать поистине междисциплинарные приложения в кротчайшие сроки. Можно, например, с помощью Image Acquisition Toolbox подключить вебкамеру, с помощью Image Processing Toolbox обрабатывать изображение с нее, с помощью Neural Network Toolbox формировать траекторию движения робота, а с помощью Virtual Reality Toolbox и Control Systems Toolbox моделировать движение робота. Кстати о Neural Network Toolbox — это довольно гибкий набор инструментов, позволяющий создавать множество нейронных сетей различных типов и архитектур, но, к сожалению, не сверточные НС. Все дело в разделяемых весах. В NN toolbox возможность задавать разделяемые веса отсутствует.
Чтобы устранить этот недостаток мною был написан класс, позволяющий реализовать СНС произвольной архитектуры и применять их к различным задачам. Скачать класс можно здесь. Сам класс был написан так, чтобы тому, кто им пользуется была максимальная видна структура сети. Все очень обильно прокомментировано, на названии переменных не экономил. Скорость симуляции сети неплоха и составляет доли секунды. Скорость обучения пока не велика (>10 ч), но следите за обновлениями, в ближайшее время планируется ускорение на порядки.
Кого интересует реализация СНС на С++, могут найти ее здесь и здесь.
6. Результаты

В программе на matlabcentral прилагается файл уже натренированной нейросети, а также GUI для демонстрации результатов работы. Ниже приведены примеры распознавания:


По ссылке имеется таблица сравнения методов распознавания на базе MNIST. Первое место за сверточными нейросетями с результатом 0.39% ошибок распознавания [4]. Большинство из этих ошибочно распознанных изображений не каждый человек правильно распознает. Кроме того в работе [4] были использованы эластические искажения входных изображений, а также предварительное обучение без учителя. Но об этих методах как нибудь в другой статье.
Ссылки.

  1. Yann LeCun, J. S. Denker, S. Solla, R. E. Howard and L. D. Jackel: Optimal Brain Damage, in Touretzky, David (Eds), Advances in Neural Information Processing Systems 2 (NIPS*89), Morgan Kaufman, Denver, CO, 1990
  2. Y. LeCun and Y. Bengio: Convolutional Networks for Images, Speech, and Time-Series, in Arbib, M. A. (Eds), The Handbook of Brain Theory and Neural Networks, MIT Press, 1995
  3. Y. LeCun, L. Bottou, G. Orr and K. Muller: Efficient BackProp, in Orr, G. and Muller K. (Eds), Neural Networks: Tricks of the trade, Springer, 1998
  4. Ranzato Marc’Aurelio, Christopher Poultney, Sumit Chopra and Yann LeCun: Efficient Learning of Sparse Representations with an Energy-Based Model, in J. Platt et al. (Eds), Advances in Neural Information Processing Systems (NIPS 2006), MIT Press, 2006

P.S. Всем спасибо за комментарии и за отзывы. Это моя первая статья на хабре, так что буду рад видеть предложения, замечания, дополнения.

habr.com

Синтез изображений с помощью глубоких нейросетей. Лекция в Яндексе

Пусть в блоге Яндекса на Хабрахабре эта неделя пройдет под знаком нейронных сетей. Как мы видим, нейросети сейчас начинают использоваться в очень многих областях, включая поиск. Кажется, что «модно» искать для них новые сферы применения, а в тех сферах, где они работают уже какое-то время, процессы не такие интересные.

Однако события в мире синтеза визуальных образов доказывают обратное. Да, компании еще несколько лет назад начали использовать нейросети для операций с изображениями — но это был не конец пути, а его начало. Недавно руководитель группы компьютерного зрения «Сколтеха» и большой друг Яндекса и ШАДа Виктор Лемпицкий рассказал о нескольких новых способах применения сетей к изображениям. Поскольку сегодняшняя лекция — про картинки, то она очень наглядная.


Под катом — расшифровка и большинство слайдов.

Добрый вечер. Я сегодня буду говорить про сверточные нейросети и буду предполагать, что большинство из вас провели последние четыре года не на необитаемом острове, поэтому что-то про сверточные глубокие нейросети слышали, и знаете примерно, как именно они обрабатывают данные.

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

Дальше она преобразует подобный набор из трех изображений в набор из ста изображений, где каждый прямоугольничек представляет себе действительно значимое изображение, заданное в MATLAB-формате.

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

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

Но говорить я сегодня буду главным образом не про них, а про новый популярный класс моделей, который я буду называть перевернутыми или развернутыми нейросетями.

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

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

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

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

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

Нейросеть Досовицкого всё делает наоборот — генерирует изображение стула на выходе. Надеюсь, разница понятна.

Интересно, что компоненты перевернутой нейросети почти в точности повторяют компоненты обычной нейросети. Единственная новизна и новый модуль, который возникает, — модуль обратного пулинга, анпулинга. Эта операция берет картинки меньшего размера и преобразует их в картинки большего размера. Такое можно делать многими способами, которые работают примерно одинаково. Например, в их статье они брали карты маленького размера, просто вставляли между ними нули, дальше обрабатывали подобные изображения.

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

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

Если задать себе вопрос, почему это так хорошо работает, то есть несколько ответов. Меня больше всего убеждают два. Первый: почему должно работать плохо, если хорошо работают прямые нейросети? И прямые, и развернутые сети используют одно и то же свойство натуральных изображений о том, что их статистика локальная и внешний вид кусочков изображений не зависит от того, на какую часть глобального изображения мы смотрим. Такое свойство позволяет нам разделять, переиспользовать параметры внутри сверточных слоев обычных сверточных нейросетей, и это же свойство используют развернутые сети, используют успешно — оно дает им возможность относительно небольшим количеством параметров обрабатывать и заучивать большие объемы данных.

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

Сегодня я хотел бы рассказать про три текущих проекта, связанных с развернутыми нейросетями или, по крайней мере, нейросетями, выдающими на выходе изображение. Я вряд ли смогу углубиться в подробности — они доступны по ссылкам и в статьях нашей группы — но надеюсь, такой пробег по верхам продемонстрирует вам гибкость и интересность данного класса задач. Может быть, он приведет к каким-то идеям о том, как еще можно использовать нейросети для синтеза изображений.

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

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

Задача синтеза текстур во многом упирается в задачу сравнения текстур. Как понять, что эти два изображения соответствуют похожим текстурам, а эти два — непохожим? Достаточно очевидно, что какие-то простые подходы — например, сравнить три изображения попиксельно попарно или посмотреть на гистограммы — не приведут нас к успеху, потому что схожесть у этой пары окажется такой же, как и у этой. Многие исследователи ломали голову над тем, как определить меры схожести текстур, как определить некий текстурный дескриптор, чтобы какая-то простая мера в таких продвинутых дескрипторах хорошо бы говорила, являются текстуры похожими или нет.

Полтора года назад группой в Тюбингене был достигнут некоторый прорыв. На самом деле, они обобщили более ранний метод на основе статистики вейвлетов, которую они заменили на статистику активаций. Она создает изображения и вызывает в некоторой глубокой предобычной сети.

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

Так или иначе, статистика определяется так. Возьмем изображение, пропустим его через первые несколько сверточных слоев нейросети. На этом слое получим набор карт, изображений Fl(t). t — образец текстуры. Его набор карт изображений — на l-слое.

Дальше мы считаем статистику текстур — она должна как-то исключать из себя параметры, связанные с пространственным расположением того или иного элемента. Естественный подход — взять все пары карт в данном представлении. Мы берем все пары карт, считаем все попарные скалярные произведения между этими парами, берем i-тую карту и j-тую карту, дальше k-тый индекс пробегает все возможные пространственные положения, мы считаем подобное скалярное произведение и получаем i, j коэффициент, член матрицы Грама. l-матрица Грама, посчитанная таким образом, описывает нашу текстуру.

Дальше, когда надо сравнить, похожи ли два изображения как текстуры, мы просто берем некоторый набор слоев: это может быть один слой — тогда данная сумма включает в себя один член. Или можем взять несколько сверточных слоев. Сравниваем матрицы Грама, посчитанные таким образом для этих двух изображений. Сравнивать их мы можем просто поэлементно.

Оказывается, такая статистика очень хорошо говорит о том, похожи две текстуры или нет, — лучше, чем всё, что было предложено до работы на слайде.

Теперь, когда у нас есть очень хорошая мера, позволяющая сравнивать текстуры, мы можем взять некоторое случайное приближение, случайный шум. Пусть текущее изображение обозначается как х и есть некий образец t. мы будем пропускать наше текущее состояние через нейросеть, смотреть на его текущую матрицу Грама. Дальше с помощью алгоритма обратного распространения — понимать, как надо изменить текущее распространение, чтобы его матрицы Грама внутри нейросети стали чуть более похожи на матрицы Грама образца, который мы хотим синтезировть. Постепенно наше шумное изображение превратится в набор камней.

Работает это очень хорошо. Вот пример из их статьи. Справа пример, который мы хотим повторить, а слева синтезированная текстура. Главная проблема — время работы. Для небольших изображений оно составляет много секунд.

Идея данного подхода — радикально ускорить процесс генерации текстур через использование перевернутой нейросети.

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

Таким образом х — который в предыдущем подходе был некоторой независимой переменной и мы ей манипулировали, пытаясь создать текстуры, — теперь становится зависимой переменной, выходом новой нейросети. У нее свои параметры θ. Идея в том, чтобы перенести обучение в отдельную стадию. Теперь мы берем и учим нейросеть, настраивая ее параметры так, чтобы для произвольных векторов шума получающиеся изображения имели матрицы Грама, соответствующие нашему образцу.

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

Оптимизация нейросети тоже производится методом стохастического градиентного спуска, а наше обучение происходит так: мы синтезируем вектор шума, пропускаем его через нейросеть, считаем матрицы Грама, смотрим расхождения и обратным распространением через весь этот путь понимаем, как именно надо поменять параметры нейросети.

Здесь некоторые детали архитектуры, я их пропущу. Архитектура полностью сверточная, в ней нет полносвязных слоев, и количество параметров невелико. Такая схема, в частности, не позволяет сети просто заучить предоставленный ей пример текстуры так, чтобы выдавать его снова и снова.

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

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

Посередине приведен образец текстуры, полученной с помощью метода Готисса (неразборчиво — прим. ред.), оптимизации, а справа примеры текстур, выдаваемых нейросетью просто путем преобразования вектора шума.

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

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

Единственное изменение: наша нейросеть будет принимать на вход не только вектор шума, но и изображение, которое нужно стилизовать. Она обучается для произвольного примера стиля.

В исходной статье не получилось построить архитектуру, которая давала бы результаты, сравнимые по качеству с оптимизационным подходом. Позже Дмитрий Ульянов, первый автор статьи, нашел архитектуру, позволившую радикально улучшить качество и добиться качества стилизации, сравнимого с оптимизационным подходом.

Здесь сверху — фотография и пример визуального стиля, а внизу результат стилизации такой нейросети, требующий нескольких десятков миллисекунд, и результат оптимизационного метода — который, в свою очередь, требует многосекундной оптимизации.

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

Здесь, наверное, скорее правый.

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

К стилизации еще вернемся. Второй проект связан с нейросетью, которая решает следующую задачу. Нам хотелось построить сеть, способную взять фотографию лица человека и перенаправить его взгляд на этой фотографии.

Зачем нам понадобилось решать такую экзотическую задачу? Оказывается, есть по крайней мере два приложения, где она актуальна. Главное для нас — задача улучшения зрительного контакта при видеоконференциях. Наверное, многие замечали, что когда вы разговариваете по Skype или другому видеоконференционному сервису, то не можете смотреть с собеседником друг другу в глаза, потому что камера и лицо собеседника разнесены по местоположению.

Еще одно применение — постобработка кинофильмов. У вас есть какая-то суперзвезда, у которой минута съемки стоит миллион долларов. Вы отсняли дубль, а эта суперзвезда посмотрела не туда. И теперь надо или переснять дубль, или — подредактировать направление взгляда.

Чтобы решить такую задачу, мы собрали большое количество последовательностей. В рамках них мы фиксировали положение головы, освещение — всё, кроме направления взгляда. Протокол был такой, что мы могли отслеживать, куда человек смотрит. Каждый кадр анонсирован соответствующим направлением взгляда.

Это позволило нам извлекать из подобного набора данных пары примеров, для которых мы знаем: единственное отличие между изображениями слева и справа — направление взгляда. Например, здесь в каждом случае отличие составляет 15 градусов в вертикальном направлении.

Мы практически перешли от такой сложной задачи к классической задаче обучения с учителем. У нас есть пример слева, и нам нужно сгенерировать пример справа. К сожалению, просто решать эту задачу с помощью черного ящика, как говорил Сергей, не получается. Мы много раз пробовали черный ящик, даже темно-серый ящик. Поскольку у нас вход и выход имеют довольно сложную структуру, а обучающих данных довольно много, мы долго мучили людей. Решение с помощью черного ящика не работает. Нужно использовать некую специфику задачи, а именно — то, что правое изображение может быть достаточно неплохо приближено левым изображением после некоторой нежесткой деформации.

Была построена нейросеть, которая принимает на вход изображение слева, а также берет положение особых точек глаза на данном изображении. При этом изображение кодируется тремя картамиЕ красной, зеленой и синей. Каждая особая точка тоже кодируется картой. Дальше она принимает на вход угол, на который мы хотим перенаправить взгляд на картинке, и строит поле искажения, деформации. Потом такое поле применяется к входному изображению дифференцируемым образом с помощью spatial transformer layer. Он сейчас есть, например, в torch и многих других библиотеках.

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

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

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

Вот еще статические примеры. Такая нейросеть прибавляет плюс-минус 15 градусов в вертикальном направлении. Ни один из этих людей не представлен в тренировочном множестве.

Пример для горизонтального перенаправления.

Еще набор примеров. Мы рады сказать, что готовится к выпуску веб-демо, куда каждый сможет подгрузить картинку и посмотреть на результаты.

Наконец, третья система. Это совсем свежая статья, первый раз про нее рассказываю. Она посвящена нейросетям, которые учат визуальные маркеры.

Визуальные маркеры нас окружают и становятся всё более заметными. Речь идёт об изображениях, в которых компьютером — и для компьютера же — зашита некая информация. Такие изображения возникают в реальном человеческом мире и обладают некоторыми нежелательными свойствами. Они, например, эстетически неидеальны. Я говорю о таких примерах, как QR-коды, бар-коды.

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

Наша идея — объединить процесс создания маркера и процесс создания распознавателя маркера в единый оптимизационный процесс и параллельно добиться некоторых эстетических свойств получаемых маркеров.

Мы строим некоторую цепочку нейросетей. Первая нейросеть называется синтезатором. Синтезатор берет на вход последовательность бит, которую мы хотим закодировать, и, являясь обычной перевернутой развернутой нейросетью, превращает ее в картинку. Это точно такая же нейросеть, как та, о которой я говорил в начале доклада.

Затем вторая нейросеть берет полученный маркер и симулирует процесс его распечатывания, вешания на стену и фотографирования. Иными словами, она превращает такой маркер как компьютерный файл в маркер-фотографию на стене. Это моделируется путем нескольких преобразований — таких как наложение на фон, фильтрация, блюр и т. д.

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

Последняя нейросеть — стандартная и прямая. Она принимает на вход картинку и пытается установить закодированное изображение. Мы можем обучать всю цепочку, параметры синтезатора и параметры распознавателя вместе, путем минимизации разницы между входной и выходной строчками.

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

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

В целом, они имеют интересную регулярную структуру — какую-то гармоническую, синусоидальную.

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

Затем мы можем распечатать полученные маркеры, сфотографировать их и убедиться, что наша нейросеть достаточно хорошо распознает закодированные в них биты.

Что самое интересное, дальше мы можем в наше обучение добавить новый модуль, который будет смотреть на получающиеся маркеры и делать их похожими на примеры некоторых текстур — в точности как я рассказывал во второй части доклада.

Все это происходит в рамках единого оптимизационного процесса и позволяет нам синтезировать маркеры, подобные тем, что на слайде. Слева задан образец текстуры, справа — образцы маркеров для случайных последовательностей. Интересный факт: глядя на эти маркеры, можно увидеть, что некоторые камушки не меняются от маркера к маркеру, а некоторые части маркера меняются в зависимости от бита. Такая ситуация в точности соответствует тому, что происходит в QR-коде, где у вас есть по углам четыре якоря, которые не меняются и используются для локализации, и есть переменная часть кода. Эта нейросеть выучила такой эффект — он не зашит в ее архитектуру.

Еще два примера. Нейросеть учится письменности.

Нейросеть учится на фотографии храма Василия Блаженного. Нам показалось, что было бы здорово, если бы огромные QR-коды, налепленные на стенах в Москве, заменились бы чем-то более интересным.

Я представил три статьи. Хотел бы поблагодарить своих соавторов. Это их результаты, и в данной области есть много чего нерешенного. Главная нерешенная задача, на мой взгляд, — построение нейросетей, способных синтезировать большие новые изображения. Сейчас многие умеют синтезировать по фотографии версию Ван Гога, но я не знаю нейросетей, которые могут по изображению Ван Гога синтезировать исходную фотографию. Это интересная нерешенная задача. Спасибо.

habr.com

Эта нейросеть превращает ваши фотографии в старинные картины одним нажатием кнопки

Когда-то самые богатые деятели общества сидели и часами ждали, чтобы их портрет нарисовали. Сегодня все, что нужно для портрета, – сделать селфи.

Инструмент AI Portraits делает еще лучше: он может взять любой портрет и «нарисовать» его в реальном времени. Полученные пародии на Рембрандта или Караваджо выходит в разрешении 4k.

Этот инструмент создали Мауро Мартино, Эмануэле дель Соццо и Оуэн Корнеком MIT-IBM Watson AI Lab, а также Люка Сторнауоло из Политехнического университета Милана и Лиза Газеева. Нейросети «скормили» более 45 тысяч картин из Европы XV века. Почему именно XV век? Именно тогда в высших слоях общества обрели популярность реалистичные портреты.

В отличие от обычных приложений, которые применяют хитрые фильтры к вашим селфи, чтобы создавать «картины», AI Portraits обучен решать, какой стиль лучше всего подойдет для вашей фотографии. «Детали лица и фона способствуют выбора стиля», – объясняет команда. Приложения обычно резко меняют цвета существующих изображений, но редко меняют их стили.

Такой подход обеспечивает более реалистичные «картины», сродни тем, что были в прошлом. Но это также означает, что блестящие улыбки во весь рот заменяются более мрачными ухмыками. В интервью Boing Boing команда объяснила, что художники той эпохи редко изображали улыбки. Их оставляли для «более комичного жанра живописи».

«Эта неспособность искусственного интеллекта воспроизводить наши улыбки рассказывает нас кое-что об истории искусства», – добавляют они.

Создатели подчеркивают, что все фотографии, представленные на серверах программы, не будут использоваться «для каких-либо других целей, и будут немедленно удалены». Попробовать самому можно на сайте AI Portraits.

Читайте также:

Робот-художница открыла свою первую выставку живописи

Скоро художники аниме останутся без работы

В Сингапуре вышел первый журнал, написанный искусственным интеллектом

say-hi.me

Нейронная сеть с использованием TensorFlow: классификация изображений / Habr

Привет, Хабр! Представляю вашему вниманию перевод статьи «Train your first neural network: basic classification».


Это руководство по обучению модели нейронной сети для классификации изображений одежды, таких как кроссовки и рубашки. Для создания нейронной сети используем python и библиотеку TensorFlow.


Установка TensorFlow

Для работы нам понадобятся следующие библиотеки:


  1. numpy (в командной строке пишем: pip install numpy)
  2. matplotlib (в командной строке пишем: pip install matplotlib)
  3. keras (в командной строке пишем: pip install keras)
  4. jupyter (в командной строке пишем: pip install jupyter)

С помощью pip: в командной строке пишем pip install tensorflow
Если у вас возникает ошибка, то можно скачать .whl файл и установить с помощью pip: pip install путь_к_файлу\название_файла.whl

Официальное руководство по установке TensorFlow (на англ.)
Запускаем Jupyter. Для запуска в командной строке пишем jupyter notebook.


Начало работы

#Подключаем библиотеки
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

В этом руководстве используется набор данных Fashion MNIST, который содержит 70 000 изображений в оттенках серого в 10 категориях. На изображениях показаны отдельные предметы одежды с низким разрешением (28 на 28 пикселей):


Мы будем использовать 60 000 изображений для обучения сети и 10 000 изображений, чтобы оценить, насколько точно сеть научилась классифицировать изображения. Вы можете получить доступ к Fashion MNIST непосредственно из TensorFlow, просто импортировав и загрузив данные:

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

Загрузка набора данных возвращает четыре массива NumPy:


  1. Массивы train_images и train_labels — это данные, которые использует модель для обучения
  2. Массивы test_images и test_labels используются для тестирования модели

Изображения представляют собой NumPy массивы 28×28, значения пикселей которых находятся в диапазоне от 0 до 255. Метки (labels) представляют собой массив целых чисел от 0 до 9. Они соответствуют классу одежды:


Метка Класс
0 T-shirt (Футболка)
1 Trouser (Брюки)
2 Pullover (Свитер)
3 Dress (Платье)
4 Coat (Пальто)
5 Sandal (Сандали)
6  Shirt (Рубашка)
7 Sneaker (Кроссовки)
8 Bag (Сумка)
9 Ankle boot (Ботильоны)

Имена классов не включены в набор данных, поэтому прописываем сами:

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

Исследование данных

Рассмотрим формат набора данных перед обучением модели.

train_images.shape #В обучающем наборе имеется 60 000 изображений, каждое изображение представлено как 28 x 28 пикселей

test_images.shape #В тестовом наборе имеется 10 000 изображений, каждое изображение представлено как 28 x 28 пикселей

len(train_labels) #В учебном наборе 60 000 меток

len(test_labels) #В тестовом наборе 10 000 меток

train_labels #Каждая метка представляет собой целое число от 0 до 9 (Показывается первые 3 метки и последние 3 метки)

Предварительная обработка данных

Перед подготовкой модели данные должны быть предварительно обработаны. Если вы проверите первое изображение в тренировочном наборе, вы увидите, что значения пикселей находятся в диапазоне от 0 до 255:

plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)

Мы масштабируем эти значения до диапазона от 0 до 1:

train_images = train_images / 255.0
test_images = test_images / 255.0

Отобразим первые 25 изображений из тренировочного набора и покажем имя класса под каждым изображением. Убедимся, что данные находятся в правильном формате.

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])


Построение модели

Построение нейронной сети требует настройки слоев модели.

Основным строительным блоком нейронной сети является слой. Большая часть глубокого обучения состоит в объединении простых слоев. Большинство слоев, таких как tf.keras.layers.Dense, имеют параметры, которые изучаются во время обучения.

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

Первый слой в сети tf.keras.layers.Flatten преобразует формат изображений из 2d-массива (28 на 28 пикселей) в 1d-массив из 28 * 28 = 784 пикселей. У этого слоя нет параметров для изучения, он только переформатирует данные.

Следующие два слоя это tf.keras.layers.Dense. Это плотно связанные или полностью связанные нейронные слои. Первый слой Dense содержит 128 узлов (или нейронов). Второй (и последний) уровень — это слой с 10 узлами tf.nn.softmax, который возвращает массив из десяти вероятностных оценок, сумма которых равна 1. Каждый узел содержит оценку, которая указывает вероятность того, что текущее изображение принадлежит одному из 10 классов.


Скомпилирование модели

Прежде чем модель будет готова к обучению, ей потребуется еще несколько настроек. Они добавляются во время этапа компиляции модели:


  • Loss function (функция потери) — измеряет насколько точная модель во время обучения
  • Optimizer (оптимизатор) — это то, как модель обновляется на основе данных, которые она видит, и функции потери
  • Metrics (метрики) — используется для контроля за этапами обучения и тестирования
model.compile(optimizer=tf.train.AdamOptimizer(), 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

Обучение модели

Обучение модели нейронной сети требует следующих шагов:


  1. Подача данных обучения модели (в этом примере — массивы train_images и train_labels)
  2. Модель учится ассоциировать изображения и метки
  3. Мы просим модель сделать прогнозы о тестовом наборе (в этом примере — массив test_images). Мы проверяем соответствие прогнозов меток из массива меток (в этом примере — массив test_labels)

Чтобы начать обучение, вызовите метод model.fit:

model.fit(train_images, train_labels, epochs=5)

При моделировании модели отображаются показатели потерь (loss) и точности (acc). Эта модель достигает точности около 0,88 (или 88%) по данным обучения.


Оценка точности

Сравним, как модель работает в тестовом наборе данных:

test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)

Оказывается, точность в тестовом наборе данных немного меньше точности в тренировочном наборе. Этот разрыв между точностью обучения и точностью тестирования является примером переобучения. Переобучение — это когда модель машинного обучения хуже работает с новыми данными, чем с данными обучения.


Прогнозирование

Используем модель для прогнозирования некоторых изображений.

predictions = model.predict(test_images)

Здесь модель предсказала метку для каждого изображения в тестовом наборе. Давайте посмотрим на первое предсказание:

predictions[0]

Предсказание представляет собой массив из 10 чисел. Они описывают «уверенность» модели в том, что изображение соответствует каждому из 10 разных предметов одежды. Мы можем видеть, какая метка имеет наибольшее доверительное значение:

np.argmax(predictions[0]) #9

Таким образом, модель наиболее уверенна в том, что это изображение — Ankle boot (Ботильоны), или class_names [9]. И мы можем проверить тестовую метку, чтобы убедиться, что это правильно:

test_labels[0]  #9

Напишем функции для визуализации этих предсказаний

def plot_image(i, predictions_array, true_label, img):
  predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])

  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'

  plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  predictions_array, true_label = predictions_array[i], true_label[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1]) 
  predicted_label = np.argmax(predictions_array)

  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

Давайте посмотрим на 0-е изображение, предсказания и массив предсказаний.

i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions,  test_labels)

Построим несколько изображений с их прогнозами. Правильные метки прогноза — синие, а неправильные метки прогноза — красные. Обратите внимание, что это может быть неправильно, даже когда он очень уверен.

num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions, test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions, test_labels)

Наконец, используем обученную модель, чтобы сделать предсказание об одном изображении.

# Возьмём изображение из тестового набора данных
img = test_images[0]

Модели tf.keras оптимизированы для того, чтобы делать прогнозы на пакеты (batch) или коллекции (collection). Поэтому, хотя мы используем одно изображение, нам нужно добавить его в список:

#Добавим изображение в пакет, где он является единственным членом
img = (np.expand_dims (img, 0))

Прогноз для изображения:

predictions_single = model.predict(img)
print(predictions_single)

plot_value_array(0, predictions_single, test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)

np.argmax(predictions_single[0])

Как и прежде, модель предсказывает метку 9.

Если есть вопросы, пишите в комментариях или в личные сообщения.

habr.com

5 нейросетей, с которыми можно поиграть онлайн

Создать 3D-модель лица по фотографии, сгенерировать котика, человека или съемную квартиру: мы собрали пять популярных нейросетей, создатели которых выложили их в интернет для развлечения всех желающих.

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

Сайты, на которых можно развлечься с нейросетями, появляются и пропадают: как правило, создатели «игрушечных» нейросетей не рассчитывают долго поддерживать свои сайты (хотя бы потому, что это стоит денег). Так случилось, например, с сайтом сети Fotogenerator, рисовавшей страшноватые картинки по наброскам от руки. Если ссылка, приведенная в этой статье не работает, значит, создатели нейросети решили прекратить ее работу. Поэтому играйте, пока есть время!

1. Нейросеть генерирует 3D-изображение по фотографии

Когда вы смотрите на картинку на плоскости — например, вот эту фотографию нашего главного редактора Александра Грека, вы отлично представляете, как он выглядит с разных ракурсов, то есть представляете его как трехмерный объект.

Для нашего мозга это простая задача, а для компьютеров — сложная, генерировать 3D-изображения по двумерным картинкам они пока только учатся. Нейросеть, созданная специалистами из Ноттингемского университета, генерирует 3D-изображения человеческих лиц всего по одной фотографии, с переменным успехом обходя подводные камни — нюансы освещения и цвета кожи, сложные ракурсы и выразительную человеческую мимику.

Как обманывают в соцсетях: 5 простых способов украсть ваши деньги

Как обманывают в соцсетях: 5 простых способов украсть ваши деньги

Всю работу делает сверточная нейросеть (convolutional network) — самый популярный тип нейросети, использующийся для распознавания образов. ее архитектура списана с устройства зрительной коры головного мозга человека.

Онлайн-демо здесь: нужно загрузить картинку и поставить галочку, чтобы доказать, что вы не робот.

2. Нейросеть генерирует портреты несуществующих людей

Эти фотографии сделаны как будто на красной ковровой дорожке, и каждое лицо смутно кого-то напоминает, но не пытайтесь вспомнить, в каком фильме играл этот актер или актриса. Этих знаменитостей не существует, их портреты генерирует нейросеть CelebA-HQ, обученная на тысячах фотографий с премьер, вручений премий и гала-вечеров.

Всю работу делает генеративно-состязательная нейросеть (generative adversarial network, GAN). GAN-нейросети — это две нейросети в одной: одна генерирует изображение, а вторая оценивает его, отбраковывая плохие результаты и пропуская хорошие. После множества итераций нейросеть прекращает работу и выводит итоговое изображение.

3. Нейросеть генерирует лица людей

Нейросеть thispersondoesnotexist обучали на портретах обыкновенных людей — и она выдает пугающе естественные изображения людей, которые вполне могли бы встретиться вам в магазине или в налоговой. Вот только их не существует, это опять-таки работа генеративно-состязательной сети. Обновляйте страницу, чтобы получать новые сгенерированные изображения.

Как обманывают в соцсетях: 5 простых способов украсть ваши деньги

4. Нейросеть генерирует котиков

Нейросеть thispersondoesnotexist породила бум генеративно-состязательных нейросетей: умельцы начали обучать свои на других изображениях — вот эта сеть thiscatdoesnotexist, набравшая невероятную популярность, генерирует котиков. Обновляйте страницу, чтобы получать новые сгенерированные изображения.

Как обманывают в соцсетях: 5 простых способов украсть ваши деньги

5. Нейросеть генерирует съемные квартиры

Как обманывают в соцсетях: 5 простых способов украсть ваши деньги

Еще один виток моды на GAN, генерирующие несуществующие объекты — вот эта игрушечная нейросеть thisairbnbdoesnotexist. Обучали ее на страницах сайта airbnb.com, где можно снять или сдать квартиру, и выдает она объявления о сдаче жилья — фотографии спален, кухонь, коридоров и видов из окон, сложночитаемые тексты на английском про расположение в неведомых городах, портреты и имена арендодателей. Обновляйте страницу, чтобы получать новые сгенерированные изображения.

www.popmech.ru

16 навыков, которыми нейросети овладели в совершенстве (Это может сыграть на руку мошенникам)

Ребята, мы вкладываем душу в AdMe.ru. Cпасибо за то,
что открываете эту красоту. Спасибо за вдохновение и мурашки.
Присоединяйтесь к нам в Facebook и ВКонтакте

Кажется, бум на искусственный интеллект прошел и теперь уже никого не удивляет, что алгоритмы пишут книги, музыку и даже создают собственные фильмы. Одни видят в этом первые шаги к созданию «мозга высшего порядка», а другие считают нейросети просто забавами программистов.

AdMe.ru нашел несколько алгоритмов, которые могут удивить даже тех, чей интерес к теме слегка подостыл. Кроме того, почти каждый из них можно «пощупать» собственными руками. Итак, на что способны творения веб-мастеров?

1. Распознают пьяных

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

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

2. Колоризуют фотографии

Бесплатный онлайн-сервис умеет раскрашивать черно-белые снимки. Разумеется, система не лишена недостатков: цвета будут не такими яркими, как на современных фото. Однако для бабушек и дедушек, у которых не было возможности увидеть себя юными на цветных фотокарточках, даже это может стать приятным сюрпризом.

3. Делают фильтры для фотографий

Таких сервисов существует несколько. Без временных ограничений и бесплатно работает этот генератор.

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

4. Имитируют реальные голоса

16 навыков, которыми нейросети овладели в совершенстве (Это может сыграть на руку мошенникам)

На этом сервисе можно загрузить аудиозапись с любым голосом, и нейросеть его реалистично сымитирует. Длинная запись не нужна — хватит одной минуты.

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

Некоторые сообразительные пользователи интернета поделились простым секретом борьбы с такими звонками. Достаточно обзавестись кодовым словом, которое нужно будет сказать, если собеседнику покажется, что звонит мошенник.

www.adme.ru

Разное

Отправить ответ

avatar
  Подписаться  
Уведомление о