Разработка ETL-системы

Объект и инструменты исследования. Характеристика платформ для анализа данных. Изучение программных пакетов. Особенности использования DanbooruDownloader. Основы установки Anaconda. Проверка эффективности работы простых методов классификации на тегах.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 30.08.2016
Размер файла 1,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Introduction

Area of research and its applicability

Modern world, being firmly footed in the Information Age, is spectacularly efficient in producing large quantities of data of any kind and variety. This includes both human-generated content (music, visual arts, cinema, literature, photography, emails, tweets, programming code, plain speech, 3d blueprints, handwritten text -- you name it) and machine-generated data: genomic data, measurements of anything measurable, historical data of human activities, etc. And while this fact is certainly fascinating on its own merits -- to computer and data geeks at the very least -- it could be entirely inconsequential, if not for its practical applications. As seen in the results of successful projects in the field, it is entirely possible to enhance or even supplant human skills, knowledge and experience with use of sufficiently sophisticated machine learning techniques, enough computational power to train appropriate models and, most crucially, vast amounts of raw data. Several examples are listed below

As of 2016, Google Translate is comparable to human translators (at least, on the semantic level (Haiying Li, 2014)), can processing text thousands of times faster; works in 103 languages, and recognizes printed, handwritten and spoken text.

In 2015, automated classification of plankton using deep neural networks was achieved (Dieleman, 2015).

