Проведение экспериментов по глубокому обучению может быть сложной задачей. Вы планируете провести серию экспериментов на ночь, чтобы на днях узнать, что почти все они потерпели неудачу — и любая трассировка стека была давно предана забвению каким-то другим тестом. Какой хороший способ начать день :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 для профессионалов в области данных и ИТ, а тем более для новичков. Пожалуйста, рассмотрите возможность использования моей партнерской ссылки при регистрации.
Спасибо за чтение :)