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

Автоматическое средство ведения журнала из консоли в файл

В целом, после вызова mirror_console_to_file(file) любое сообщение, отправленное в потоки stdout и stderr , будет перехвачено, направлено в файл, а затем напечатано, как обычно. Это имитирует команду «tee» в Linux с использованием чистого Python. Преимущество этого заключается в том, что он работает на всех платформах, и дает вам программный контроль над процессом.

В этой реализации и stdout , и stderr направляются в один и тот же файл, и есть начальное и конечное сообщение с отметкой системного времени, что полезно для проверки того, сколько времени потребовалось для завершения/непрохождения теста. Прилагая дополнительные усилия, можно было добавить временную метку к каждому сообщению, вручную проверяя сообщения на наличие символа \n.

Предостережение в том, что сообщения, использующие символ \r, не будут обрабатываться как обычно. Вместо этого журнал будет содержать каждое сообщение по порядку, а не каждое сообщение, перезаписывающее предыдущее. Меня это немного раздражает, поэтому я включаю и выключаю код маршрутизации при разработке и тестировании соответственно.

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

import git
head = git.Repo(search_parent_directories=True).head.object
summary, sha = head.summary, head.hexsha

В заключение вы можете задаться вопросом: зачем вручную направлять стандартный вывод в файл, а не использовать библиотеку протоколирования? Есть несколько причин в пользу ручного подхода:

  • Код большинства людей основан на базовой печати, поэтому преобразование его в реализацию регистратора может занять слишком много времени и усилий.
  • На практике (небиблиотечный) код глубокого обучения не является длинным или сложным, чтобы гарантировать такие функции, как уровни ведения журнала или распределенное ведение журнала.
  • Полезная отладочная информация обычно поступает из предупреждений библиотеки, а не из ваших собственных сообщений.

Дополнительные советы по обучению моделей глубокого обучения см. в следующих статьях:





Не стесняйтесь комментировать или связаться со мной, если у вас есть какие-либо вопросы по этой статье. Если вы новичок в Medium, настоятельно рекомендую подписаться. Средние статьи — идеальная пара для StackOverflow для профессионалов в области данных и ИТ, а тем более для новичков. Пожалуйста, рассмотрите возможность использования моей партнерской ссылки при регистрации.

Спасибо за чтение :)