Caffe讀取訓練和測試日誌

用Caffe訓練模型時,我們常常想保存訓練和測試過程中數據一便於進一步分析。一種方法是在python中調用caffe的API訓練並自己寫代碼讀取layer中的數據保存結果,但這種方法畢竟比較繁瑣。其實在用命令行訓練的時候,caffe已經提供了保存訓練日誌並解析訓練和測試數據的功能。只要在訓練的命令上加一行命令即可。如下:

#!/usr/bin/env sh
set -e
CAFFEROOT=/home/meringue/Softwares/caffe-master
CIFAR10PY=/home/meringue/Documents/CaffePy/cifar10py
MODEL=$CIFAR10PY/cifar10_caffemodels/model_Alex_ST
TOOLS=$CAFFEROOT/build/tools
echo 'start training...'

GLOG_logtostderr=0 GLOG_log_dir=$MODEL/LOG/ \ # save log file
$TOOLS/caffe train \
  --solver=$MODEL/cifar10_quick_solver.prototxt $@ 

這樣就會在GLOG__log_dir路徑下生成一份日誌文件,打開看一下,裏面其實就是你在執行訓練腳本時生成的一大堆東西。但我們需要的是裏面準確率和誤差等有用的信息,這時候需要用到caffe-master/tools/extra/路徑下的extract_seconds.py,parse_log.sh和plot_training_log.py三個文件,把這三個文件複製一份到你自己定義的LOG文件夾下,先把之前的LOG日誌重命名成以.log後綴的文件,如model.log,在當前文件夾下用parse_log.sh model.log命令可以解析出model.log.train和model.log.test兩個文件,打開可以看到類似下圖的內容:


log.train_test

可以發現,我們需要的數據已經被解析出來了,這個時候可以用這些數據來畫圖了。當然Caffe也提供了畫圖功能,用的就是plot_training_log.py,可以設置不同的參數來畫你所需要的圖,這力裏就不再展開了,因爲代碼裏關於參數的說明寫的很詳細,自己看看就懂了。
其實,既然已經有了這些數據,我們完全可以自己寫一個python函數來讀取這些數據並畫圖,下面是我自己寫的函數,可以用來讀取上面兩個日誌文件中數據,代碼中一些細節都加了註釋。

## read log file of training process created by Caffe
class ReadLogFile(object):
    def __init__(self,_LogFilePath):
        """
        get log file path from LogFilePath
        """
        self.LogFilePath = _LogFilePath

    def read_trainLog(self,LogName):
        """
        get iterations and training loss from training log file named LogName
        """
        LogPath = self.LogFilePath+LogName

        # load all training data
        with open(LogPath) as f:
            data = f.readlines()
            data = data[1:] # remove the first row (title) 
            data_len = len(data)

        Iters = []
        TrainLoss = []

        for row in range(data_len):
            data_row = data[row].split(' ') # splitted by ' '
            while '' in data_row: # remove 'None'
                data_row.remove('')
            Iters.append(int(data_row[0]))
            TrainLoss.append(float(data_row[2]))           
        return Iters, TrainLoss    

    def read_testLog(self,LogName):
        """
        get iterations, test accuracy and test loss from test log file named LogName
        """
        LogPath = self.LogFilePath+LogName

        with open(LogPath) as f:
            data = f.readlines()
            data = data[1:]
            data_len = len(data)

        Iters = []
        TestAccuracy = []
        TestLoss = []

        for row in range(data_len):
            data_row = data[row].split(' ')
            while '' in data_row:
                data_row.remove('')
            Iters.append(int(data_row[0]))
            TestAccuracy.append(float(data_row[2]))
            TestLoss.append(float(data_row[3]))     
        return Iters, TestAccuracy, TestLoss
發佈了56 篇原創文章 · 獲贊 214 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章