作業流程(今日進度為1.1~1.2)
1.1 獲得各模型800字機率表。(包括官方800字內、官方800字外與測試賽資料集)
1.2 安裝R與RStudio。
1.3 設定資料集路徑
1.4 找出每個中文字的閾值。(如何選擇isnull的閾值)
1.5 任意選擇奇數個模型組合後,產生模型權重表與利用新模型權重得到的機率表。(如何選擇加權依據)
1.6 判斷isnull。(如何選擇判斷isnull的依據)
1.7 交叉驗證不同方法組合的模型準確率。(共 2 * 2 * 2 = 8種)
獲得各模型800字機率表
2.1 預測樣本
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字機率表
安裝R與RStudio
3.1 R
3.2 RStudio
請到官方載點下載安裝檔。
依照作業系統選擇,此處以Windows10作業系統為例。(目前是RStudio-2021.09.0-351.exe)
開啟安裝檔後,連續點選下一步,完成安裝。
讓我們繼續看下去...