{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Рома Рыбальченко: заметки с тегом pycon",
    "_rss_description": "Аналитик-разработчик в Алисе",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/keen.nerevar.com\/tags\/pycon\/",
    "feed_url": "https:\/\/keen.nerevar.com\/tags\/pycon\/json\/",
    "icon": "https:\/\/keen.nerevar.com\/pictures\/userpic\/userpic@2x.jpg?1471192837",
    "authors": [
        {
            "name": "Неревар",
            "url": "https:\/\/keen.nerevar.com\/",
            "avatar": "https:\/\/keen.nerevar.com\/pictures\/userpic\/userpic@2x.jpg?1471192837"
        }
    ],
    "items": [
        {
            "id": "21",
            "url": "https:\/\/keen.nerevar.com\/all\/pycon-russia-2016\/",
            "title": "PyCon Russia 2016",
            "content_html": "<p><img src=\"https:\/\/keen.nerevar.com\/pictures\/pycon2016_2.jpg\" height=\"300\"><\/p>\n<p>В начале июля состоялась двухдневная конференция <a href=\"http:\/\/pycon.ru\/2016\/\">Pycon Russia 2016<\/a> в подмосковье. До этого 3 года подряд конференция проходила в Екб.<br \/>\nМне очень понравилась как организация конфы, место проведения, так и сами доклады. Как начинающего питониста, меня порадовало разнообразие тем докладов: ядро CPython, тестирование, инфраструктура, machine learning, highload.<\/p>\n<p>UPD: а вот и доклады <a href=\"https:\/\/www.youtube.com\/watch?v=sEciSlAClL8&index=1&list=PLRdS-n5seLRqszBqVDF342RMlCWgOTm6q\">https:\/\/www.youtube.com\/watch?v=sEciSlAClL8&index=1&list=PLRdS-n5seLRqszBqVDF342RMlCWgOTm6q<\/a><\/p>\n<p><img src=\"https:\/\/keen.nerevar.com\/pictures\/pycon2016_1.jpg\" height=\"500\"><\/p>\n<p>Краткий конспект самых интересных докладов:<\/p>\n<h3>Thinking about Concurrency<\/h3>\n<p>Two first things to learn about multithreading are fear and respect.<br \/>\nДоклад от разработчика языка python <a href=\"https:\/\/twitter.com\/raymondh\">Raymond Hettinger<\/a>’а про многопоточность. В нём сравниваются потоки и процессы (threads versus processes).<br \/>\nУ потоков есть общий state, что является и плюсом и минусом одновременно — возникает проблема разграничения доступа потоков к общим данным. Для этого могут использоваться блокировки (locks) и флаги. Но они порождают deadlock’и и race conditions.<br \/>\nУ процессов нет общих данных, они запускаются независимо.<\/p>\n<pre>\r\nfrom multiprocessing import Pool\r\nn = 10\r\npool = Pool(processes=n)\r\nresults = pool.map(complex_operation, [x for x in range(n)])\r\n<\/pre>\n<h3>Theano<\/h3>\n<p>Екатерина Тузова из Jetbrains рассказывала про применение фреймворка нейронных сетей Theano как переводчик с языка математики в программирование. Постановка задачи такая, что к программистам приходят математики с моделью, которую просят запрограммировать. Тут на помощь приходит Theano, с помощью которого можно вычислять математические выражения, содержащие многомерные массивы. Презентация — <a href=\"https:\/\/speakerdeck.com\/ktisha\/theano-lets-build-a-net\">https:\/\/speakerdeck.com\/ktisha\/theano-lets-build-a-net<\/a><\/p>\n<h3>Tensorflow and deep learning<\/h3>\n<p>Самый интересный доклад + воркшоп про создание нейросети на TensorFlow от Martin Gorner из Google. Про это отдельный пост — <a href=\"https:\/\/keen.nerevar.com\/all\/tensorflow-and-deep-learning-from-pycon-2016\/\">https:\/\/keen.nerevar.com\/all\/tensorflow-and-deep-learning-from-pycon-2016\/<\/a><\/p>\n<h3>Docker:<\/h3>\n<p>От евангелиста докера был обзорный доклад технологии с примерами образа, настройками и конфигами. Как собрать образ с нуля по шагам, как разворачивать, куда его выкладывать. Как известно, любая команда в докере создаёт новый слой, который отдельно кешируется, скачивается, применяется, поэтому имеет смысл объединить похожие по смыслу действия в один слой. Так получаются всего несколько слоём: 1) установка python, окружения 2) установка проектных зависимостей 3) непосредственно запуск проекта.<br \/>\nПрезентация — <a href=\"https:\/\/speakerdeck.com\/satyrius\/deliver-python-apps-with-docker,\">https:\/\/speakerdeck.com\/satyrius\/deliver-python-apps-with-docker,<\/a> демо — <a href=\"https:\/\/github.com\/satyrius\/paid\">https:\/\/github.com\/satyrius\/paid<\/a><\/p>\n<h3>Neo4j graph db<\/h3>\n<p>Программист-олимпиадник, который очень любит графы, рассказывал про промышленное использование баз данных для хранения графов. Например на тематике фильмов и актёров он получал все фильмы, в которых снимался определённый актёр (рёбра графа) или в социальной сети с разными типами дружбы — по пользователю выборку друзей, друзей друзей, друзей друзей друзей и т.д до 6 уровней рукопожатий. Так вот для простых запросов, где нужно выбрать друзей друзей, MySQL показывает хорошие результаты. Но с увеличением уровня сложности, количества join’ов, время выполнения запросов в мускуле растёт экспоненциально. И тут на помощь приходят graph databases, предназначенные для хранения графов и работы с ними. В таких db найти друзей друзей друзей — это всего лишь найти рёбра к соседним вершинам и выполняется за линейное время. Докладчик сравнил несколько баз данных и выбрал Neo4j, к ней надстройку Cypher Query Language с SQL-подобным синтаксисом и py2neo коннектором для питона.<br \/>\nПрезентация — <a href=\"https:\/\/asoldatenko.com\/pyconru2016.pdf\">https:\/\/asoldatenko.com\/pyconru2016.pdf<\/a><\/p>\n<h3>Знай и люби свой CPython<\/h3>\n<p>Доклад от разработчика из компании хакеров Positive Technologies про то, как устроен интерпретатор Питона и что можно сделать в его кишках. Как в C и ASM’е можно было работать с памятью напрямую, так и в докладе показаны примеры как менять значения переменных в памяти напрямую. В python, как известно, строки неизменяемы, а если писать напрямую в память — то на основе этого можно сделать класс MutableString. Значения любых переменных, свойства встроенных типов данных, действия операндов — всё можно менять. Для изучения как оно работает, поиграться — это интересно и познавательно. Только в production не рекомендуется использовать.<br \/>\nПрезентация — <a href=\"https:\/\/clck.ru\/9zuvF\">https:\/\/clck.ru\/9zuvF<\/a><\/p>\n<h3>User-centered open source projects<\/h3>\n<p><img src=\"https:\/\/keen.nerevar.com\/pictures\/222828002_128301_7824722293351189912.jpg\" height=\"450\"><br \/>\nДоклад на английском от Jackie Kazil из Capital One про разработку и окружение open-source проекта.<br \/>\nРазных библиотек на гитхабе много, а хороших — нет. Jackie привела чеклист вещей, которые должны быть в любом хорошем проекте:<\/p>\n<ul>\n<li>Landing page<\/li>\n<li>«Getting Started»<\/li>\n<li>Install instructions (в идеале чтобы была одна строчка npm install или pip install)<\/li>\n<li>Contribution guide<\/li>\n<li>Responses < 24hrs<\/li>\n<li>Clear git workflow<\/li>\n<li>Labeled branches<\/li>\n<li>License<\/li>\n<li>Regular commits<\/li>\n<li>Project status, ownership<\/li>\n<li>Tests, test coverage and build result<\/li>\n<li>«Other users»<\/li>\n<\/ul>\n<p>Презентация — <a href=\"http:\/\/www.slideshare.net\/jackiekazil\/usercentered-open-source\">http:\/\/www.slideshare.net\/jackiekazil\/usercentered-open-source<\/a><\/p>\n",
            "date_published": "2016-07-05T22:09:04+03:00",
            "date_modified": "2016-08-29T23:57:32+03:00",
            "tags": [
                "pycon",
                "python"
            ],
            "_date_published_rfc2822": "Tue, 05 Jul 2016 22:09:04 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "21",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "22",
            "url": "https:\/\/keen.nerevar.com\/all\/tensorflow-and-deep-learning-from-pycon-2016\/",
            "title": "Tensorflow and deep learning from Pycon 2016",
            "content_html": "<p>Самый интересный доклад + воркшоп про создание нейросети на TensorFlow от Martin Gorner из Google с конференции PyCon Russia 2016.<\/p>\n<p>В качестве предметной области был датасет <a href=\"http:\/\/yann.lecun.com\/exdb\/mnist\/\">mnist<\/a> с 50к чёрнобелых изображений цифр от 0 до 9 нарисованных от руки размером 28x28px. На вход нейросетке подаётся пачка картинок из flatten pixel mask размера 28x28=784 значения по каждой картинке, на выходе получаем вероятность класса от 0 до 9, которая сравнивается с реальным значением, функция ошибки — cross entropy.<\/p>\n<p>Для задач классификации в качестве функции активации хорошо подходит softmax — возвращает число от 0 до 1, которое можно интерпретировать как вероятность класса.<\/p>\n<pre>Y = softmax(X * W + b)<\/pre>\n<p>где X — массив картинок, каждая кодируется массивом из 784 значений 1 или 0 по пикселям, W — веса каждого пиксела и b — константа (bias)<br \/>\nЗадача нейронной сети на каждом шаге, на каждой пачке данных, подбирать оптимальные веса для каждого пикселя путём минимизации функции ошибки<\/p>\n<pre>cross-entropy = -sum( Y_ans_i * log(Yi) )<\/pre>\n<p>где Yi — предсказанное значение, Y_ans_i — реальное значение.<\/p>\n<p><img src=\"https:\/\/keen.nerevar.com\/pictures\/MNIST_2016-07-04_23-05-12.png\" height=\"600\"><br \/>\nПри работе с нейросетями — формируешь структуру сети, подаёшь на вход много данных и снимаешь результат. А внутри происходит магия — нейросеть сама каким-то образом выделяет закономерности. Ещё добавить к этому сложную математическую модель оптимизации, получается работа с чёрным ящиком. Поэтому разработчикам очень важно наглядно видеть результат работы. Martin написал замечательную визуализацию процесса обучения сети, где показываются графики точности, ошибки, и самих изображений цифр, на которых тестируется модель.<\/p>\n<p>Базовый вариант одноуровневой нейросети с 10 нейронами выдаёт 92.6% точности. Это очень мало, если учесть, что максимальная точность предсказывания для этой задачи 99.7%. Поэтому нейронку можно и нужно улучшать и оптимизировать. Первое, что можно сделать — это создать глубокую нейросеть — добавить ещё слои. При добавлении слоёв с активацией <a href=\"http:\/\/cs231n.github.io\/neural-networks-1\/\">ReLU<\/a> из 200, 100, 60, 30 нейронов к базовому уровню softmax из 10 нейронов, точность возрастает до 97.2%<\/p>\n<p>Следующий шаг — это регулирование learning rate decay — порога изменения весов W для нахождения минимума функции ошибки. Чем меньше значение порога — тем точнее будут подбираться веса и тем больше итераций и данных нужно, чтобы выровнялась точность предсказаний. With decaying learning rate from 0.003 to 0.0001 decay_speed 2000, 10K iterations, final test accuracy equals 0.9824.<\/p>\n<p><img src=\"https:\/\/keen.nerevar.com\/pictures\/scaled\/Tensorflow_and_deep_learning_-_without_a_PhD_-_Google_Slides_2016-07-04_23-20-05.scaled.png\" height=\"450\"><br \/>\nНаконец, можно использовать свёрточную (convolutional) нейронную сеть для классификации картинок. В обычной нейросети каждый нейрон связан со всеми нейронами предыдущего слоя, и каждая связь имеет свой вес. В свёрточной нейросети в операции свёртки используется небольшая матрица, «окно», которое двигается по всему слою и формирует сигнал активации для нейрона на следующем уровне с соответствующей позицией. Эта матрица (окно, ядро свёртки) построена таким образом, что графически кодирует какой-либо один признак, например, наличие наклонной линии под определенным углом. Тогда следующий слой, получившийся в результате операции свёртки матрицы весов, показывает наличие данной наклонной линии в обрабатываемом слое и её координаты, формируя карту признаков (feature map)<br \/>\nТак, добавив 3 свёрточных слоя (6x6str1 5x5str2 4x4str2) к полносвязному слою relu из 200 нейронов и softmax 10, <a href=\"https:\/\/github.com\/nerevar\/tensorflow-mnist-tutorial\/blob\/master\/mnist_3.0_convolutional.py#L147\">получим точность<\/a> 99.2%<\/p>\n<p>Презентация — <a href=\"http:\/\/goo.gl\/pHeXe7,\">http:\/\/goo.gl\/pHeXe7,<\/a> код демки — <a href=\"https:\/\/github.com\/martin-gorner\/tensorflow-mnist-tutorial\">https:\/\/github.com\/martin-gorner\/tensorflow-mnist-tutorial<\/a><br \/>\nИнтервью на хабре с Мартином <a href=\"https:\/\/habrahabr.ru\/company\/it_people\/blog\/303832\/\">https:\/\/habrahabr.ru\/company\/it_people\/blog\/303832\/<\/a> В нём он рассказывает про <a href=\"http:\/\/tflearn.org\/\">TFlearn<\/a> — высокоуровневая надстройка над TensorFlow с синтаксическим сахаром для создания моделей, которую планируется внедрить в ядро TF, а пока что можно пользоваться отдельным контрибом.<\/p>\n",
            "date_published": "2016-07-05T11:02:51+03:00",
            "date_modified": "2016-07-05T00:14:12+03:00",
            "tags": [
                "machine learning",
                "ml",
                "pycon",
                "python"
            ],
            "_date_published_rfc2822": "Tue, 05 Jul 2016 11:02:51 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "22",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4116,
    "_e2_ua_string": "Aegea 11.2 (v4116)"
}