In the same year, similar techniques were used to remarkable results on diagnostics of diabetic retinopathy, potentially alleviating medical expenditures worth of hundreds of millions of dollars annually (estimation based on (estimated) wages, diagnosis' time and number of patients) (Graham, 2015).

Currently, the effort is underway to construct an analogous solution to the problem of measuring cardiac volumes and deriving ejection fraction, with similar economic potential (Kaggle Inc, 2015).

In the past several years dairy industry has embraced methods of biological data science. Principle idea behind this trend is the usage genetic markers in building predictive models of “lifetime net merit” (and, supposedly, other, more directly measured qualities) of bulls, which turned out to be substantially more effective than traditional methods alone (Madrigal, 2012).

These and many other achievements provide the background: data science is not just a curious plaything for enthusiastic theorists to play with, but also a powerful instrument applicable to business problems in fields many and diverse.

As should be apparent from the fact that data science has only blossomed into maturity in recent years, the task of discovering patterns in the sea of data is not simple, and Big Data is called so for a reason; while constantly shifting with the advance of the technology, lower boundary for what is considered Big Data was in terabytes at least even in 2012 (w:Big data) and projects which produce tens of terabytes of data daily are not unheard of. Even storage (not to mention analysis) of such vast volume is a very nontrivial problem, plainly unsolvable with a single computer system -- no matter how massive.

Fortunately, the solution exists: by and large, analysis of large datasets can be broken down into numerous small tasks, all perfectly manageable by regular machines, all subject to parallel processing. In fact, one of the intentions of this work is to assemble a (software) system capable of that. This is further elaborated upon in the next paragraph.

Aims and purposes

The present study intends to construct an adaptable and scalable ETL and machine learning pipeline as a means of accomplishing the following purposes:

to learn of instruments of large-scale data processing, in particular of those necessary to extract and transform plain text, images and their metadata and to build the aforementioned machine learning layer capable of useful work;

to acquire practical experience in managing such instruments, as theoretical knowledge has no say in the pitfalls and shortcomings of a real system;

to provide a comprehensible (if possible, a step-by-step) guide to recreating the result, as there are too few papers that care for their own reproducibility;

to explicitly demonstrate the successful achievement of the outlined goals.

Глава 1. Объект и инструменты исследования

платформа программный тег

1.1 Датасет

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

Источник данных должен быть публично доступен.

Источник данных не должен быть «заезженным», т.е.не должен широко использоваться в научных работах по теме: гораздо интереснее проводить анализ, имея хотя бы шанс на получение новых результатов вместо повторения уже проделанной научной работы.

Источник данных должен быть достаточно масштабным: шансы на получение эффективных результатов на малых объёмах невелики, к тому же часть исследования посвящена вопросу масштабирования анализа данных.

Источник данных должен иметь тщательно размечен, т.е. индивидуальные объекты в нём должны быть распределены по множеству различных категорий (с допустимыми пересечениями), что позволит иметь наглядные и легко представимые программно цели для тренировки аналитических моделей.

Результат работы должен иметь хотя бы гипотетическое практическое применение.

В конце концов, хотелось бы иметь датасет интересным или забавным.

В соответствии с этими требованиями были рассмотрены следующие датасеты:

Многие наборы данных, указанные в (Kaggle Inc.) удовлетворяют многим критериям: интересны, объёмны, практически применимы, тщательно промаркированы, очевидно, публично доступны, однако формат платформы Kaggle диктует их популярность: большая часть этих наборов обследована десятками и сотнями исследователей, и по многим из них проведены и опубликованы крупные научно-практические работы.

1.2 Платформа

Существует немалое количество фреймфорков для анализа данных. Одним из них является пакет Anaconda, базирующийся на Python и большом количестве библиотек обработки и анализа данных. Приведём некоторые из них:

* conda, “an open source package management system and environment management system for installing multiple versions of software packages and their dependencies and switching easily between them” (15);

* Matplotlib for intuitively understandable visualizations;

* IPython for interactive development ;

* NumPy for standard implementations of tools of pure mathematics (linear algebra, FFT, matrix operations, multidimensional arrays, random sampling, etc.);

* pandas for yet another way of querying relational data ;

scikit-learn for machine learning in all of its variety: regression, clustering, classification, preprocessing and whatnot.

Причины для выбора именно этого фреймфорка (по сравнению с, к примеру, языком R или средами Wolfram Mathematica и Matlab) таковы:

Предыдущее знакомство с языком.

Широкая популярность как языка, так и потенциально используемых пакетов.

Существование готовых решений по интеграции с системами больших данных (пять библиотек для взаимодействия с одним только Hadoop!)

Средой для разработки кода был выбран IPytrhon/Jupyther по причинам встроенности в дистрибутив Anaconda, простоты и наглядности разработки.

Следует отметить, что, хотя более «свежей» версией Python является 3.5, значительная часть программ и пакетов по историческим причинам реализованы также, или же эксклюзивно под версию 2.7. Несколько экспериментов с установкой и разрешением зависимостей различных пакетов в составе Anaconda привели к мнению, что дистрибутив под версию 2.7 является наиболее функциональным.

1.3 Программные пакеты

Мощным аналитеческим пакетом под Python является Theano, «a Python library that allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently» (LISA lab, 2016), в частности из-за потенциального использования GPU и из-за его ориентированность на скорость вычислений, нечастую для Python-пакетов. К сожалению, требования к его установке и работе нетривиальны, и при установке часть из них не удалось удовлетворить по неизвестным причинам.

Другой популярной библиотекой анализа данных является уже упоминавшаяся выше scikit-learn. Она включает в себя такие методы анализа данных как: Support Vector Classification, Random Forest Classifier. Gaussian Naive Bayes, Linear Discriminant Analysis, Quadratic Discriminant Analysis, и так далее.

Наконец, была использован caffe -- «a deep learning framework made with expression, speed, and modularity in mind» (Jia, 2016) -- набор библиотек C++ и интерфейсов к различным средам разработки (в том числе к python), разработанный для удобного конструирования и обучения глубоких нейронных сетей. Он вполне аналогичен Theano по гибкости, также использует GPU-ускорение, и более непосредственно применим в исследовании.

1.4 Вычислительные ресурсы

Вычисления проводились на ПК, укомплектованном двухядерным Intel Core i5 @ 3.2-GHz, 16 ГБ оперативной памяти и видеокартой NVIDIA GeForce GTX 460, совместимой с технологией NVIDIA CUDA.

При проведении исследования обнаружилось, что указанная видеокарта обладает сравнительно малой оперативной памятью (768МБ), в связи с чем была приобретена и установлена новая: NVIDIA GeForce GT 730. Последняя облает преимществом по объёму памяти (4 ГБ), но проигрывает по количеству ядер CUDA: 96 против 336.

В качестве альтернативных вариантов рассматривались облачные вычислительные сервисы, к примеру, Microsoft Azure и Amazon Web Services. Они были отвергунты по двум причинам: излишнее усложнение и без того непростого стека технологий и цена.

Глава 2. Установка. Выбор целей и метрик

2.1 Выгрузка данных

Самым простым способом извлечения и сохранения данных из источника был выбран DanbooruDownloader (Nandaka, 2016) благодаря простоте использования и высокой степени кастомизации:

Рисунок 1 Окно настроек DanbooruDownloader

В первых экспериментах большая часть настроек была оставлена без изменений; исключение составляют Default Save Folder, многократно изменённый с целью ограничения количества изображений в одной папке, и Image Size, установленный в Thumb для усечения размера индивидуальных изображений для экспериментов.

Инструменты анализа

Очевидно, была установлена Anaconda.

Рисунок 2 Окно загрузки Anaconda

Рисунок 3 Окно установки Anaconda

Рисунок 4 Окно установки Anaconda, финал

Были рассмотрены две библиотеки предварительной обработки изображений: PIL/pillow и opencv. Преимущества первой состоят во вхождении в вышеуказанный дистрибутив, и в значительной распространённости; преимущество второй -- в функциональной мозности. В связи с этим в качестве базового инструмента предобработки была задействована PIL/pillow, однако opencv была установлена на случай необходимости сложной предобработки.

Рисунок 5 Установка opencv

Была произведена попытка установить Teano, однако она застопорилась при установке CUDA. В связи с непрозрачностью установки отладка представлялась сложной, и было принято решение отложить Teano в сторону до поры.

Наконец, была установлена caffe. Этот процесс включил в себя:

загрузку исходного кода (т.е. решения Visual Studio 2013) из репозитория (https://github.com/BVLC/caffe/tree/windows);

установку предварительно необходимого ПО:

CUDA, доступную по адресу https://developer.nvidia.com/cuda-toolkit;

cuDNN 4, доступный при регистрации в «Accelerated Computing Developer Program» NVIDIA Corporation;

python-модуля protobuf, т.е. библиотеки Protocol Buffers, разрабатываемой Гуглом (Google Inc., 2008), которую caffe использует для сериализации-десериализации моделей;

установку Microsoft Visual Studio 2013, необходимой для сборки решения в рабочее приложение;

установку параметров сборки:

CuDnnPath -- местонахождение установленного cuDNN

PythonSupport = true для сборки python-пакета;

собственно сборку.

При установке и использовании caffe были обнаружены (и, по возможности, решены) следующие проблемы:

Неудавшаяся первая сборка в связи с недоступностью файлов подгружаемых пакетов Visual Studio. Решено пересборкой.

Неудавшаяся сборка библиотеки libcaffe в связи с недоступностью файла настроек CUDA (CUDA 7.5.props). Проблема вызвана смешением настроек и установок Студий разных версий; решена переносом файла настроек (и сопутствующих) в корректный путь.

Фатальная ошибка при попытке инициализации сети: cudnn_conv_layer.cpp:53] Check failed: status == CUDNN_STATUS_SUCCESS (6 vs. 0) CUDNN_STATUS_ARCH_MISMATCH. Вызвана тем, что cuDNN требует CUDA Compute Capability 3.0 или выше, в то время как имеющеяся видеокарта обеспечивает лишь 2.1. Решено отключением поддержки cuDNN и пересборкой.

Разнообразные фатальные ошибки при попытке инициализации сети, вызванные, опять же, низкой версией CUDA Compute Capability. Попытки корректно выставить параметр CudaArchitecture к успеху не привели: перестала собираться libcaffe, из-за невразумительной ошибки компилятора nvcc, не принимающего заведомо корректные значения вышеупомянутого параметра. Решено установкой CudaArchitecture в ничто, т.е. переход к настройкам по умолчанию. Это решение было бы неэффективно на более качественных видеокартах, т.к. оно бы урезало доступный функционал и снизило бы эффективность подсчётов на графических ядрах, однако при Compute Capability 2.1 эффект должен быть незначительным.

Фатальная ошибка при работе с сетями: syncedmem.cpp:58] Check failed: error == cudaSuccess (2 vs. 0) out of memory. Её причиной действительно является недостаток памяти, но не оперативной, а графической. Проблема решена частично отключением прочих приложений; практически полностью -- приобретением новой видеокарты с 4ГБ памяти. Стоит отметить, что подобная ошибка может возникать на любых доступных объёмах памяти в зависимости от размера и количества обрабатываемых сетей. В связи с этим модели видеокарт с высшими характеристиками, в том числе специализированные для расчётов с помощью caffe, Teano и прочих подобных пакетов, могут иметь и 16ГБ памяти, однако подобные суперкомпьютерные решения стоят от тысяч долларов вверх, и находятся далеко за пределами данного исследования.

