iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

前言

一般我們在寫程式時,想要測試一下當前的輸出,或是顯示一些重要的資訊或數值,會使用類似像 print() 的方法,來顯示資訊,例如以本系列實作為例,原本我也習慣使用 print() 的方法,來顯示訓練模型的重要數值,如準確度、損失值和執行時間等,或是提醒執行到哪個階段(如開始訓練或結束訓練)。電腦放著等模型訓練完畢,通常是會記得將這些印出內容複製貼上記下來。

但!就會有忘記的時候!/images/emoticon/emoticon02.gif

所以日誌工具就派上用場了,設定好記錄日誌的相關程式碼,就算記得手動存取資訊,也不用花時間去做這些事啦~

當然這只是使用日誌的一個原因,主要是日誌可以記錄程式執行時,事件發生的日期和時間,可供開發人員去查詢並檢查問題,對開發者有很大的幫助!

Loguru 介紹

雖然 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(10):記錄除錯資訊。
  • INFO(20):記錄一般執行的資訊,如模型開始訓練。
  • WARNING(30):警告可能的問題,程式可正常執行。
  • ERROR(40):記錄錯誤,程式可繼續執行。
  • CRITICAL(50):記錄嚴重的錯誤,程式要立即處理或停止執行。

括號內的數字為級別對應的數值,設定的時候除了可以用字串,也可以用數值設定對應的級別。
級別數值愈低,表示優先性愈低,優先性比較: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 日誌。

終端機日誌顯示:
https://ithelp.ithome.com.tw/upload/images/20241004/20166645XDxpPlpPii.png
可以看到用不同的顏色標記表示日誌的優先程度。

💡設定級別是儲存日誌記錄下來的部分,終端機會顯示全部的日誌訊息,例如設定 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 可以讓程式碼更簡潔明瞭。
明天再跳回來分享一下訓練模型時資料輸入的其他方法。


上一篇
[Day 26] 部署模型的方法 (3):Gradio
下一篇
[Day 28] 輸入訓練資料的另一種方法
系列文
輕鬆上手AI專案-影像分類到部署模型30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言