Построение нейронной сети для визуализации многомерных данных в TensorFlow
Вложения слов и многомерные данные повсеместно используются во многих аспектах исследований глубокого обучения, таких как обработка естественного языка, построение систем рекомендаций. Google в последнее время открыл исходный код проекта встраивания, который работает как интерактивный инструмент совместной визуализации для визуализации многомерных данных. Встраивание работает как навигационная карта от точек до входов данных в евклидовом пространстве. Многие типы больших данных требуют визуализации графиков, нейронных сетей, написания сводок по параметрам весов, функций активации сигмоида и точности моделей машинного обучения.
В этом руководстве мы используем набор данных рукописных цифр MNIST. Более подробное объяснение механизма набора данных рукописных цифр MNIST можно найти на веб-сайте Яна Лекуна. По словам Янна Лекуна.
ФОРМАТ ФАЙЛА IDX
Формат файла IDX - это простой формат векторов и многомерных матриц различных числовых типов.
Базовый формат -
магическое число
размер в измерении 0
размер в измерении 1
размер в измерении 2
… ..
размер в измерении N
данные
Магическое число - это целое число (сначала MSB). Первые 2 байта всегда равны 0.
Третий байт кодирует тип данных:
0x08: байт без знака
0x09: байт со знаком
0x0B: короткий (2 байта)
0x0C: int (4 байта)
0x0D: float (4 байта)
0x0E: double (8 байтов)
4-й байт кодирует количество измерений вектора / матрицы: 1 для векторов, 2 для матриц….
Размеры в каждом измерении представляют собой 4-байтовые целые числа (сначала MSB, с прямым порядком байтов, как в большинстве процессоров сторонних производителей).
Данные хранятся как в массиве C, т.е. индекс в последнем измерении изменяется быстрее всего.
4-й байт кодирует количество измерений вектора / матрицы: 1 для векторов, 2 для матриц….
Размеры в каждом измерении представляют собой 4-байтовые целые числа (сначала MSB, с прямым порядком байтов, как в большинстве процессоров сторонних производителей).
Данные хранятся как в массиве C, то есть индекс в последнем измерении изменяется быстрее всего ».
Несколько фреймворков глубокого обучения измерили тесты с использованием рукописных цифр MNIST. Набор данных MNIST легко доступен для платформы TensorFlow. TensorFlow представляет данные в виде тензоров на графике. Тензоры в большинстве случаев являются представителями данных большой размерности. Набор данных MNIST имеет размеры около Z784. В мире, в котором мы живем, есть только пространство Z3. Следовательно, визуализация данных в 784 измерениях для человеческого глаза - непростая задача. Следовательно, различные методы, такие как анализ основных компонентов или t-распределенное стохастическое соседнее встраивание (t-SN3), могут быть адаптированы для уменьшения проклятия размерности, уменьшения размеров и визуализации данных в пространстве меньшей размерности, интерпретируемом человеческим глазом.
Создание нейронной сети для визуализации тензоров активации скрытого слоя возможно с помощью встроенного проектора TensorBoard. Для этого будут импортированы библиотеки numpy, matplotlib.
Входные данные для этого примера будут взяты из набора рукописных цифр MNIST.
Извлечение MNIST_data / train-images-idx3-ubyte.gz
Извлечение MNIST_data / train-labels-idx1-ubyte.gz
Извлечение MNIST_data / t10k-images-idx3-ubyte.gz
Извлечение MNIST_data / t10k-labels-idx1-ubyte.gz
Размер:
- Учебный набор: 55000
- Набор тестов: 10000
- Набор для валидации: 5000
Гиперпараметры будут указываться извне как постоянные параметры, поскольку они не узнаются нейронными сетями.
Здесь необходимо построить граф, но необходимо определить полностью сверточную нейронную сеть или FC Layer (LeNet) вместе с весами и переменными смещения.
Поскольку вспомогательные функции были активированы, теперь можно создать график:
Сеанс интерактивного графа будет запущен в записной книжке Jupyter после выполнения следующего кода:
После выполнения кода отображается точность обучения нейронной сети.
Training epoch: 1 iter 0: Loss=2.28, Training Accuracy=37.0% iter 100: Loss=0.45, Training Accuracy=85.0% iter 200: Loss=0.21, Training Accuracy=95.0% iter 300: Loss=0.34, Training Accuracy=89.0% iter 400: Loss=0.29, Training Accuracy=90.0% iter 500: Loss=0.18, Training Accuracy=97.0% --------------------------------------------------------- Epoch: 1, validation loss: 0.21, validation accuracy: 94.1% --------------------------------------------------------- Training epoch: 2 iter 0: Loss=0.14, Training Accuracy=97.0% iter 100: Loss=0.19, Training Accuracy=94.0% iter 200: Loss=0.11, Training Accuracy=95.0% iter 300: Loss=0.06, Training Accuracy=99.0% iter 400: Loss=0.08, Training Accuracy=96.0% iter 500: Loss=0.12, Training Accuracy=97.0% --------------------------------------------------------- Epoch: 2, validation loss: 0.14, validation accuracy: 96.0% --------------------------------------------------------- Training epoch: 3 iter 0: Loss=0.16, Training Accuracy=96.0% iter 100: Loss=0.15, Training Accuracy=96.0% iter 200: Loss=0.08, Training Accuracy=97.0% iter 300: Loss=0.11, Training Accuracy=94.0% iter 400: Loss=0.10, Training Accuracy=96.0% iter 500: Loss=0.09, Training Accuracy=97.0% --------------------------------------------------------- Epoch: 3, validation loss: 0.11, validation accuracy: 96.7% --------------------------------------------------------- Training epoch: 4 iter 0: Loss=0.03, Training Accuracy=100.0% iter 100: Loss=0.04, Training Accuracy=99.0% iter 200: Loss=0.11, Training Accuracy=94.0% iter 300: Loss=0.05, Training Accuracy=98.0% iter 400: Loss=0.11, Training Accuracy=97.0% iter 500: Loss=0.11, Training Accuracy=95.0% --------------------------------------------------------- Epoch: 4, validation loss: 0.09, validation accuracy: 97.2% --------------------------------------------------------- Training epoch: 5 iter 0: Loss=0.11, Training Accuracy=97.0% iter 100: Loss=0.04, Training Accuracy=98.0% iter 200: Loss=0.04, Training Accuracy=100.0% iter 300: Loss=0.02, Training Accuracy=100.0% iter 400: Loss=0.11, Training Accuracy=97.0% iter 500: Loss=0.04, Training Accuracy=99.0% --------------------------------------------------------- Epoch: 5, validation loss: 0.08, validation accuracy: 97.7% --------------------------------------------------------- Training epoch: 6 iter 0: Loss=0.04, Training Accuracy=100.0% iter 100: Loss=0.07, Training Accuracy=98.0% iter 200: Loss=0.08, Training Accuracy=98.0% iter 300: Loss=0.04, Training Accuracy=99.0% iter 400: Loss=0.04, Training Accuracy=99.0% iter 500: Loss=0.05, Training Accuracy=97.0% --------------------------------------------------------- Epoch: 6, validation loss: 0.07, validation accuracy: 97.9% --------------------------------------------------------- Training epoch: 7 iter 0: Loss=0.04, Training Accuracy=99.0% iter 100: Loss=0.03, Training Accuracy=99.0% iter 200: Loss=0.07, Training Accuracy=99.0% iter 300: Loss=0.06, Training Accuracy=98.0% iter 400: Loss=0.13, Training Accuracy=96.0% iter 500: Loss=0.07, Training Accuracy=97.0% --------------------------------------------------------- Epoch: 7, validation loss: 0.07, validation accuracy: 97.8% --------------------------------------------------------- Training epoch: 8 iter 0: Loss=0.03, Training Accuracy=99.0% iter 100: Loss=0.01, Training Accuracy=100.0% iter 200: Loss=0.03, Training Accuracy=99.0% iter 300: Loss=0.02, Training Accuracy=100.0% iter 400: Loss=0.02, Training Accuracy=100.0% iter 500: Loss=0.05, Training Accuracy=98.0% --------------------------------------------------------- Epoch: 8, validation loss: 0.07, validation accuracy: 97.8% --------------------------------------------------------- Training epoch: 9 iter 0: Loss=0.04, Training Accuracy=99.0% iter 100: Loss=0.01, Training Accuracy=100.0% iter 200: Loss=0.07, Training Accuracy=98.0% iter 300: Loss=0.03, Training Accuracy=99.0% iter 400: Loss=0.03, Training Accuracy=99.0% iter 500: Loss=0.09, Training Accuracy=97.0% --------------------------------------------------------- Epoch: 9, validation loss: 0.07, validation accuracy: 97.9% --------------------------------------------------------- Training epoch: 10 iter 0: Loss=0.02, Training Accuracy=100.0% iter 100: Loss=0.03, Training Accuracy=100.0% iter 200: Loss=0.02, Training Accuracy=100.0% iter 300: Loss=0.02, Training Accuracy=100.0% iter 400: Loss=0.01, Training Accuracy=100.0% iter 500: Loss=0.01, Training Accuracy=100.0% --------------------------------------------------------- Epoch: 10, validation loss: 0.07, validation accuracy: 98.1% ---------------------------------------------------------
Учитывая, что набор данных содержит около 10 000 выборок, скрытый слой в нейронной сети насчитывает около 200 узлов. Выходные данные тензора имеют около 10 000 x 200 слоев.
Цель этого кода - визуализировать многомерные данные в низкоразмерном виде, чтобы сделать их интерпретируемыми человеческим глазом. Метаданные можно загрузить в metadata.tsv с TensorBoard, где может храниться индекс и метка для отдельных образцов. Этот файл необходимо добавить в конфигурацию встраивания точек. Файл.
Запуск сеанса в Jupyter Notebook оценит тензор для встраиваний и сохранит данные.
Я поделился кодом на GitHub на GPSingularity:
После выполнения сеанса его теперь можно визуализировать в TensorBoard с помощью следующей команды:
tensorboard –logdir = logs / embedding / –host localhost Данные будут отображаться в TensorBoard следующим образом. Результаты программы
Эта программа, которую я написал, вдохновлена встроенной визуализацией Easy TensorFlow http://www.easy-tensorflow.com/.
Я поделился своей программой на Github с GPSingularity.
использованная литература
Easy TensorFlow (2018). Легкий TensorFlow. Получено с http://www.easy-tensorflow.com/
Смилков Д., Торат Н., Николсон К., Рейф Э., Виегас Ф. Б. и Ваттернберг М. (2016). Встраивающий проектор: интерактивная визуализация и интерпретация вложений. Источник https://arxiv.org/pdf/1611.05469v1.pdf