Как ни крути, но Java — популярный язык программирования и программистам довольно часто приходится иметь с ним дело, нравится им это или нет. Причины могут быть разные. Возможно, вы хотите запустить примеры к прочитанной недавно книге. Или вы работаете с софтом, написанном на Java (Cassandra, Voldemort, Hadoop, ZooKeeper, Jenkins, …). Или вы просто играетесь с одним из относительно новых языков под JVM, например, Groovy, Scala, Clojure или даже каким-нибудь Frege. В общем, Java уже повсюду, и хочешь не хочешь, а приходится в ней немного разбираться.
Перед вашими глазами находится заключительная заметка из серии постов о взломе капчи. В предыдущей части мы успешно обучили многослойную нейронную сеть, распознающую буквы на капче по отдельности. Сегодня мы наконец-то соберем все полученные результаты воедино и узнаем, насколько хорошо все это хозяйство работает.
Вы читаете продолжение серии постов о взломе капчи. В прошлый раз мы с вами выяснили, как очистить капчу от шума и нарезать ее на отдельные буквы. Сегодня же мы разберемся, как, имея картинки с буквами и зная, на какой картинке какая буква изображена, можно написать программу, распознающую буквы на картинках.
Продолжаем ломать капчу. На предыдущем шаге мы с вами произвели сбор и предварительный анализ данных. В результате сложилось некоторое понимание того, как работает исследуемая капча, а также образовалось множество примеров изображений с известными кодами на них. Следующим шагом мы нарежем нашу капчу на буквы.
Итак, мы с вами полны решимости сломать какую-нибудь капчу. С одной стороны, капча не должна быть слишком простой или уже кем-то сломанной, потому что так не интересно. С другой, выбрав слишком сложную капчу можно потратить кучу времени на ее взлом и не добиться никакого результата. Также желательно, чтобы капча использовалась на каком-нибудь более-менее известном сайте, чтобы наш опыт имел хоть какое-то подобие практической значимости.
У каждого из нас, само собой разумеется, есть богатейший опыт распознавания капч. Капчи бывают разные — всевозможные логические («кликните на синий кружочек», «на каких картинках изображены котята?» и так далее), звуковые, есть даже капчи, предлагающие выбрать самую красивую фотографию. Но самыми распространенными на сегодняшний день остаются капчи с искаженным изображением букв и/или цифр. На этой неделе мы узнаем, как написать программу (понятное дело, на Haskell), автоматически распознающую одну из таких капч, притом не самую заурядную.
В общем, начитавшись Хайкина, у меня стали чесаться лапки поделать что-нить интересненькое с нейронными сетями. Писать, понятное дело, при этом я собирался на Haskell. Беглый поиск по Hackage выявил наличие множества библиотек для работы с нейронными сетями, из которых instinct и HaskellNN не только неплохо выглядели, но и устанавливались. Однако у этих библиотек есть большой недостаток (помимо фатального), заключающийся в том, что они не способны использовать всю мощь современных многоядерных процессоров за счет параллелизма. Что было дальше, вы уже и сами поняли :)
С каждой публикацией очередной порции рецензий на недавно прочитанные мной книги всегда находится пара человек, задающие мне одни и те же вопросы. Где я нахожу время на прочтение такого количества книг, читаю я книги одну за другой или же сразу несколько книг, переключаясь между ними, за что я презираю художественную литературу, решаю ли я все упражнения, не получается ли чтение слишком поверхностным, и так далее. Немного подустав отвечать на эти вопросы, я решил написать этот FAQ.
В этом выпуске: обучение нейронных сетей при помощи генетических алгоритмов, всякая распределенщина на языке Go, как написать морской бой на Haskell и развернуть Erlang-приложение в Heroku, как правильно работать с временными рядами, и не только. Предыдущие выпуски: март 2014, февраль 2014, январь 2014, декабрь 2013.
Как некоторым из вас может быть известно, я имею кое-какой опыт записи подкастов. В частности, недавно мы коллегами закончили записывать первый сезон EaxCast и после майских праздников планируем начать записывать второй. В этой же заметке я хочу поделиться своим скромным опытом в этом, как оказалось, довольно нелегком деле, на случай если кому-то из читателей это интересно.