Этот пост является черновиком моего пути изучения TesnsorboardX. В этом посте я расскажу об использовании базового API TensorboardX из официального руководства. Официальный учебник можно получить по следующей ссылке.



  1. Почему Tensorboard X?
  • Это веб-сервер для визуализации процесса обучения нейронной сети.
  • Он может быть приспособлен для других фреймворков, кроме Tensorflow, таких как PyTorch.
  • Цель этого пакета — позволить исследователям использовать простой интерфейс для регистрации событий в PyTorch (а затем отображать визуализацию в tensorboard).
  • Этот пакет в настоящее время поддерживает скалярное ведение журнала, изображение, аудио, гистограмму, текст, встраивание и маршрут обратного распространения.

2. Установка

pip install tensorboardX

или установите новейшую версию из исходников:

pip install git+https://github.com/lanpa/tensorboardX

3. Краткие руководства

3.1 Создайте средство записи резюме

Прежде чем что-либо регистрировать, необходимо создать экземпляр записи. Существует три способа инициализации экземпляра модуля записи.

from tensorboard import SummaryWriter
#SummaryWriter encapsulates everything
writer = SummaryWriter('runs/exp-1')
#creates writer object. The log will be saved in 'runs/exp-1'
writer2 = SummaryWriter()
#creates writer2 object with auto generated file name, the dir will be something like 'runs/Aug20-17-20-33'
writer3 = SummaryWriter(comment='3x learning rate')
#creates writer3 object with auto generated file name, the comment will be appended to the filename. The dir will be something like 'runs/Aug20-17-20-33-3xlearning rate'

Каждая подпапка будет рассматриваться как отдельный эксперимент в tensorboard. Каждый раз, когда вы повторно запускаете эксперимент с другими настройками, вы должны изменить имя подпапки, например runs/exp2, runs/myexp, чтобы вы могли легко сравнивать различные настройки эксперимента. Введите tensorboard runs, чтобы сравнить разные прогоны в тензорной доске.

3.2 Общий формат API

add_something(tag_name, object, iteration_number)

3.3 Добавить скаляр

  • Скалярное значение — это самый простой тип данных для работы.
  • В основном мы сохраняем значение потери каждого шага обучения, или точность после каждой эпохи, или какие-то гиперпараметры, т. е. скорость обучения, размер пакета. и оптимизатор.
  • Сохранить скалярное значение дешево. Просто запишите все, что вы считаете важным.
  • Чтобы записать скалярное значение, используйте writer.add_scalar('myscalar', value, iteration). Обратите внимание, что программа жалуется, если вы передаете переменную PyTorch. Не забудьте извлечь скалярное значение на x.data[0], если x является переменной факела.

3.4 Добавить изображение

  • Изображение представляется в виде трехмерного тензора.
  • Самый простой случай — сохранять по одному изображению. В этом случае изображение должно быть передано как трехмерный тензор размера [3, H, W]. Три измерения соответствуют каналам R, G, B изображения. После того, как ваше изображение будет вычислено, используйте writer.add_image('imresult', x, iteration), чтобы сохранить изображение.
  • Если у вас есть пакет изображений для отображения, используйте функцию make_grid torchvision, чтобы подготовить массив изображений и отправить результат в add_image(...) (make_grid принимает четырехмерный тензор и возвращает мозаичные изображения в трехмерном тензоре). Таким образом, сохраняемые изображения имеют форму [N, C, H, W]. N - размер партии. C — размер канала, обычно 3 для изображений RGB и 1 для изображений в градациях серого.
  • В частности, в OpenCV или NumPy изображения обычно передаются [H, W, C]. Итак, нам нужно преобразовать их в тензоры размерности [C, H, W], во-первых, с numpy.transpose.
  • Примечание. Не забудьте нормализовать изображение. Значения лежат в диапазоне [0, 1].

3.5 Добавить гистограмму

  • Сохранение гистограммы дорого обходится как во времени вычислений, так и в хранении. Если обучение замедляется после использования этого пакета, сначала проверьте это.
  • Чтобы сохранить гистограмму, преобразуйте массив в массив numpy и сохраните с помощью writer.add_histogram('hist', array, iteration).

