Этот пост является черновиком моего пути изучения TesnsorboardX. В этом посте я расскажу об использовании базового API TensorboardX из официального руководства. Официальный учебник можно получить по следующей ссылке.
- Почему 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). Вы также можете использовать регулярное выражение для фильтрации данных.
В следующем посте я пройдусь по демонстрационному файлу из официальной документации и добавлю комментарии для каждой функции для обучения.