Пользователь
Что такое свёрточная нейронная сеть
Введение
Свёрточные нейронные сети (СНС). Звучит как странное сочетание биологии и математики с примесью информатики, но как бы оно не звучало, эти сети — одни из самых влиятельных инноваций в области компьютерного зрения. Впервые нейронные сети привлекли всеобщее внимание в 2012 году, когда Алекс Крижевски благодаря им выиграл конкурс ImageNet (грубо говоря, это ежегодная олимпиада по машинному зрению), снизив рекорд ошибок классификации с 26% до 15%, что тогда стало прорывом. Сегодня глубинное обучения лежит в основе услуг многих компаний: Facebook использует нейронные сети для алгоритмов автоматического проставления тегов, Google — для поиска среди фотографий пользователя, Amazon — для генерации рекомендаций товаров, Pinterest — для персонализации домашней страницы пользователя, а Instagram — для поисковой инфраструктуры.
Но классический, и, возможно, самый популярный вариант использования сетей это обработка изображений. Давайте посмотрим, как СНС используются для классификации изображений.
Задача
Задача классификации изображений — это приём начального изображения и вывод его класса (кошка, собака и т.д.) или группы вероятных классов, которая лучше всего характеризует изображение. Для людей это один из первых навыков, который они начинают осваивать с рождения.
Математика для искусственных нейронных сетей для новичков, часть 1 — линейная регрессия
Оглавление
Часть 1 — линейная регрессия
Часть 2 — градиентный спуск
Часть 3 — градиентный спуск продолжение
Введение
Этим постом я начну цикл «Нейронные сети для новичков». Он посвящен искусственным нейронным сетям (внезапно). Целью цикла является объяснение данной математической модели. Часто после прочтения подобных статей у меня оставалось чувство недосказанности, недопонимания — НС по-прежнему оставались «черным ящиком» — в общих чертах известно, как они устроены, известно, что делают, известны входные и выходные данные. Но тем не менее полное, всестороннее понимание отсутствует. А современные библиотеки с очень приятными и удобными абстракциями только усиливают ощущение «черного ящика». Не могу сказать, что это однозначно плохо, но и разобраться в используемых инструментах тоже никогда не поздно. Поэтому моей первичной целью является подробное объяснение устройства нейронных сетей так, чтобы абсолютно ни у кого не осталось вопросов об их устройстве; так, чтобы НС не казались волшебством. Так как это не математический трактат, я ограничусь описанием нескольких методов простым языком (но не исключая формул, конечно же), предоставляя поясняющие иллюстрации и примеры.
Цикл рассчитан на базовый ВУЗовский математический уровень читающего. Код будет написан на Python3.5 с numpy 1.11. Список остальных вспомогательных библиотек будет в конце каждого поста. Абсолютно все будет написано с нуля. В качестве подопытного выбрана база MNIST — это черно-белые, центрированные изображения рукописных цифр размером 28*28 пикселей. По-умолчанию, 60000 изображений отмечены для обучения, а 10000 для тестирования. В примерах я не буду изменять распределения по-умолчанию.
Автоматизируем покупку Ж/Д билетов Укрзалізниці
Привет! Наверное, каждый из нас когда-то сталкивался с ситуацией, когда нужно срочно куда-то уехать, но все Ж/Д билеты уже раскуплены. В этой статье я расскажу о том, как я писал Telegram бота для отслеживания и покупки освободившихся билетов Укрзалізниці.
Как это работает
Для покупки железнодорожных билетов в Украине компания Укрзалізниця запустила ресурс http://booking.uz.gov.ua/. Ресурс удобен тем, что не нужно посещать кассы, чтобы забрать сам билет. Достаточно показать проводнику QR код с посадочного талона на экране смартфона либо распечатав на принтере.
Проблема состоит в том, что на популярные рейсы места очень быстро заканчиваются и иногда купить билет довольно проблематично. Однако, многие люди не покупают билет, а бронируют его. Бронь действует лишь 24 часа и после этого, если она не выкуплена в кассе, билет возвращается в пул свободных. Таким образом, необходимо успеть словить этот момент, когда билет доступен для покупки до того, как его снова забронируют или купят.
Было принято решение решить эту задачу с помощью скрипта, который раз в минуту проверяет свободные билеты на интересующий поезд и, в случае наличия, резервирует его на 15 минут. После чего пользователю необходимо завершить процедуру оплаты через веб браузер.
В качестве интерфейса был выбран Telegram так как это новая платформа для меня и я хотел с ней немного разобраться. В качестве бонуса сразу получаем уведомления на мобильный, не задумываясь о push нотификациях или email'ах.
В качестве языка программирования был выбран Python.
Механизмы контейнеризации: namespaces
Последние несколько лет отмечены ростом популярности «контейнерных» решений для ОС Linux. О том, как и для каких целей можно использовать контейнеры, сегодня много говорят и пишут. А вот механизмам, лежащим в основе контейнеризации, уделяется гораздо меньше внимания.
Все инструменты контейнеризации — будь то Docker, LXC или systemd-nspawn,— основываются на двух подсистемах ядра Linux: namespaces и cgroups. Механизм namespaces (пространств имён) мы хотели бы подробно рассмотреть в этой статье.
Начнём несколько издалека. Идеи, лежащие в основе механизма пространств имён, не новы. Ещё в 1979 году в UNIX был добавлен системный вызов chroot() — как раз с целью обеспечить изоляцию и предоставить разработчикам отдельную от основной системы площадку для тестирования. Нелишним будет вспомнить, как он работает. Затем мы рассмотрим особенности функционирования механизма пространств имён в современных Linux-системах.
Простой способ добавить Wi-Fi модуль к Raspberry Pi Zero
Выглядит не очень, но работает!
Прошло всего несколько суток после поступления Raspberry Pi Zero в продажу, а уже нашлись умельцы, которые расширили возможности этого мини-ПК. Пользователь с ником Shintaro смог добавить беспроводный модуль Wi-Fi к основному модулю. Сделал он это просто — подпаял Edimax WiFi USB Adapter. Подключение производилось к USB-контактам платы.
Корпус адаптера пользователь снял. Питание для модуля забирается с пинов PP1 и PP6 на обратной стороне платы. Это нерегулируемые выводы энергии по USB, так что работать с ними следует с осторожностью, чтобы не повредить подключаемое оборудование или саму ау. Некоторые недорогие USB-адаптеры могут подавать больше 5В, что чревато — вся схема может сгореть.
Добавляем WiFi к Raspberry Pi всего за $2
Разного рода хаков для мини-ПК Raspberry Pi Zero, вышедшего в тираж пару недель назад довольно много. Правда, пока что большая часть — простенькие приемы, типа впайки WiFi модуля, что и хаком особо назвать нельзя. Сейчас начинают появляться более интересные вещи, среди которых — использование SDIO для добавления WiFi модуля. Причем USB при этом не используется, порт остается функциональным.
Пользователь Hackaday.io с ником ajlitt некоторое время задумался о возможности добавления WiFi модуля к таким платам, как Raspberry Pi A+ и Raspberry Pi Zero. Дело в том, что у Raspberry Pi B+, например, несколько USB портов, и один из них можно без проблем занять соотвествующим WiFi модулем. Но у Zero и A+ портов минимум, и подключать к ним WiFi модуль не всегда представляется возможным. Решение умельца оказалось довольно оригинальным. Дело в том, что у Raspberry Pi есть специальный GPIO-разъем с пинами, и к этому разъему можно подключать различные устройства, в том числе, и SDIO-девайсы. Эту особенность «малинки» и было решено использовать.
Нейросеть на Python, часть 2: градиентный спуск
Давай сразу код!
import numpy as np
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
alpha,hidden_dim = (0.5,4)
synapse_0 = 2*np.random.random((3,hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,1)) - 1
for j in xrange(60000):
layer_1 = 1/(1+np.exp(-(np.dot(X,synapse_0))))
layer_2 = 1/(1+np.exp(-(np.dot(layer_1,synapse_1))))
layer_2_delta = (layer_2 - y)*(layer_2*(1-layer_2))
layer_1_delta = layer_2_delta.dot(synapse_1.T) * (layer_1 * (1-layer_1))
synapse_1 -= (alpha * layer_1.T.dot(layer_2_delta))
synapse_0 -= (alpha * X.T.dot(layer_1_delta))
Часть 1: Оптимизация
В первой части я описал основные принципы обратного распространения в простой нейросети. Сеть позволила нам померить, каким образом каждый из весов сети вносит свой вклад в ошибку. И это позволило нам менять веса при помощи другого алгоритма — градиентного спуска.
Суть происходящего в том, что обратное распространение не вносит в работу сети оптимизацию. Оно перемещает неверную информацию с конца сети на все веса внутри, чтобы другой алгоритм уже смог оптимизировать эти веса так, чтобы они соответствовали нашим данным. Но в принципе, у нас в изобилии присутствуют и другие методы нелинейной оптимизации, которые мы можем использовать с обратным распространением:
Нейросеть в 11 строчек на Python
О чём статья
Лично я лучше всего обучаюсь при помощи небольшого работающего кода, с которым могу поиграться. В этом пособии мы научимся алгоритму обратного распространения ошибок на примере небольшой нейронной сети, реализованной на Python.
Дайте код!
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
syn0 = 2*np.random.random((3,4)) - 1
syn1 = 2*np.random.random((4,1)) - 1
for j in xrange(60000):
l1 = 1/(1+np.exp(-(np.dot(X,syn0))))
l2 = 1/(1+np.exp(-(np.dot(l1,syn1))))
l2_delta = (y - l2)*(l2*(1-l2))
l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1))
syn1 += l1.T.dot(l2_delta)
syn0 += X.T.dot(l1_delta)
Слишком сжато? Давайте разобьём его на более простые части.
Простой метапоисковый алгоритм на Python
Лирическое отступление
В рамках научно-исследовательской работы в вузе я столкнулся с такой задачей, как классификация текстовой информации. По сути, мне нужно было создать алгоритм, который, обрабатывая определенный текстовый документ на входе, вернул бы мне на выходе массив, каждый элемент которого являлся бы мерой принадлежности этого текста (вероятностью или степенью уверенности) к одной из заданных тематик.
В данной статье речь пойдет не о решении задачи классификации конкретно, а о попытке автоматизировать наиболее скучный этап разработки рубрикатора — создание обучающей выборки.
Когда лень работать руками
Первая и самая очевидная для меня мысль – написать простой метапоисковый алгоритм на Python. Другими словами, вся автоматизация сводится к использованию выдачи другой поисковой машины (Google Search) за неимением своих баз данных. Сразу оговорюсь, есть уже готовые библиотеки, решающие подобную задачу, например pygoogle.
58 признаков хорошего интерфейса
1 Один столбец вместо нескольких
Один столбец точнее отражает то, что вы хотите донести. Пользователи проходят сверху вниз по более предсказуемому пути. В дизайне с несколькими колонками есть риск отвлечения пользователя от основной задачи страницы.
Почему писать приложения под N900 выгодно!
Если честно, я даже не надеялся, что такой гигант так быстро и просто сможет перестраиваться под рынок. Но последние два года показали, что Nokia серьезно намерена удерживать свои позиции на мобильном рынке и будет бороться. Вот последняя неделя меня просто удивила и обрадовала событиями.
Как тут уже писали ранее вышел релиз Qt Nokia SDK для Windows и Linux и бета для Mac Os. Но на этом радости только начинаются.
Упорядочивание значков на рабочем столе Windows
Обратил я на нее внимания из-за до боли знакомой картинки, но в новом оформлении.
Описание программки гласит, что она призвана помочь разобраться в месиве ярлыков на рабочем столе операционной системы.
Будучи запущена, она позволяет владельцу компьютера структурировать хаотично разбросанные значки приложений путем создания на рабочем столе Windows подсвечиваемых областей, в пределах которых размещаются ярлыки определённой категории. Области можно перетаскивать, менять их названия, прозрачность, размеры и прочие характеристики.
И что мы видим? ПРАВИЛЬНО! Это же Windows 3.11 для рабочих групп ))))
Собственно программка называется Fences. Весит сравнительно немного (6,35 Мб). Работает под Windows 2003, Windows Vista, Windows XP.
Сайт — www.stardock.com/products/fences
10 признаков php-приложения «с душком»
Дерево категорий с чекбоксами на JQuery
Begin
Делаем каталог. Понадобилось сделать дерево категорий товара/фирм/услуг с бесконечной вложенностью. Каждую категорию можно отметить чекбоксом, чтобы потом можно было получить список/массив всех отмеченных категорий (например для поиска по ним).
Написал такое вот деревце. Реализовал в виде плагина к любимому JQuery )
Что умеет:
- Если указан пустой див — загружает из указанного скрипта все категории, и подкатегории(вложенные ul, если li имеет класс folder и не имеет вложенного списка(ul) — дерево будет автоматом подгружать этот список из указанного скрипта с указанной глубиной рекурсии(это забота скрипта выдавать запрашиваемые данные с требуемыми параметрами).
- Если указан готовый список — то можно сворачивать/разворачивать подкатегории, отмечать нужные, которые будут подсвечены заданным классом
- Получать выбранные номера категорий (value чекбоксов) в массиве
- Возможность поиска по всем загруженным веткам дерева, вывод результата поиска в указанный див(указывается див для поиска, в котором строка для ввода запроса + див(пустой) для вывода результатов)
- Число результатов поиска можно ограничить (в параметрах)
- При клике на одном из найденных результатов — дерево открывается чтобы отобразить заданную ветку и она подсвечивается классом(указывается в параметрах)
- Можно задать чтобы при клике на родительской категории — внутренние также выделялись
- Можно задать сообщение которое выдается при попытке выделить лишний чекбокс если число их ограничено.
Вроде ничего не забыл )
Параметры:
«Пилим» FLAC
На деле — всё гладко. Действительно, есть и плееры, поддерживающие всё это дело, и действительно это всё работает. НО.
Мои увлечения связаны с электронной клубной музыкой, соответственно ради одного-двух треков целиком диски нарезать перед вечеринкой не хочется(лучше сделать свои грамотные сборники), плюс еще хотелось чтобы привести все файлы к одному формату, а именно FLAC — т.к. новые прогрессивные программы(Ableton Live) и плееры(ipod (с особой прошивкой, либо тач с софтом/cowon) его поддерживают.
Итак, еще раз, задача — имеются diskname.flac + diskname.cue, из них нужно получить много треков с тэгами и внятными названиями файла(Название артиста, номер трека, название трека) + плейлист.
Для примера я взял дистрибутив debian lenny (5.0). Видимо, для пользователей *buntu и других, основанных на debian дистрибутивах команды тоже будут верны.
Обработка запросов в ASP.NET MVC
***
Давайте рассмотрим, что происходит в режиме runtime, когда ASP.NET MVC обрабатывает входящий запрос.
Конвейер обработки запросов в ASP.NET MVC сравним с жизненным циклом страницы в ASP.NET WebForms в том, что он отображает анатомию системы. Понимание этого процесса необходимо для выполнения каких-либо нестандартных задач. В отличие от традиционного жизненного цикла страницы в ASP.NET, конвейер обработки запросов в MVC очень гибок – можно изменить любую его часть так, как вам хочется, и даже перераспределить или заменить некоторые компоненты. Хотя обычно не приходится расширять или изменять конвейер, можно сделать это в любой момент, потому как расширяемость лежит в основе ASP.NET MVC.
Colobot и Ceebot
Но я сейчас говорю про общества, где входным билетом служат не деньги, а знания. Да, да, Вы не поверите, но я говорю про программистов.
Ведь только мы способны сутками заниматься совершенствованием алгоритма, только мы можем бесконечно долго заниматься проектированием и совершенствованием архитектуры проекта, рисуя никому не понятные UML-диаграммы и странные схемы. Но есть еще один вид занятий, некий закрытый клуб для посвященных, который сгубил не одну тысячу часов, подняв профессионализм его участников до небес. Я говорю про Игры для программистов.
Их существует огромное количество, каждая игра по своему интересна, у каждой своя архитектура, свой API-интерфейс. Так как всех их невозможно охватить в отдельной заметке — я решил начать серию заметок про различные игры.
P.S. Создал открытый блог Игры для программистов.
ejabberd+AD+Shared Roster
Для начала что мы имеем: небольшую сеть на ~150 машин, в основном с ОС Windows XP, домен, поднятый естественно на Windows 2k3 и нормальную машинку(или сервер) на которой установлен gentoo linux (опционально MySQL).
Задача: Установить jabber сервер, сделать общий ростер, с группами из AD, прикрепить к нему icq гейт и поставить jabber клиенты на рабочие машины.
C# + WPF + сторонние сборки -> один .exe-шник
Информация
- В рейтинге
- Не участвует
- Откуда
- Киев, Киевская обл., Украина
- Дата рождения
- Зарегистрирован
- Активность