Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

C# и нейронные сети. С чего начать и в какую сторону смотреть?


Вопрос довольно общий, знаю.

Но я здесь немного уточню что бы было не так расплывчасто.


Интересует общая сжатая теория. С какой статьи лучше начать?
Интересуют актуальные библиотеки C#
Интересует приблизительная реализация уже созданной в нескольких вариациях идеи -
скармливаешь нейронке много изображений-пар: большое и маленькое. А нейронка учитс
делать из маленького большое и потом сравнивает сделанное большое и то большое которое ему скормили что бы понять что сделано не так. Какую нейронку лучше выбрать под даную задачу?
Не слишком ли сложная и на сколько вообще реальная задачка в 3, если учесть что я вообще ни бум-бум в нейронных сетях? 
Если задача непосильная для новичка в НС, то с каких задач-тренировок лучше начинать?

    


Ответы

Ответ 1



Одна из самых изысканных задач для НС приведена в этой статье, можно понять уровен проблематики и алгоритмов, которые задействуются для решений подобного класса задач и где действительно нужна НС. Примеры на OpenCV, что тоже замечательно. OpenCV - Библиотека с самой открытой лицензией и исходным кодом, написана на C++. Под C# есть wrapper'ы - EmguCV, OpenCV for Unity (можно и без Unity использовать). Есть адаптация для Visual Studio (C++), Objective C, Android Studio, Python. Даже для умеренно сложных задач НС обычно не нужна, и не очень даже применима - част приходится делать обработку видеопотока в реальном времени, а НС не самая быстрая штука далеко. По этой и еще ряду причин большинство разработчиков, уверенных поначалу что им нужна НС, от этой идеи впоследствии отказываются. Благо в OpenCV реализовано огромное количество алгоритмов на все случаи жизни - почти всё, что связано с обработкой видео и изображений там есть. После редактирования автором вопроса редактирую ответ :-) Большинство алгоритмов, реализованных в доступных пакетах, в основном предназначен для down-scaling, спрос на это очевиден - камера снимает в большом разрешении, а в Интернеты лучше постить, предварительно уменьшив фотку - этим пользуются все активные пользователи Интернетов и соцсетей. Up-scaling задача тоже достаточно хорошо проработана, просто спрос на нее несоизмерим меньше - тем не менее любой дизайнер отлично знает, что нужно делать, чтобы изображение можно было без проблем увеличивать - взять Corel Draw или другой пакет векторной графики, то есть сделать изображение векторным. Таким образом, если маленькое растровое изображение преобразовать в векторы, сделат up-scaling, мы скорее всего уже получим что-то интересное - обратите внимание на программ Potrace. В OpenCV готового для raster->vector ничего нет. Хотя из доступных инструментов и можно слепить что-то, врядли получится лучше чем у Potrace - всё-таки там люди занимались этой проблемой специально. Potrace идёт с исходниками и подробным описанием алгоритмов, так что простор для творчества полный :-) И самое интересное на десерт - пора взглянуть на ваше увеличенное изображение, путем сравнения с полученным в результате векторизации и up-scaling результатом выявит отклонения. Выявленные отклонения могут являться материалом для обучения НС. Например, можно пойти путем векторизации большого изображения, выявления соответствия кривых и сравнения их характеристик. По результатам обучения НС начнет выдавать некие рекомендации по коррекции кривых в произвольных изображениях. Может быть даже замахнуться на добавление кривых, типа дополнительных цветовых контуро градиента (хотя градиент в полученном изображении проще будет сгладить с помощью функций Blur и т.п.)

Ответ 2



Если хотите изучить математический аппарат нейронных сетей, то рекомендую начат с изучения перцептрона. Найти статьи по этому типу ИНС несложно. С библиотеками по нейронным сетям на C# довольно плохо дела обстоят. Для C# лучшая на мой взгляд, библиотека от Microsoft - Microsoft cognitive toolkit. (https://github.com/Microsoft/CNTK/wiki) Из минусов: нельзя обучать и строить модель сети в коде C#/.NET и пока реализация в бета-версии, так что могут быть баги. Из плюсов: легко строить различные сети с помощью скриптового языка Brainscript, есть поддержка вычислений/обучения модели на GPU от nVidia (на C#/.NET можно только вычислять), поддерживаются различные типы нейронных сетей. На гитхабе в разделе Wiki можете найти всю интересующую вас информацию и пример для реализации ИНС с помощью Microsoft cognitive toolkit в C#. Ещё можете посмотреть нейронные сети в математическом фреймворке Accord, но, насколько я помню, там не очень много возможностей и вычисления доступны только на ЦП. Конкретно для данной задачи я бы применил свёрточную нейронную сеть. http://engineering.flipboard.com/2015/05/scaling-convnets здесь даже можете посмотреть примерную архитектуру такой сети для поставленной вами задачи. Если нейронную сеть с нуля не собираетесь писать, то вполне посильная :) Попробуйте изучить для начала многослойный перцептрон и реализовать его, например для решения задачи XOR.

Ответ 3



Дополню предыдущие ответы относительно CNTK. Недавно вышедшая версия 2.2 имеет уж полноценный биндинг к C#. Соответственно, можно не только применять, но и обучать сеть, не переключаясь на Python или BrainScript.

Комментариев нет:

Отправить комментарий