2.2 Цели и метрики

Естественная цель. потенциально достижимая с помощью тренировки моделей машинного обучения -- это создание автоматической системы расстановки тегов, способной по изображению (и набору возможных тегов) определять, каким тегам изображение соответствует, а каким -- нет. Эта цель даёт понимание того, какие компоненты набора данных следует считать тренировочными переменными, кодирующими ключевую информацию об объекте, а какие -- целевыми, кодирующими искомые признаки. Именно, в качестве первых можно взять пиксельное представление изображения; вторыми же будет являться (одна на тег) бинарная переменная наличия тега.

Было рассмотрено нсколько распространённых метрик качества модели, в частности:

«Точность классификации» : доля корректно предсказанных значений одной целевой переменной

Logloss:

Эта метрика используется для задач предсказания булевой переменной, где предсказывающий алгоритм должен выдать вероятность истинности переменной . Она жестоко наказывает «слишком уверенные» ошибки: вероятность истиннойтси 1 при действительной ложности переменной приводит к бесконечной ошибке.

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

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

Во имя простоты реализации была выбрана первая метрика.

Глава 3. Практическая реализация. Эксперименты

Практическая часть данной работы была выполнена в двух этапах. Цель первого этапа состояла в наиболее простом прохождении всех этапов разработки и построении «минимального рабочего продукта», который, при должных доработке и масштабировании, способен исполнить поставленную задачу. Для этого на первом этапе используются следующие инструменты:

DanbooruDownloader для загрузки изображений и фрагментов метаданных;

PIL/pillow для предобработки;

различные простые классификаторы из библиотеки scikit-learn.

Этап 1: минимальный рабочий продукт

Выгрузка данных

Для первых экспериментов на малых объёмах данных в DanbooruDownloader было создано несколько и исполнено несколько пакетных загрузок. Большая часть из них содержала «случайные» изображения (появившиеся в датасете в конкретный день), но некоторые имели цель создать специфические срезы датасета, к примеру, содержащие большое количество изображений, обладающих специфическими тегами:

Рисунок 6 Окно пакетных загрузок DanbooruDownloader

Скорость загрузки составляла от 0.5 до 2 изображений в секунду; всего для первой серии экспериментов было выгружено около 25000 изображений.

Предобработка

Для приведения данных к однородному формату, над изображениями были проделаны следующие операции:

Каждое изображение было дополнено от размера 150ЧX или XЧ150 до 150Ч150 с использованием симметричной чёрной рамки.

Для уменьшения пространства параметров изображения были приведены к оттенкам серого;

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

Эксперименты

Первая серия экспериментов ставила целью оценку эффективности простых методиком анализа на популярном теге. В следующих таблицах приведены результаты. Каждая таблица предваряется методом классификации и его параметрами; Столбцами таблицы являются:

score: успешность тренировки по выбранной (стандартной) метрике;

time: время, затраченное на тренировку, в секундах;

n: количество изображений в подвыборке;

speed: скорость тренировки, в секундах на миллион изображений.

Таблица 1 Результаты тренировки первой серии (1)

Random Forest, n_estimators=5

Random Forest, n_estimators=20

score

time

n

speed

score

time

n

speed

0,45

0,041

100

410,00

0,5

0,149

100

1489,999

0,625

0,065

200

325,00

0,575

0,215

200

1075

0,591667

0,071

300

236,67

0,641667

0,243

300

810,0001

0,6

0,099

400

247,50

0,65

0,38

400

950,0003

0,555

0,151

500

302,00

0,63

0,495

500

989,9998

0,6375

0,175

600

291,67

0,7125

0,817

600

1361,667

0,657143

0,213

700

304,29

0,689286

0,66

700

942,8573

0,634375

0,243

800

303,75

0,659375

0,765

800

956,2501

0,661111

0,273

900

303,33

0,666667

0,893

900

992,2221

0,63

0,267

1000

267,00

0,69

0,955

1000

954,9999

0,66875

0,767

2000

383,50

0,67

2,411

2000

1205,5

0,655

1,579

4000

394,75

0,689375

6,391

4000

1597,75

Таблица 2 Результаты тренировки первой серии (2)

Random Forest, n_estimators=100

Random Forest, n_estimators=200

score

time

n

speed

score

time

n

speed

0,525

0,533

100

5330

0,6

1,307

100

13070

