使用Python中的log模塊將loss輸出到終端與保存到文件


記得之前對深度學習中得loss輸出,經常自己會將輸出流重新定向到一個文件中,

比如

python main.py 2 > &1 | tee log.txt

對於caffe這種c++框架而言,用輸出流重定向的方法是比較妥的,但是這樣輸出會有一個問題,比如,出了文件中print特定格式得loss之外,

你進行debug的時候,想print一些東西,debug print的結果也print到了文件中,但是實際上你並不想要這種結果,或者有時候輸出流重定向有一定得延遲,這個時候需要等一等才能看到輸出的loss

對於python,實際上有更好的方法,那就是log模塊。

關於log模塊,這里只講如何使用log模塊同時輸出想要print得信息到終端與保存要print得信息到文件中

 1 # -*-coding:utf-8-*-
 2 # 設置格式
 3 import logging
 4 
 5 
 6 def get_log(file_name):
 7     logger = logging.getLogger('train')  # 設定logger的名字
 8     logger.setLevel(logging.INFO)  # 設定logger得等級
 9 
10     ch = logging.StreamHandler()  # 輸出流的hander,用與設定logger的各種信息
11     ch.setLevel(logging.INFO)  # 設定輸出hander的level
12 
13     fh = logging.FileHandler(file_name, mode='a')  # 文件流的hander,輸出得文件名稱,以及mode設置為覆蓋模式
14     fh.setLevel(logging.INFO)  # 設定文件hander得lever
15 
16 
17 
18     formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
19     ch.setFormatter(formatter)  # 兩個hander設置個是,輸出得信息包括,時間,信息得等級,以及message
20     fh.setFormatter(formatter)
21     logger.addHandler(fh)  # 將兩個hander添加到我們聲明的logger中去
22     logger.addHandler(ch)
23     return logger
View Code

在使用的時候,直接傳入路徑,

1 logger = setting.get_log('log.txt')

然后就可以愉快的輸出信息到到終端以及輸出信息到文件中啦

比如,我原來打印loss可能需要這么寫

1 print("Epoch [%d/%d], Iter [%d/%d] Loss: %.4f" % (epoch + 1, 80, i + 1, 500, loss.data.item()))

現在打印loss可以這樣寫

1 logger.info("Epoch [%d/%d], Iter [%d/%d] Loss: %.4f" % (epoch + 1, 80, i + 1, 500, loss.data.item()))

因為我們剛剛把兩個hander給add到了我們聲明得logger中,所以,上面一行代碼可以同時輸出信息到終端,同時也可以輸出信息到文件中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM