iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
AI & Data

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

【第19天】訓練模型-驗證與比較訓練成果

  • 分享至 

  • xImage
  •  

摘要

  1. Test資料集驗證

    1.1 單張圖檔預測

    1.2 多張圖檔預測

  2. 五個模型的準確度對照表

  3. 心得


內容

  1. Test資料集驗證

    1.1 單張圖檔預測

    • 程式碼
    from tensorflow.keras.preprocessing import image
    from keras.models import load_model
    from keras import backend as K
    import numpy as np
    import os
    
    # 關閉GPU加速功能(建議安裝無GPU版本,縮短初始化時間)
    os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
    
    # 開啟800字典
    words_path = './800_words.txt'
    file1 = open(words_path, 'rt', encoding='Big5')
    labels = list(file1.read())
    file1.close()
    
    # 載入模型
    model = load_model('./model/xception_v2/Xception_retrained_v2.h5')
    
    # 讀取照片
    img_path = './data/test/丁/丁_0.jpg'
    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) # 轉換通道
    img = img/255 # rescale
    
    # 計算機率與預測結果
    pred = model.predict(img)[0]
    print(pred) # 機率list
    index = np.argmax(pred)
    prediction = labels[index]
    print(prediction) # 預測結果
    
    • 輸出:印出800字的機率,並取機率最大的中文字,作為辨識結果。
      • 圖檔

      • 結果

    1.2 多張圖檔預測:以flow_from_directory抽取每個epoch的預測樣本,再逐次載入記憶體進行預測。

    • 程式碼
    from keras.preprocessing.image import ImageDataGenerator
    from keras.models import load_model
    from keras import backend as K
    
    # 關閉GPU加速功能
    # os.environ["CUDA_VISIBLE_DEVICES"]="-1"
    
    # 載入模型
    K.clear_session()
    model = load_model('./model/densenet201_v2/10011/Densenet201_checkpoint_v2.h5')
    
    # 設定參數
    test_dir = './data/test'
    batch_size = 64
    target_size = (80, 80)
    
    # 圖檔前處理
    test_datagen = ImageDataGenerator(rescale=1./255)
    
    #從Test資料集抽取每批驗證圖檔
    test_generator = test_datagen.flow_from_directory(test_dir,
                                       target_size=target_size,
                                       batch_size=batch_size, shuffle=False)
    
    # 驗證test準確率
    test_generator.reset()
    test_loss, test_acc = model.evaluate_generator(test_generator,    steps=test_generator.samples//batch_size, verbose=1)
    print('test acc:', test_acc)
    print('test loss:', test_loss)
    
    • 輸出:
      • Train Accuracy/Loss與Test Accuracy/Loss。
      • Train資料集:預測174,808張圖檔;Test資料集:預測38277張圖檔
  2. 五個模型的準確率對照表

  3. 總結:

    3.1 以前只是單純載入預訓練模型,隨機調整參數,訓練後挑選出效果不錯的模型。這是第一次看論文,耗費大量時間精力,剛開始研讀的前幾天,真的挺痛苦的,進度也因此延誤。但了解模型的核心理念與架構後,有漸入佳境的感覺,獲益良多。

    3.2 由於IceptionV4最新版的預訓練模型,在Keras中有權重不匹配的問題,目前採用不載入權重的重新訓練,需要耗費更多時間。從對照圖得知,IceptionV4從頭訓練效果不好,故後續先不考慮此模型。

    3.3 此外,前五天的模型架構與原理的分享,如果內文敘述有誤,歡迎大家提出意見,謝謝。


小結

  1. 下一步,我們想利用加權的方式組合多個模型,找出各模型權重後,計算出800個中文字的加權機率,再以機率最高的中文字作為模型預測結果。
  2. 我們以R語言撰寫,進行模型加權權重計算。在此之前,需要先取得各個模型輸出之800字機率表。故下一章,目標是:「和大家介紹模型權重計算的前置作業」。

讓我們繼續看下去...


參考資料


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

尚未有邦友留言

立即登入留言