0,5625

0,96

200

4799,999

0,5625

1,993

200

9965

0,616667

1,726

300

5753,333

0,658333

2,724

300

9080

0,65625

1,903

400

4757,5

0,6625

3,48

400

8700

0,63

2,299

500

4598

0,62

4,871

500

9742

0,683333

2,541

600

4235

0,683333

6,245

600

10408,33

0,714286

3,422

700

4888,571

0,735714

7,376

700

10537,14

0,66875

4,229

800

5286,25

0,665625

9,166

800

11457,5

0,722222

4,705

900

5227,778

0,694444

9,232

900

10257,78

0,7025

4,614

1000

4614

0,7125

9,16

1000

9160

0,701667

8,235

1500

5490

0,693333

14,751

1500

9834

0,72

12,66

2000

6330

0,72875

25,235

2000

12617,5

0,698

15,508

2500

6203,2

0,703

29,976

2500

11990,4

0,700833

18,673

3000

6224,333

0,705833

38,703

3000

12901

0,713571

22,785

3500

6510

0,707857

51,98

3500

14851,43

0,71375

27,382

4000

6845,5

0,706875

57,134

4000

14283,5

Support Vector Classification, kernel=linear

Naive Bayes

score

time

n

speed

score

time

n

speed

0,675

0,18

100

1800,001

0,725

0,065

100

649,9982

0,6375

0,503

200

2514,999

0,55

0,094

200

469,9993

0,608333

1,112

300

3706,667

0,591667

0,157

300

523,3335

0,6375

2,248

400

5620

0,6

0,165

400

412,4999

0,605

3,223

500

6446

0,58

0,248

500

495,9998

0,620833

5,44

600

9066,667

0,583333

0,274

600

456,6665

0,664286

7,292

700

10417,14

0,6

0,282

700

402,8572

0,6625

9,447

800

11808,75

0,54375

0,32

800

399,9999

0,652778

11,955

900

13283,33

0,577778

0,411

900

456,6667

0,63

15,331

1000

15331

0,5775

0,414

1000

414

0,63

31,011

1500

20674

0,595

0,67

1500

446,6667

0,6575

52,544

2000

26272

0,63

0,866

2000

433

0,632

82,692

2500

33076,8

0,609

1,164

2500

465,5999

0,635833

134,867

3000

44955,67

0,635833

1,418

3000

472,6667

0,621429

194,822

3500

55663,43

0,616429

1,607

3500

459,1428

0,618125

1,947

4000

486,75

На основе полученных результатов можно сделать несколько (по большей части очевидных) выводов.

Random Forest и Naive Bayes -- методы алгоритмической сложности O(n), и их масштабирование не составит труда. Support Vector Classification, однако, квадратичен по скорости, и его применимость на выборках размером в миллионы сомнительна. Конечно, это уже известно из алгоритмической реализации этих методов, однако практическая демонстрация куда нагляднее абстрактного знания.

Ни один из использованных методом не обнаружил способности эффективно классифицировать выбранный тег: в действитепльности, единственный классификатор, чья оценка превзошла долю изображений с тегом в выборке (~0,68) -- это Random Forest, но и он ушёл от этого фундамента весьма недалеко.

Вторая серия экспериментов имела цель проверить эффективность простых методов классификации на тегах, потенциально простых к определению. Использовались следующие выборки и теги: monochromeЧ1000+non-monochromeЧ1000:

Таблица 3 Результаты тренировки второй серии (1)

monochrome/non-monochrome

Support Vector Classification, kernel='linear'

Support Vector Classification, kernel='rbf'

score

time

n

speed

score

time

n

speed

0,775

0,159

100

1589,999

0,725

0,188

100

1880

0,755

2,751

500

5502

0,84

4,206

500

8412

0,795

10,103

1000

10103

0,8375

17,621

1000

17621

0,851667

15,695

1500

10463,33

0,883333

38,878

1500

25918,67

0,882353

21,392

1996

10717,43

0,908636

51,405

1996

25754,01

Random Forest, n_estimators=100

Random Forest, n_estimators=200

score

time

n

speed

score

time

n

speed

0,775

0,434

100

4340

0,7

0,949

100

9489,999

0,8

0,61

200

3050,001

0,7625

1,425

200

7125,001

0,825

1,126

300

3753,333

0,791667

1,852

300

6173,333

0,80625

1,212

400

3030

0,84375

2,409

400

6022,5

0,83

1,423

500

2846

0,83

2,934

500

5868

0,8

1,812

600

3020

0,795833

3,623

600

6038,334

0,810714

2,167

700

3095,714

0,814286

4,308

700

6154,285

0,796875

2,264

800

2830

0,815625

4,897

800

6121,25

0,805556

3,133

900

3481,111

0,802778

5,345

900

5938,889

0,8375

3,726

1000

3726

0,8425

7,191

1000

7191

0,885

6,532

1500

4354,667

0,89

13,688

1500

9125,333

0,908636

9,344

1996

4681,363

0,909887

17,028

1996

8531,062

blueЧ1000+randomЧ5000:

Таблица 4 Результаты тренировки второй серии (2)

blue+random

Naive Bayes

Random Forest, n_estimators=100

score

time

n

speed

score

time

n

speed

1

0,051

100

510,0012

0,833333

1,912

300

6373,333

1

0,1

200

499,9995

0,628571

4,231

700

6044,286

0,225

0,146

300

486,6664

0,6175

5,889

1000

5889

0,46875

0,186

400

465,0003

0,671667

10,024

1500

6682,667

0,505

0,236

500

472,0001

0,66375

19,536

2000

9768

0,516667

0,268

600

446,6665

0,6875

24,254

3000

8084,667

0,5

0,343

700

489,9999

0,69

30,691

4000

7672,75

0,5375

0,521

