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

Данный пост основан на моих личных исследованиях при написании курсового проекта.

Для нетерпеливых ссылка на github. Внутри вы найдете демонстрационное приложение, которое на текущий момент не особо то готово к использованию как самостоятельное приложение (откровенно говоря, думаю, что вряд ли это и кому-то нужно в целях, отличных от изучения). Питонист я начинающий, поэтому если вы скажете, где можно было бы поступить красивее (так сказать python way) буду очень рад!

Введение

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

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

Моя реализация

Результат работы моей реализации:

Как видно, результат отличается от результата, представленного в статье. Появилась «сеточка». Я так и не смог добиться такого же качества при восстановлении, как в статье. Пользовался также кодом, что можно найти по ссылке в статье, обнаружил, что у меня с производительностью похуже, чем у автора. Неужели так сильно отличается скорость работы Python и Java? Если кто может дать ответ, милости прошу в комментарии.

Нюансы и трудности

Может это прозвучит глупо, но до меня не сразу дошло, что на все изображение требуется только одна нейронная сеть. Как сейчас помню — 3 часа ночи, сижу с красными глазами у компа, жду результат работы программы (первый запуск на маленькой картинки отнял у меня в районе 45 минут жизни) и про себя думаю: «А где, черт возьми сжатие? Нет ну чисто формально оно есть, на практике — блин в несколько тысяч процентов больше! ЧЯДНТ?!»

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

В коде программы на Java (от автора статьи) нету сохранения сжатых данных на диск, потому оценить сжатие не теоретическим путем было не возможно. Я в своей программе это реализовал, правда немного кривовато. Выход нейронной сети на скрытом слое отнюдь не лежит в пределах [0; 1], потому чтобы записать в файл толковым образом, пришлось написать небольшую функцию, которая преобразовывала выход скрытого слоя нейронной сети к числу из диапазона [0; 255], чтобы в последствии записать это все по байтам в файл. Я думаю это вполне себе причина дополнительных потерь (поправьте меня, если это не так). Если у вас есть другие предложения на эту тему, снова милости прошу в комментарии и\или в pull request'ы :)

Вопросы

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

Спасибо за внимание :)

20 июня 2012 г. 16:16:06

GomZik

Python PyQt4 Нейронные сети БГУИР
Поделиться