一般我們在寫程式時,想要測試一下當前的輸出,或是顯示一些重要的資訊或數值,會使用類似像 print()
的方法,來顯示資訊,例如以本系列實作為例,原本我也習慣使用 print()
的方法,來顯示訓練模型的重要數值,如準確度、損失值和執行時間等,或是提醒執行到哪個階段(如開始訓練或結束訓練)。電腦放著等模型訓練完畢,通常是會記得將這些印出內容複製貼上記下來。
但!就會有忘記的時候!
所以日誌工具就派上用場了,設定好記錄日誌的相關程式碼,就算記得手動存取資訊,也不用花時間去做這些事啦~
當然這只是使用日誌的一個原因,主要是日誌可以記錄程式執行時,事件發生的日期和時間,可供開發人員去查詢並檢查問題,對開發者有很大的幫助!
雖然 Python 有內建的日誌套件 logging
,但也可以選擇使用 loguru
這個第三方套件,使用方法比較容易,不需要複雜的配置,就可以記錄日誌。詳細可以參考 Loguru 的 GitHub。
安裝 Loguru:
pip install loguru
在程式中匯入:
from loguru import logger
使用 logger.add()
建立日誌,your_log_path 換成自己的日誌名稱:
logger.add("your_log_path.log")
寫一個資訊級別的日誌內容:
logger.info("這是 INFO 日誌。")
執行結果:
2024-10-04 10:01:46.162 | INFO | __main__:<module>:5 - 這是 INFO 日誌。
打開指定路徑下的 .log
檔案,可以看見和終端機一樣的訊息:
2024-10-04 10:01:46.162 | INFO | __main__:<module>:5 - 這是 INFO 日誌。
日誌也可以設定不同的時間格式,例如預設的 ISO 8601 標準格式:
logger.add("your_log_path.log", format="{time} {level} {message}")
打開日誌檔案,可以看到計算時間的數值非常精準,並包含了時區:
2024-10-04T10:05:05.639655+0800 INFO 這是 INFO 日誌。
如果不想要顯示太多資訊,可以自己設定想要的格式,如:
logger.add("your_log_path.log", format="{time:YYYY-MM-DD HH:mm:ss} {level} {message}")
打開日誌檔案,會依照設定的格式記錄時間:
2024-10-04 10:10:37 INFO 這是 INFO 日誌。
日誌可以設定事件的級別,並設定儲存的日誌記錄的級別為在哪一個級別之上。
級別有:
括號內的數字為級別對應的數值,設定的時候除了可以用字串,也可以用數值設定對應的級別。
級別數值愈低,表示優先性愈低,優先性比較:DEBUG < INFO < WARNING < ERROR < CRITICAL。
如果設定的級別優先性愈高,記錄的內容就會比較少(只記錄比較嚴重的問題)。
使用範例:
logger.add("test.log", format="{time:YYYY-MM-DD HH:mm:ss} {level} {message}", level = "DEBUG")
logger.debug("這是 DEBUG 日誌。")
logger.info("這是 INFO 日誌。")
logger.warning("這是 WARNING 日誌。")
logger.error("這是 ERROR 日誌。")
logger.critical("這是 CRITICAL 日誌。")
在建立日誌時,可以透過 level
設定哪一個級別之上才需要記錄,例如設定 "DEBUG",表示 DEBUG 級別以上的才需要記錄,也可以設定對應的數值,如 DEBUG 為 10,輸出結果相同。
輸出範例:
2024-10-04 10:33:11 DEBUG 這是 DEBUG 日誌。
2024-10-04 10:33:11 INFO 這是 INFO 日誌。
2024-10-04 10:33:11 WARNING 這是 WARNING 日誌。
2024-10-04 10:33:11 ERROR 這是 ERROR 日誌。
2024-10-04 10:33:11 CRITICAL 這是 CRITICAL 日誌。
終端機日誌顯示:
可以看到用不同的顏色標記表示日誌的優先程度。
💡設定級別是儲存日誌記錄下來的部分,終端機會顯示全部的日誌訊息,例如設定 level 為 WARNING,日誌記錄 WARNING 以上的訊息,但終端機會顯示含 WARNING 以下的訊息。
例如想要儲存訓練模型得到的最大驗證準確度:
logger.info('Max Validation Accuracy: '+str(max(hist.history["val_accuracy"])))
或是將推論時的評估數值記錄下來:
logger.info(f'Accuracy: {round(accuracy, 3)}')
logger.info(f'Precision: {round(precision, 3)}')
logger.info(f'Recall: {round(recall, 3)}')
logger.info(f'F1-score: {round(f1, 3)}')
logger.info(f'Cohen\'s Kappa: {round(kappa, 3)}'
用法基本上和 print
一樣,是不是滿容易的呢?
日誌記錄對程式開發和維護是非常重要的,使用 Loguru 可以讓程式碼更簡潔明瞭。
明天再跳回來分享一下訓練模型時資料輸入的其他方法。