800

651,2499

0,686

41,446

5000

8289,2

0,527778

0,436

900

484,4446

0,5375

0,56

1000

559,9999

Support Vector Classification, kernel='linear'

0,505

0,937

1500

624,6667

score

time

n

speed

0,47375

0,923

2000

461,5

1

0,041

100

409,9989

0,551

1,331

2500

532,4

0,575

5,04

500

10080

0,535

1,968

3000

656,0001

0,5625

18,879

1000

18879

0,547143

1,67

3500

477,1429

0,573333

38,069

1500

25379,33

0,558125

2,008

4000

502

0,57375

65,693

2000

32846,5

0,499

2,299

5000

459,8

Выводы из этих данных уже интереснее.

Подтвердилась гипотеза о возможности эффективной классификации тега monochrome. Интересно также то, что это возможно в том числе после приведения изображений к серой палитре.

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

Вычислительная сложность Support Vector Classification с параметром kernel='rbf' растёт ещё быстрее, чем с kernel='linear'.

Этап 2: масштаб и нейронные сети.

Целями второго этапа были:

масштабирование и улучшение качества выгрузки данных;

переход к использованию нейронных сетей как инструмента анализа.

Выгрузка данных

Для более структурированной выгрузки, а также для загрузки всех метаданных изображений были написаны python-скрипты dan_json_down и dan_thumb_down.

Первый скрипт, проходясь в цикле по дням с первого дня работы использованного датасета по текущее время, запрашивал у удалённого сервера список изображений, загруженных в конкретный день, к каждому из них запрашивал JSON-представление метаданных, и записывал последнее в индивидуальные файлы по пути

При сетевых ошибках скрипт предпринимал несколько попыток повторной связи; при столкновении с ограничениями на количество запросов, выставленное сервером, замедлялся со стандартной частоты запросов в 1 секунду с экспоненциальным шагом в 1,5, вплоть до 7 минут паузы между запросами.

За неделю постоянной работы скрипт dan_json_down выполнил свою цель, сохранив все доступные метаданные на ~2 млн. изображений.

Второй скрипт, проходясь в том же цикле, но также ограниченный работой первого скрипта, извлекал из записанных файлов метаданные, фильтровал их по критерию цензурности, извлекал ссылки на уменьшенную копию изображения, запрашивал изображения у удалённого сервера и сохранял их на диск по пути .\Dan_json\%year%\%month%\%day%\%id%.jpg. При отсутствии или недоступности изображений скрипт немедленно переходил к следующему.

Скрипту dan_thumb_down потребовалась неделя на то, чтобы выгрузить ~250 тыс. изображений, отфильтровав столько же, т.е. на полную обработку датасета ему бы потребовался месяц. В процессе анализа скрипт продолжал работу, однако полученных к этому времени результатов было более чем достаточно для второго этапа экспериментов.

2.3 Предобработка

Для представления полученных данных в формате, потребном caffe, был написан скрипт dan_class_tagging. Его цель состояла в том, чтобы, последовательно проходясь по выгруженным изображениям, извлекать из метаданных изображения строку тегов, проверять наличие в ней каждого из заданной группы взаимоисключающих тегов, соотносить изображению числовой класс в зависимости от наличия, и записывать путь к изображению вместе с назначенным классом в файл с тренировочной или же проверочной выборкой. Результирующие файлы носили имена .\logs\%tag_group%_%size%_test.txt и .\logs\%tag_group%_%size%_train.txt, где % tag_group% -- название группы тегов, %size% -- размер размеченной подвыборки.

Были использованы следующие группы тегов:

"boys": ["1boy", "2boys", "3boys", "4boys", "5boys", "6+boys"],

"girls": ["1girl", "2girls", "3girls", "4girls", "5girls", "6+girls"],

"solo_hair_color": ["black_hair", "blonde_hair", "blue_hair", "brown_hair", "green_hair", "pink_hair", "purple_hair", "red_hair", "silver_hair"].

При создании подвыборок по последней группе также проводилась фильтрация: среди тегов изображения должен был присутствовать тег "solo".

Перед обработкой собственно нейронной сетью, изображения подвергались следующий преобразованиям: каждое приводилось к размеру 256Ч256 методом растяжения, и из каждого вычиталось условное среднее, посчитанное на стандартном датасете сети архитектуры CaffeNet.

Эксперименты

Для проведения экспериментов был адаптирован IPython Notebook (набор скриптов) 02-fine-tuning, прилагающийся к дистрибутиву caffe. В результирующем скрипте производятся следующие действия:

загрузка данных и их предобработка;

конструирование нейронной сети архитектуры CaffeNet,её инициализация в двух вариантах:параметрами, претренированными на ином датасете, и случайным набором весов;

дотренировка верхних слоёв обеих сетей на сгенерированном выше датасете, вывод результатов и статистики тренировки;

дотренировка всех слоёв обеих сетей, вывод результатов и статистики тренировки.

Тренировка сетей производилась методом СГС -- стохастического градиентного спуска -- со следующими параметрами:

число итераций в одном шаге тренировки: 100000;

скорость обучения: 0,001, с умножением на 0,1 каждые 20000 итераций;

импульс: 0,9

weight_decay = 0,0005

Ниже указаны подвыборки, на которых производилась тренировка сетей, и представлены графики их предсказательной точности (синим -- претренированной сети, зелёным -- иниициализированной случайными параметрами) в зависимости от итерации тренировки (всех слоёв), а также их пиковая точность.

tag_group = "girls", size = 3000:

Пиковая точность: pretrained: 82%; scratch: 86%.

tag_group = "girls", size = 30000:

Пиковая точность: pretrained: 88%; scratch: 88%.

tag_group = "boys", size = 3000:

Пиковая точность: pretrained: 96%; scratch: 98%.

tag_group = "boys", size = 30000:

Пиковая точность: pretrained: 98%; scratch: 98%.

tag_group = "solo_hair_color", size = 30000:

Пиковая точность: pretrained: 58%; scratch: 64%.

Из полученных результатов можно сделать следующие выводы:

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

На малых объёмах данных выбранный метод тренировки сети попадает в цикл, проходясь по приблизительно одним и тем же состояниям сети каждые 50 итераций. (На более крупных подвыборках эта проблема выражена меньше, но всё равно присутствует.)

Выбранный метод тренировки, работая на анализируемом датасете, не остаётся в локальных максимумах

Заключение

По результатам практической части были достигнуты следующие цели.

Был успешно выгружен весь объём метаданных изображений, предоставленный источником.

Была выгружена заметная часть (>40%) изображений, однако в уменьшенных версиях.

Был приобретён обширный опыт установки ПО, использующегося для анализа данных;

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

Были предприняты попытки установки ПО для решения вычислительных задач на машинном кластере, однако в связи со значительным увеличением потребления вычислительных ресурсов и отсутствием собственно кластера это направление было оставлено в пользу получения наглядных результатов.

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

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

исследование поведения сети и траекторий её обучения при изменении параметров обучения;

исследование других архитектур нейронных сетей;

модификация стандартных архитектур для лучшего соответствия природе датасета;

использование различных методик преобработки изображений;

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

Также в процедуры сбора данных можно внести ряд технических улучшений:

перейти от хранения метаданных изображений в файловой системе к хранению в базе/хранилище данных;

настроить автоматическую (и эффективную) актуализацию метаданных;

извлечь и использовать в анализе дополнительные данные, предоставляемые источником, как-то:

историю изменения тегов;

комментарий художника, при наличии;

комментарии пользователей.

Список литературы

1. Berkeley Vision and Learning Center. (б.д.). Получено из https://github.com/BVLC/caffe/tree/windows

2. Continuum Analytics. (2015). Conda. Получено из Conda documentation: http://conda.pydata.org/docs/

3. Dieleman, S. (17 March 2015 r.). Classifying plankton with deep neural networks. Получено из Sander Dieleman's blog: http://benanne.github.io/2015/03/17/plankton.html

4. Google Inc. (2008). Получено 2016, из https://github.com/google/protobuf

5. Graham, B. (2015). Kaggle Diabetic Retinopathy Detection competition report. University of Warwick, Department of Statistics and Centre for Complexity Science.

6. Haiying Li, A. C. (2014). Comparison of Google Translation with Human Translation. Proceedings of the Twenty-Seventh International Florida Artificial Intelligence Research Society Conference (pp. 190-195). Pensacola Beach, Florida: The AAAI Press, Palo Alto, California.

7. Jia, Y. (2016). Получено из http://caffe.berkeleyvision.org/

8. Kaggle Inc. (14 December 2015 r.). Second Annual Data Science Bowl. Получено 10 March 2016 r., из Kaggle: https://www.kaggle.com/c/second-annual-data-science-bowl

9. Kaggle Inc. (2016). Получено из https://www.kaggle.com/c/shelter-animal-outcomes/details/evaluation

10. Kaggle Inc. (2016). Получено из https://www.kaggle.com/wiki/AreaUnderCurve

11. Kaggle Inc. (б.д.). Kaggle competitions. Получено из Kaggle project Web site: https://www.kaggle.com/competitions

12. LISA lab. (2016). Получено из http://deeplearning.net/software/theano/

13. Madrigal, A. C. (2012). The Perfect Milk Machine: How Big Data Transformed the Dairy Industry. The Atlantic .

14. Nandaka. (2016). Получено из https://github.com/Nandaka/DanbooruDownloader

15. w:Big data. (б.д.). Big data. Получено 10 March 2016 r., из Wikipedia: https://en.wikipedia.org/wiki/Big_data#Definition

Приложение 1

Исходный код

Скрипт выгрузки метаданных

import requests

import time

import os

import json

import shutil

def ensure_dir(f):

d = os.path.dirname(f)

if not os.path.exists(d):

os.makedirs(d)

# Danbooru starts at 2005-05-24.

# This is updated wherever script is stopped.

current_epoch = time.mktime(time.strptime('2010-01-30 12:00:00', '%Y-%m-%d %H:%M:%S'))

shifting_time = current_epoch

while shifting_time + 3600*24*2 < time.time():

time_tuple = time.localtime(shifting_time)

time_string = time.strftime("%Y-%m-%d", time_tuple)

# Download pages here

# Apparently, https works out of the box with github, but not as easily with Danbooru.

# Ahh, it's probably a blocking problem; solved with proxy, but I just won't bother.

# r = requests.get('http://api.github.com/events')

date = time_string

page = 1

day_json = []

pause_interval = 1

retry_count = 5

start_time = time.time()

destination_fs = "base-win"

if destination_fs == "base-win":

base_json_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_json\\"

day_json_dir = base_json_dir + date[0:4] + "\\" + date[5:7] + "\\" + date[8:10] + "\\" # YYYY\mm\dd

base_thumb_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_thumb\\"

day_thumb_dir = base_thumb_dir + date[0:4] + "\\" + date[5:7] + "\\" + date[8:10] + "\\" # YYYY\mm\dd

if not os.path.exists(day_thumb_dir):

os.makedirs(day_thumb_dir)

day_file_list = os.listdir(day_json_dir)

#print(day_file_list)

elif destination_fs == "hdfs":

{}

for filename_json in day_file_list:

# To get a thumb:

# loop for days:

# loop for pics per day:

# get "preview_file_url": "/data/preview/5028440e4060560f450eb712921968ef.jpg",

# requests.get()

with open(day_json_dir + filename_json) as data_file:

post_json = json.load(data_file)

