Два основных преимущества TensorFlow перед многими другими доступными библиотеками - это гибкость и визуализация. Представьте себе, что если вы можете визуализировать, что происходит в коде (в данном случае код представляет собой вычислительный граф, который мы создаем для модели), было бы так удобно глубоко понять и наблюдать внутреннюю работу графа. Мало того, это также помогает исправить вещи, которые работают не так, как должны. TensorFlow предоставляет способ сделать это с помощью TensorBoard!
TensorBoard - это программное обеспечение для визуализации, которое поставляется с любой стандартной установкой TensorFlow. По словам Google:
«Вычисления, которые вы будете использовать TensorFlow для многих вещей (например, для обучения массивной глубокой нейронной сети), могут быть сложными и запутанными. Чтобы упростить понимание, отладку и оптимизацию программ TensorFlow, мы включили набор инструментов визуализации под названием TensorBoard ».
Программы TensorFlow могут варьироваться от очень простых до сверхсложных (с использованием тысяч вычислений), и все они имеют два основных компонента: операции и тензоры. Как объяснялось в предыдущих руководствах, идея состоит в том, что вы создаете модель, которая состоит из набора операций, вводите данные в модель, и тензоры будут течь между операциями, пока вы не получите выходной тензор, то есть ваш результат. TensorBoard предоставляет нам набор веб-приложений, которые помогают нам проверять и понимать выполнение и графики TensorFlow. В настоящее время он предоставляет пять типов визуализаций: скаляры, изображения, аудио, гистограммы и графики.
После полной настройки окно TensorBoard будет выглядеть примерно так:
TensorBoard был создан как способ помочь нам понять поток тензоров в вашей модели, чтобы мы могли его отлаживать и оптимизировать. Обычно он используется для двух основных целей:
1. Визуализация графика
2. Написание резюме для визуализации обучения
В этом руководстве мы рассмотрим основные способы использования TensorBoard. Если вы научитесь использовать TensorBoard на раннем этапе, это сделает работу с TensorFlow более приятной и продуктивной.
1. Визуализация графика
Графики вычислений TensorFlow, будучи мощными, могут быть чрезвычайно сложными. Визуализация графика может помочь нам понять и отладить его. Вот пример визуализации в действии с веб-сайта TensorFlow.
Рис. 2. Визуализация графика TensorFlow (Источник: веб-сайт TensorFlow)
Чтобы наша программа TensorFlow была активирована TensorBoard, нам нужно добавить несколько строк кода. Это экспортирует операции TensorFlow в файл, называемый файлом событий (или файлом журнала событий). TensorBoard может читать этот файл и давать некоторое представление о графике модели и ее производительности.
Теперь давайте напишем простую программу TensorFlow и визуализируем ее вычислительный граф с помощью TensorBoard.
Пример 1:
Давайте создадим две константы и сложим их вместе. Постоянные тензоры можно определить просто по их значению:
5
Чтобы визуализировать программу с помощью TensorBoard, нам нужно записать файлы журнала программы. Чтобы записать файлы событий, нам сначала нужно создать средство записи для этих журналов, используя этот код:
writer = tf.summary.FileWriter([logdir], [graph])
где [logdir] - это папка, в которой мы хотим хранить эти файлы журналов. Мы также можем выбрать [logdir] как нечто значимое, например «./graphs». Второй аргумент [график] - это график программы, над которой мы работаем. Получить график можно двумя способами:
- Вызовите график с помощью tf.get_default_graph (), который возвращает график программы по умолчанию.
- установите для него значение sessions.graph, которое возвращает график сеанса (обратите внимание, что для этого нам необходимо создать сеанс).
Давайте посмотрим на оба способа в следующем примере; однако чаще встречается второй способ. В любом случае убедитесь, что писатель создается только после определения графика. В противном случае график, отображаемый на TensorBoard, будет неполным.
Давайте добавим писателя к первому примеру и визуализируем график.
5
Теперь, если мы выполним этот код, TensorFlow создаст каталог внутри вашего текущего каталога (рядом с файлом кода Python), который содержит файл событий.
Затем, чтобы визуализировать график, нам нужно перейти в Терминал и убедиться, что текущий рабочий каталог совпадает с тем, в котором мы запускали наш код Python. Например, здесь мы можем переключиться в каталог с помощью команд:
$ cd ~ / Рабочий стол / tenorboard
Затем запустите:
$ tensorboard - logdir = ”./ graphs” - порт 6006
Замените ‘./graphs’ названием каталога на случай, если вы решите назвать его другим именем. Это создаст ссылку в командной строке. Нажмите (ctrl + left) ссылку, чтобы открыть окно TensorBoard, TensorBoard использует веб-браузер, чтобы показать нам визуализации (или просто скопируйте его в свой браузер, или просто откройте браузер и перейдите по адресу http: // localhost: 6006 / ). Ссылка направит нас на страницу TensorBoard, она должна выглядеть примерно так:
График на изображении выше показывает нам различные части нашей модели. «Const» и «Const_1» на графике соответствуют a и b, а узел «Add» соответствует c. Имена, указанные в коде (a, b и c), являются просто именами Python, они только помогают нам с доступом при написании кода. Имена ничего не значат для TensorFlow и TensorBoard. Чтобы TensorBoard понимал имена наших операций, мы должны явно назвать их.
Давайте еще раз изменим код, добавив имена:
5
* Примечание. Если мы запустим наш код несколько раз с одним и тем же [logdir], в нашем [logdir] будет сгенерировано несколько файлов событий. TF покажет только последнюю версию графика и отобразит предупреждение о нескольких файлах событий. Предупреждение можно удалить, удалив файлы событий, которые нам больше не нужны, или мы можем сохранить их в другой папке [logdir].
2. Написание резюме для визуализации обучения
Пока мы сосредоточились только на том, как визуализировать график в TensorBoard. Вспомните другие типы визуализаций, упомянутые в предыдущей части поста, которые предоставляет TensorBoard (скаляры, изображения и гистограммы). В этой части мы собираемся использовать специальную операцию под названием сводка для визуализации параметров модели (например, весов и смещений нейронной сети), метрик (например, потерь или значений точности) и изображений (например, ввод изображений в сеть).
Сводка - это специальная операция TensorBoard, которая принимает обычный тензор и выводит сводные данные на ваш диск (то есть в файл событий). По сути, есть три основных типа резюме:
1. tf.summary.scalar: используется для записи одного скалярного тензора (например, потери классификации или значения точности).
2. tf.summary.histogram: используется для построения гистограммы всех значений нескалярного тензора (может использоваться для визуализации матриц веса или смещения нейронной сети)
3. tf.summary.image: используется для построения изображений (например, входных изображений сети или сгенерированных выходных изображений автокодировщика или GAN).
В следующих разделах давайте рассмотрим каждый из вышеупомянутых типов сводок более подробно.
2.1. tf.summary.scalar:
Он предназначен для записи значений скалярного тензора, который изменяется со временем или итерациями. В случае нейронных сетей (скажем, простой сети для задачи классификации) она обычно используется для отслеживания изменений функции потерь или точности классификации.
Давайте рассмотрим простой пример, чтобы понять суть дела.
Пример 2:
Случайным образом выберите 100 значений из стандартного нормального распределения, N (0, 1), и нанесите их одно за другим.
Один из способов сделать это - просто создать переменную и инициализировать ее из нормального распределения (со средним значением = 0 и std = 1), затем запустить цикл for в сеансе и инициализировать его 100 раз. Код будет следующим, и необходимые шаги для написания резюме объяснены в коде:
Done with writing the scalar summary
Давайте откроем TensorBoard и проверим результат. Как и раньше, вам нужно открыть терминал и ввести:
$ tensorboard - logdir = ”./ graphs” - порт 6006
Здесь «./graphs» - это имя каталога, в котором мы сохранили файл события. В TensorBoard мы находим новую вкладку под названием «скаляры» рядом с ранее обсуждавшейся вкладкой «графики» (сравните рис. 5 с рис. 6). Все окно выглядит так:
На рисунке панель построения находится под именем «My_first_scalar_summary», тем же именем, которое мы определили в нашем коде. Ось x и ось y показывают 100 шагов и соответствующие значения (случайные значения из стандартного нормального расстояния) переменной соответственно.
2.2. tf.summary.histogram:
Гистограмма пригодится, если мы хотим наблюдать изменение значения во времени или итерациях. Он используется для построения гистограммы значений нескалярного тензора. Это дает нам представление о том, как гистограмма (и распределение) значений тензора изменяется со временем или итерациями. В случае нейронных сетей он обычно используется для отслеживания изменений распределения веса и смещения. Это очень полезно для обнаружения нерегулярного поведения параметров сети (например, когда наши веса резко взрываются или сжимаются).
Теперь вернемся к нашему предыдущему примеру и добавим к нему сводку гистограммы.
Пример 3:
Продолжите предыдущий пример, добавив матрицу размером 30x40, элементы которой взяты из стандартного нормального распределения. Инициализируйте эту матрицу 100 раз и постройте график распределения ее записей во времени.
Done writing the summaries
В TensorBoard в верхнее меню добавлены две новые вкладки: «Распределения» и «Гистограммы». Результаты будут такими:
В TensorBoard в верхнее меню добавлены две новые вкладки: «Распределения» и «Гистограммы». Результаты будут такими:
На рисунке вкладка «Распределения» содержит график, который показывает распределение значений тензора (ось y) по шагам (ось x). Вы спросите, какие бывают светлые и темные цвета?
Ответ заключается в том, что каждая линия на диаграмме представляет собой процентиль распределения данных. Например, нижняя строка (очень светлая) показывает, как минимальное значение менялось с течением времени, а линия посередине показывает, как изменилась медиана. При чтении сверху вниз строки имеют следующее значение: [максимум, 93%, 84%, 69%, 50%, 31%, 16%, 7%, минимум]
Эти процентили также можно рассматривать как границы стандартного отклонения при нормальном распределении: [максимум, μ + 1,5σ, μ + σ, μ + 0,5σ, μ, μ-0,5σ, μ-σ, μ-1,5σ, минимум] так что цветные области, считываемые изнутри наружу, имеют ширину [σ, 2σ, 3σ] соответственно.
Точно так же на панели гистограммы каждая диаграмма показывает временные «срезы» данных, где каждый срез представляет собой гистограмму тензора на заданном шаге. Он организован с самым старым временным шагом сзади и самым последним временным шагом впереди.
Вы можете легко отслеживать значения на гистограммах на любом этапе. Просто наведите курсор на график и посмотрите значения x-y на гистограммах (рис. 8 (a)). Вы также можете изменить режим гистограммы со «смещения» на «наложение» (см. Рис. 8- (b)), чтобы увидеть наложение гистограмм друг на друга.
Как упоминалось в коде, нам нужно запустить каждую сводку (например, sessions.run ([scalar_summary, histogram_summary])), а затем использовать наш модуль записи для записи каждого из них на диск. На практике мы можем использовать любое количество сводок для отслеживания различных параметров в нашей модели. Это делает создание и написание резюме крайне неэффективным. Чтобы решить эту проблему, нужно объединить все сводки на нашем графике и запустить их сразу внутри сеанса. Это можно сделать с помощью метода tf.summary.merge_all (). Добавим его в Пример 3, код изменится следующим образом:
Done writing the summaries
2.2. tf.summary.image:
Как следует из названия, этот тип сводки используется для записи и визуализации тензоров в виде изображений. В случае нейронных сетей это обычно используется для отслеживания изображений, которые либо передаются в сеть (скажем, в каждом пакете), либо изображения, сгенерированные на выходе (например, восстановленные изображения в автокодировщике; либо созданные поддельные изображения генератором модели генерирующей противодействующей сети). Однако, как правило, это можно использовать для построения любого тензора. Например, мы можем визуализировать весовую матрицу размером 30x40 как изображение 30x40 пикселей.
Сводку изображения можно создать, используя:
tf.summary.image(name, tensor, max_outputs=3)
Где name - это имя сгенерированного узла (т. Е. Операции), тензор - это желаемый тензор, который должен быть записан как сводка изображения (мы скоро поговорим о его форме), а max_outputs - это максимальное количество элементы из тензора, для которых создаются изображения. Но что это значит? Ответ кроется в форме тензора.
тензор, который мы передаем в tf.summary.image, должен быть четырехмерным тензором формы [batch_size, height, width, channels], где batch_size - количество изображений. в пакете высота и ширина определяют размер изображения и, наконец, каналы: 1: для изображений в градациях серого. 3: для изображений RGB (т. Е. Цветных). 4: для изображений RGBA (где A означает альфа; см. RGBA).
Давайте посмотрим на очень простой пример, чтобы понять основную идею.
Пример 4:
Определим две переменные:
- Размером 30x10 как 3 полутоновых изображения размером 10x10.
- Размером 50x30 как 5 цветных изображений размером 10x10.
и распечатать их как изображения в TensorBoard.
Done writing the summaries
Теперь откройте TensorBoard, как раньше, и перейдите на вкладку ИЗОБРАЖЕНИЯ. Изображения должны быть примерно такими:
Точно так же мы можем добавить любое другое изображение любого размера к нашим сводкам и построить их в TensorBoard.
Спасибо, что прочитали этот почти длинный учебник. В следующем уроке я запущу простую нейронную сеть и визуализирую ее график и производительность с помощью TensorBoard.
Это был мой первый пост на Medium. Поэтому, пожалуйста, не стесняйтесь подбадривать меня своими аплодисментами и присылайте свои отзывы, оставляя комментарии ниже.