3.6 Добавить график

  • Рисунок графика основан на обратной трассировке autograd.
  • Он рекурсивно проходит по атрибуту next_functions в переменной, рисуя каждый встреченный узел.
  • Чтобы нарисовать график, вам нужна модель mи входная переменная t, которые имеют правильный размер для m. Пусть r = m(t), затем вызовитеwriter.add_graph(m, r), чтобы сохранить график.
  • По умолчанию входной тензор не требует градиента, поэтому он будет опущен при обратной трассировке. Чтобы нарисовать входной узел, передайте дополнительный параметр requires_grad=True при создании входного тензора. Полный пример см. в разделе Демонстрация графика.

3.7 Добавить звук

  • Чтобы сохранить аудио, вызовите writer.add_audio('myaudio', audio, iteration, 44100).
  • В настоящее время частота дискретизации этой функции зафиксирована на уровне 44100 кГц, один канал.
  • Входные данные функции add_audio представляют собой одномерный массив, каждый элемент которого представляет последовательные выборки амплитуды. Для 2-секундного аудио вход x должен содержать 88200 элементов. Каждый элемент должен лежать в [-1, 1].

3.8 Добавить вложение

  • Встраивание — это способ визуализации многомерных данных.
  • Чтобы преобразовывать многомерные данные в воспринимаемые человеком трехмерные данные, tensorboard предоставляет PCA и t-sne для проецирования данных в низкоразмерное пространство.
  • Что вам нужно сделать, так это предоставить кучу точек, а tensorboard сделает все остальное за вас.
  • Связка точек передается как тензор размера n x d, где n — количество точек, а d — размер объекта. Представление функции может быть либо необработанными данными (например, изображение MNIST), либо представлением, полученным вашей сетью (извлеченная функция).
  • Это определяет, как распределяются баллы. Чтобы сделать визуализацию более информативной, вы можете передать дополнительные метаданные или label_imgs для каждой точки данных. Таким образом, вы можете видеть, что соседние точки имеют одинаковую метку, а удаленные точки имеют очень разные метки (семантически или визуально).
  • Здесь метаданные представляют собой список меток, и длина списка должна равняться n, количеству точек. label_imgs — это четырехмерный тензор размером NCHW. N также должно равняться n. Полный пример см. в разделе Демонстрация встраивания.

4. Запустите TensorboardX

Чтобы запустить веб-сервер TensorboardX, вам необходимо сначала установить tensorflow,

pip install tensorflow # if no CUDA GPU support 

or

pip install tensorflow-gpu # CUDA GPU support

После этого введите tensorboard --logdir=<yourlogdir> для запуска сервера, где yourlogdir — параметр конструктора объекта. Например, если вы храните журнал в файле run, просто введите tensorboard --logdir=runs.

Если вы считаете эту команду утомительной, просто добавьте псевдоним строки tb='tensorboard --logdir ' в ~/.bash_profile. Таким образом, приведенная выше команда упрощается как tb <yourlogdir>. Используйте свой любимый браузер для загрузки страницы tensorboard, адрес будет показан в терминале после запуска сервера.

5. Разное

5.1 проблема с производительностью

Ведение журналов дешево, но отображение дорого. Согласно официальной документации, если одновременно нужно показать 3 или более экспериментов, и каждый эксперимент имеет, скажем, 50 000 точек, tensorboard может потребоваться много времени для представления данных.

5.2 Группировка участков

Обычно в одном эксперименте регистрируется много номеров. Например, при обучении GAN вы должны логировать потерю генератора, дискриминатора. Если потеря состоит из двух других функций потерь, скажем, L1 и MSE, вы можете захотеть также зарегистрировать значение двух других потерь. В этом случае вы можете написать теги как Gen/L1, Gen/MSE, Desc/L1, Desc/MSE. Таким образом, tensorboard сгруппирует графики в две секции (Gen, Desc). Вы также можете использовать регулярное выражение для фильтрации данных.

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