filename_thumb = day_thumb_dir + str(post_json['id']) + ".jpg"

if os.path.isfile(filename_thumb):

print(str(post_json['id']) + " is already here, skipping.")

continue;

if not post_json['rating'] in ['s', 'safe']:

continue

try:

thumb_suburl = post_json['preview_file_url']

except KeyError as e:

print("No thumb for " + str(post_json['id']) + ", skipping.")

continue

try:

r = requests.get('http://donmai.us/' + thumb_suburl, stream=True)

except Exception as e:

print("Exception, temporarily skipping " + str(post_json['id']))

if r.status_code in [421, 500, 503]:

# Either we're throttled, or Danbooru is down with 500ths. Let's slow down a bit.

if pause_interval < 300:

pause_interval *= 1.5

print("Status code: " + str(r.status_code) + " . Pausing for " + str(pause_interval) + " sec.")

time.sleep(pause_interval)

continue

else:

pause_interval = 1

if r.status_code in [200, 204]:

# Nothing to do here, moving along.

with open(filename_thumb, 'wb') as f:

r.raw.decode_content = True

shutil.copyfileobj(r.raw, f)

elif r.status_code in [403, 404, 424]:

# I dont'know if this could happen with thumbs. Oh well.

print("Status code: " + str(r.status_code) + " . Pausing for " + str(pause_interval) + " sec and retrying." )

if retry_count > 0:

retry_count -= 1

time.sleep(pause_interval)

continue

else:

retry_count = 5

elif r.status_code in [420, 422, 423]:

# This really shouldn't happen: we're just reading jsons, not trying to alter the posts.

{}

else:

# WTF?

print("Something broke!", r.status_code, r.text)

break

time_spent = time.time() - start_time

#print(time_spent, page, date)

if time_spent<1:

time.sleep(1-time_spent)

shifting_time += 3600*24

time_spent = time.time() - start_time

print(time_spent, len(day_file_list), date)

Скрипт выгрузки изображений

import requests

import time

import os

import json

def ensure_dir(f):

d = os.path.dirname(f)

if not os.path.exists(d):

os.makedirs(d)

# Danbooru starts at 2005-05-24.

# This is updated wherever script is stopped.

current_epoch = time.mktime(time.strptime('2016-05-12 12:00:00', '%Y-%m-%d %H:%M:%S'))

shifting_time = current_epoch

while shifting_time + 3600*24*2 < time.time():

time_tuple = time.localtime(shifting_time)

time_string = time.strftime("%Y-%m-%d", time_tuple)

# Download pages here

# Apparently, https works out of the box with github, but not as easily with Danbooru.

# Ahh, it's probably a blocking problem; solved with proxy, but I just won't bother.

# r = requests.get('http://api.github.com/events')

date = time_string

page = 1

day_json = []

pause_interval = 1

retry_count = 5

start_time = time.time()

while True:

payload = {'tags' : "date:"+date, 'limit' : 100, 'page' : page}

r = requests.get('http://donmai.us/posts.json', params = payload)

if r.status_code in [421, 500, 503]:

# Either we're throttled, or Danbooru is down with 500ths. Let's slow down a bit.

if pause_interval < 300:

pause_interval *= 1.5

print("Status code: " + str(r.status_code) + " . Pausing for " + str(pause_interval) + " sec.")

time.sleep(pause_interval)

continue

else:

pause_interval = 1

if r.status_code in [200, 204]:

# Nothing to do here, moving along.

page_json = r.json()

if page_json == []:

break

else:

day_json += page_json

page += 1

elif r.status_code in [403, 404, 424]:

# This shouldn't really happen: posts.json is always available and ignores malformed parameters.

if retry_count > 0:

retry_count -= 1

continue

else:

retry_count = 5

elif r.status_code in [420, 422, 423]:

# This really shouldn't happen: we're just reading jsons, not trying to alter the posts.

{}

else:

# WTF?

print("Something broke!", r.status_code, r.text)

break

time_spent = time.time() - start_time

#print(time_spent, page, date)

if time_spent<1:

time.sleep(1-time_spent)

# Create an hdfs/win file with appropriate content here

destination_fs = "base-win"

if destination_fs == "base-win":

base_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_json\\"

day_dir = base_dir + date[0:4] + "\\" + date[5:7] + "\\" + date[8:10] + "\\" # YYYY\mm\dd

if not os.path.exists(day_dir):

os.makedirs(day_dir)

for post_json in day_json:

filename = day_dir + str(post_json['id']) + ".json"

with open(filename, 'w') as outfile:

json.dump(post_json, outfile)

elif destination_fs == "hdfs":

# Not implemented yet

{}

shifting_time += 3600*24

time_spent = time.time() - start_time

print(time_spent, len(day_json), date)

Скрипт предварительной обработки изображений

import os

import time

import json

class GetOutOfLoop( Exception ):

pass

base_thumb_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_thumb\\"

base_json_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_json\\"

last_processed = [2007, 10, 29, 150000] # Update as it falls

start_after = last_processed

print("Starting from: ", start_after)

count_limit = 30000

output_period = 1000

years = os.listdir(base_thumb_dir)

year_dirs = [base_thumb_dir + y + "\\" for y in years]

image_count=0

base_log_path = "C:\\temp\\work\\HSE\\Diploma\\logs\\"

