Оглавление

О чем это

Отладка вдвое сложнее, чем первоначальное написание кода. Следовательно, если вы напишете код настолько умно, насколько это возможно, вы по определению недостаточно умны, чтобы отлаживать его. - БРАЙАН У. КЕРНИГАН

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

Однако, когда дело доходит до TensorFlow, возникают некоторые новые проблемы из-за того, как он работает.

Как говорится в официальной документации:

Программа TensorFlow Core состоит из двух отдельных разделов:

  1. Построение вычислительного графа (tf.Graph).
  2. Запуск вычислительного графа (с использованием tf.Session).

Фактические вычисления выполняются с session.run(), что означает, что нам нужно найти способ проверить значения внутри этой функции.

Справочная кодовая база

В качестве справки я предоставлю свой репозиторий Github с соответствующим кодом здесь.

Мы будем использовать базовую нейронную сеть для классификации рукописных цифр из набора данных MNIST, используя:

  • tf.nn.softmax_cross_entropy_with_logits_v2 как операция классификации TF для определения убытка
  • tf.train.GradientDescentOptimizer для минимизации потерь

Запуск этой небольшой нейронной сети показывает, что она уже может достичь точности ~ 92%:

Процесс отладки

Что касается отладки, есть в основном 5 (прагматических) способов добиться этого.

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

1. Получите и распечатайте значения в Session.run.

Это, вероятно, самый быстрый и простой способ получить нужную информацию.

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

По сути, вы запускаете сеанс в операторе печати и загружаете его в словарь, например: print( f"The bias parameter is: {sess.run(b, feed_dict={x: mnist.test.images, y_: mnist.test.labels})}" )

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

Кроме того, не забывайте о методе .eval() специально для вычисления тензоров.

Смотрите полный код здесь, на Github.

2. Используйте операцию tf.Print.

Метод tf.Print пригодится во время оценки во время выполнения, когда мы не хотим явно получать код с помощью session.run (). Это операция идентификации, которая печатает данные при оценке.

  • это позволяет нам видеть развитие ценностей во время оценки
  • он имеет ограниченную конфигурацию и поэтому может легко засорить терминал

Юфэн Джи создал фантастическое видео и статью о том, как использовать tf.Print statement. И, как он указывает, очень важно структурировать узел печати таким образом, чтобы он использовался в дальнейшем. Как он говорит:

Жизненно важно, чтобы вы действительно использовали этот возвращенный узел, потому что в противном случае он будет болтаться.

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

С оценкой времени выполнения появляется возможность утверждения времени выполнения с помощью tf.Assert.

Смотрите полный код здесь.

3. Используйте визуализацию Tensorboard для мониторинга

Прежде чем погрузиться в этот метод отладки, имейте в виду, что есть отладчик Tensorboard и Tensorboard!

Сайт TF предлагает отличное руководство по внедрению и использованию платы.

Ключ к использованию - это сериализация данных. TensorFlow предоставляет сводные операции, которые позволяют экспортировать сжатую информацию о модели. Они похожи на якоря, говорящие доске визуализации, что строить.

а) Очистите график, добавив имена собственные и области видимости

Сначала нам нужно организовать все переменные и операции с помощью scope методов, которые предоставляет TF.

with tf.name_scope("variables_scope"):
    x = tf.placeholder(tf.float32, shape=[None, 784], name="x_placeholder")
    y_ = tf.placeholder(tf.float32, shape=[None, 10], name="y_placeholder")

б) Добавьте tf.summaries

Например:

with tf.name_scope("weights_scope"):
    W = tf.Variable(tf.zeros([784, 10]), name="weights_variable")
    tf.summary.histogram("weight_histogram", W)

c) Добавьте tf.summary.FileWriter для создания файлов журнала

Совет: Обязательно создавайте подпапки для каждого журнала, чтобы избежать скопления графиков.

г) Запустите сервер тензорной доски с вашего терминала

Например: tensorboard --logdir=./tfb_logs/ --port=8090 --host=127.0.0.1

Переход к серверу тензорной платы (в данном случае http://127.0.0.1:8090) показывает следующее:

Теперь становится понятна вся мощь и использование тензорборда. Это позволяет очень легко обнаруживать ошибки в вашей модели машинного обучения. Мой пример кода очень простой. Представьте себе модель с несколькими слоями и большим количеством переменных и операций!

Полный код смотрите здесь, на Github.

4. Используйте отладчик Tensorboard.

Как говорится в репозитории Tensorboard Github:

Эта панель мониторинга находится на стадии альфа-версии. Некоторые функции еще не полностью функциональны.

Тем не менее, его все еще можно использовать, и он предоставляет отличные функции отладки. Пожалуйста, загляните в репозиторий Github, чтобы получить адекватный обзор. Также посмотрите их видео, чтобы лучше понять. Они проделали большую работу.

Для этого к нашему предыдущему примеру нужно добавить 3 вещи:

  1. Импорт from tensorflow.python import debug as tf_debug
  2. Добавьте сеанс с tf_debug.TensorBoardDebugWrapsperSession
  3. Добавьте на свой сервер тензорной доски debugger_port

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

Об этой уникальной особенности Tensorflow можно поговорить гораздо больше, но я, вероятно, посвящу этому другую статью.

Смотрите мой полный код здесь, на Github.

5. Используйте отладчик TensorFlow.

Последний метод, но тоже очень мощный, - это отладчик TensorFlow CLI.

Этот отладчик ориентирован на интерфейс командной строки (CLI) tfdbg, в отличие от графического пользовательского интерфейса (GUI) tfdbg, то есть подключаемого модуля отладчика TensorBoard.

Вы просто завершаете сеанс tf_debug.LocalCLIDebugWrapperSession(sess), а затем начинаете отладку с выполнения файла (возможно, необходимо добавить флаг --debug).

Это в основном позволяет вам запускать и поэтапно выполнять вашу модель, обеспечивая при этом показатели оценки.

Я думаю, что официальную документацию можно улучшить, но они также создали видео, которое хорошо знакомит с этой функцией.

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

Смотрите полный код здесь, на Github.

Заключение

Как показано, существует множество способов отладки приложения TensorFlow. У каждого метода есть свои сильные и слабые стороны. Я не упоминал об отладчике Python, потому что он не специфичен для TensorFlow, но имейте в виду, что простой отладчик Python уже дает некоторые полезные сведения!

Есть отличная презентация Wookayin, в которой также рассказывается об этих концепциях, но также даются некоторые общие советы по отладке. Этот совет таков:

  • правильно называть тензоры
  • проверить и очистить ввод
  • протоколирование
  • утверждения
  • правильное использование исключений
  • быстро выходит из строя - ›немедленно прервать работу, если что-то не так
  • не повторяйся
  • организовать свои модули и код

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

Спасибо, что прочитали мою статью! Не стесняйтесь оставлять отзывы!

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

Подключиться: