iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
AI & Data

手寫中文字之影像辨識系列 第 20

【第20天】訓練模型-模型組合與辨識isnull(一)

  • 分享至 

  • xImage
  •  

摘要

  1. 作業流程
  2. 獲得各模型800字機率表
  3. 安裝R與RStudio

內容

  1. 作業流程(今日進度為1.1~1.2)

    1.1 獲得各模型800字機率表。(包括官方800字內、官方800字外與測試賽資料集)

    1.2 安裝R與RStudio。

    1.3 設定資料集路徑

    1.4 找出每個中文字的閾值。(如何選擇isnull的閾值)

    • <方法一>單一中文字機率最小值
    • <方法二>單一中文字機率平均值

    1.5 任意選擇奇數個模型組合後,產生模型權重表與利用新模型權重得到的機率表。(如何選擇加權依據)

    • <方法一>各模型中,單獨一個字的辨識準確度占比(如:官方800字內的「白」有100個樣本,正確辨識80個,「白」的辨識準確度就是80%)
    • <方法二>各模型中,單獨計算800個中文字機率占比(sofmax輸出機率)

    1.6 判斷isnull。(如何選擇判斷isnull的依據)

    • <方法一>多模型投票,取多數者(故1.2選擇奇數個模型隨機組合)
    • <方法二>模型加權判斷

    1.7 交叉驗證不同方法組合的模型準確率。(共 2 * 2 * 2 = 8種)

  2. 獲得各模型800字機率表

    2.1 預測樣本

    • 官方800字內:train資料集(174,808 )+val資料集(18,717張),合計193,525張圖檔。
    • 官方800字外:723張圖檔。
    • 測試賽樣本:90張圖檔。

    2.2 程式碼

    from tensorflow.keras.preprocessing import image
    import numpy as np
    import os
    from tensorflow.keras.models import load_model
    import time
    import csv
    
    # 讀取圖檔,並進行影像前處理
    def read_image(img_path):
        try:
            img = image.load_img(img_path, target_size=(80, 80))
        except Exception as e:
            print(img_path, e)
    
        img = image.img_to_array(img)
        img = np.expand_dims(img, axis=0)
        return img/255
    
    # 返回最大機率值的中文字的標籤
    def to_word(pred:np.array)->str:
        index = np.argmax(pred)
        return labels[index]
    
    # 定義3個欄位值(預測值、實際值、是否正確預測)
    def append_pre_true(arr,pre,true,predict_true_or_not)->list:
        arr = list(arr)
        arr.append(pre)
        arr.append(true)
        arr.append(predict_true_or_not)
        return arr
    
    # 若預測結果正確,在predict_true_or_not填入1;反之團入0
    def predict_true_or_not(pre:str,true:str)->bool:
        if pre == true:
            return 1
        else:
            return 0
    
    # 定義欄位名稱
    def columns(labels:list):
    
        for i in ['pre', 'label', 'true_or_not']:
            labels.append(i)
        return labels
    
    # 預測及賦值
    def model_predict(model,img):
        pred = model.predict(img)[0]
        word = to_word(pred)
        true_or_not = predict_true_or_not(word, subfolder)
        return pred, word, true_or_not
    
    if __name__ == "__main__":
        # 讀取800字標籤
        labels = os.listdir('./data/train')
        print(labels)
    
        # 載入訓練好的模型
        model_path = './model/densenet201_v2/35_最佳/Densenet201_checkpoint_v2.h5'
        model = load_model(model_path)
        #存放檔案的資料夾
        folder_name = './data/123/'
        #csv檔名稱
        csv_name = "Densenet201__retrained_v2_6K.csv"
    
        # 計時起點
        start = time.time()
    
        # 將800個字的預測機率,儲存到CSV檔
        with open(csv_name, "w", newline="", encoding="utf_8_sig") as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow(columns(labels))  #先寫入欄位名稱
            for subfolder in os.listdir(folder_name):
                for jpg in os.listdir(folder_name+subfolder):
                    # 請輸入你的圖片path
                    img_path = folder_name+subfolder+'/'+jpg
                    img = read_image(img_path)
                    #1*800向量,預測字,是否猜中
                    pred, word, true_or_not = model_predict(model,img)
                    #變成一列 : 1*800向量,預測字,真實字,是否猜中
                    row = append_pre_true(pred, word, subfolder, true_or_not)
                    writer.writerow(row)
                    print(word, subfolder, true_or_not)
    
        #計時終點
        end = time.time()
        spend = end - start
        hour = spend // 3600
        minu = (spend - 3600 * hour) // 60
        sec = spend - 3600 * hour - 60 * minu
        print(f'一共花費了{hour}小時{minu}分鐘{sec}秒')
    

    2.3 輸出800字機率表

  3. 安裝R與RStudio

    3.1 R

    • 請到官方載點下載安裝檔。
    • 依照作業系統選擇,此處以Windows10作業系統為例。(目前R-4.1.1-win)
    • 開啟安裝檔後,連續點選下一步,完成安裝。

    3.2 RStudio

    • 請到官方載點下載安裝檔。

    • 依照作業系統選擇,此處以Windows10作業系統為例。(目前是RStudio-2021.09.0-351.exe)

    • 開啟安裝檔後,連續點選下一步,完成安裝。


小結

  1. 今天順利獲得每個模型輸出800字機率表後,先安裝R與RStudio,以備明日之用。
  2. 下一章,將和大家分享如何隨機加權組合奇數個模型,再找出每個中文字的閾值,達成優化模型與判定isnull的目的。

讓我們繼續看下去...


上一篇
【第19天】訓練模型-驗證與比較訓練成果
下一篇
【第21天】訓練模型-模型組合與辨識isnull(二)
系列文
手寫中文字之影像辨識31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言