tag_lists = {"boys": ["1boy", "2boys", "3boys", "4boys", "5boys", "6+boys"],

"girls": ["1girl", "2girls", "3girls", "4girls", "5girls", "6+girls"],

"solo_hair_color": {0:"black_hair",

1:"blonde_hair",

2:"blue_hair",

3:"brown_hair",

4:"green_hair",

5:"pink_hair",

6:"purple_hair",

7:"red_hair",

8:"silver_ha...


Подобные документы

  • Программная и техническая характеристика информационных систем предприятия. Требования к информационной и программной совместимости. Проектирование программного обеспечения с использованием специализированных программных пакетов. Разработка базы данных.

    отчет по практике [1,3 M], добавлен 11.04.2019

  • Понятие информационной системы и баз данных. Критерии классификации автоматизированных информационных систем. Примеры простых и сложных запросов. Характеристика и анализ возможностей справочно-правовых систем "Кодекс", "Консультант Плюс", "Гарант".

    курсовая работа [40,3 K], добавлен 16.05.2017

  • Разработка системы автоматизации для работы инженеров, бухгалтера, менеджера для предприятия, работающего в сфере торговли и обслуживания платформ многоканальной звукозаписи. Требования к функциональным характеристикам базы данных в MS Access.

    курсовая работа [774,3 K], добавлен 23.01.2013

  • Создание системы предобработки данных; разработка системы классификации на базе методов и алгоритмов машинного обучения, их реализация в программной системе. Предобработка информации, инструкция пользователя, система классификации, машинный эксперимент.

    дипломная работа [917,1 K], добавлен 31.01.2015

  • Изучение принципа работы интернет-аукциона (на примере сайта molotok.ru). Способ получения информации с веб-ресурсов. Разработка программного обеспечения с целью создания исходных данных для обучения нейронных сетей и классификации товаров с их помощью.

    дипломная работа [2,0 M], добавлен 29.06.2012

  • Описание систем управления процессами маршрутизации пакетов, передаваемых через компьютерную сеть. Изучение методов теории выбора кратчайших путей. Разработка программы маршрутизации данных и определение кратчайших путей их маршрутов методом Дейкстры.

    курсовая работа [495,7 K], добавлен 24.06.2013

  • Роль классификации документов в решении задач информационного поиска. Методы автоматической классификации документов и этапы построения классифицирующей системы: индексация документа, построение классификаторов на базе обучающих данных, оценка их работы.

    курсовая работа [354,2 K], добавлен 13.01.2013

  • Описание функций, задач, выявление проблем в деятельности веломастерской. Обоснование выбора использования системы управления базами данных Access. Создание таблиц, запросов, форм, отчетов и простых макросов. Упрощения использования созданной базой.

    курсовая работа [930,8 K], добавлен 05.05.2015

  • Методы исследования устойчивости нелинейной следящей системы. Разработка алгоритмического и программного обеспечения автоматизированной системы с использованием инструментальных средств ПЭВМ. Проверка эффективности проекта путем сравнения результатов.

    дипломная работа [568,7 K], добавлен 30.04.2011

  • Изучение методов и этапов создания структурированной базы данных в Microsoft Access, позволяющей автоматизировать процесс подбора читателем необходимого программного продукта по заданным характеристикам. Разработка интерфейса базы данных. Реализация ИС.

    курсовая работа [2,6 M], добавлен 13.08.2010

  • Характеристика системы управления базами данных. Принципы классификации СУБД. NoSQL как ряд подходов, проектов, направленных на реализацию моделей баз данных. Методологические обоснования подхода NoSQL. Описание некоторых СУБД из данного движения.

    реферат [18,1 K], добавлен 06.10.2011

  • Анализ методов и средств выявления мнений пользователей социальных сетей. Обзор средств мониторинга и анализа, подбор необходимого программного обеспечения и технических средств. Разработка архитектуры базы данных, реализация программных модулей.

    дипломная работа [3,7 M], добавлен 19.01.2017

  • Обработка данных, возможность коллективного использования ресурсов и оборудования. Централизованное хранение данных. Основы работы настольных СУБД. Наиболее популярные настольные СУБД. Актуальность использования, направления и перспективы развития.

    курсовая работа [361,4 K], добавлен 09.11.2008

  • Построение логической и физической структуры базы данных. Сценарии вариантов использования: вход и выход из системы, обновление меню и списка официантов, регистрация и проверка выполнения заказа. Расчёт стоимости и эффективность внедрения программы.

    курсовая работа [1,3 M], добавлен 21.09.2015

  • Изучение и разработка алгоритмов сверления. Выбор языка и среды программирования. Исследование структуры системы компьютерного моделирования. Ввод данных о материале инструмента и детали, методе обработки. Визуальная проверка и корректировка данных.

    отчет по практике [295,9 K], добавлен 22.05.2013

  • Выбор состава технических и программных средств разработки системы. Описание входных и выходных данных. Выбор модели базы данных. Разработка подсистемы наполнения базы данных, формирования отчетов. Разработка интерфейса пользователя, тестирование системы.

    курсовая работа [3,7 M], добавлен 04.12.2014

  • Анализ методов оценки надежности программных средств на всех этапах жизненного цикла, их классификация и типы, предъявляемые требования. Мультиверсионное программное обеспечение. Современные модели и алгоритмы анализа надежности программных средств.

    дипломная работа [280,5 K], добавлен 03.11.2013

  • Обзор программных средств разработки приложений и обоснование выбора языка программирования. Классификация приложений для работы с базами данных. Функциональная структура базы данных с указанием назначения программных модулей, руководство пользователя.

    дипломная работа [645,3 K], добавлен 21.11.2010

  • Анализ информационных потоков. Разработка структуры таблиц базы данных. Выбор CASE-средства для проектирования информационной системы и среды программирования. Разработка программных модулей (программного обеспечения). Подготовка справочных баз данных.

    дипломная работа [6,8 M], добавлен 19.11.2013

  • Разработка программных продуктов на языке программирования Borland Delphi. Применяемые таблицы и связи между ними. Пользовательский интерфейс работы с базой данных. Алгоритм работы программы "Футбольные команды и игроки". Защита от ввода неверных данных.

    курсовая работа [788,1 K], добавлен 22.06.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.