昨晚打第四劑疫苗,今天早上開始頭痛、手臂痛,後來實在有點快體力不支,在工作學姐們建議下跟老闆請了半天假,回到家吃完午餐,直接在床上睡了2.5小時,感覺好多了~~
起床後就開始趕鐵人賽的文章,今天進度很不錯~塞翁失馬,焉知非福XD
但晚餐後開始狂拉肚子(肚子超痛那種嗚嗚),接近快要22:30又開始感到超冷,一直顫抖~~ 決定速速完成今天的發文!
1.下載公開測試集圖片(共11148張)&確認上傳格式(下圖)
2.使用前幾天訓練並儲存好的模型進行公開測試集資料預測
Step1: Load the Pretrained model: AlexNet
test_data_path = str(prjt_path + r"\test_data") # 競賽給的公開測試資料集
output_path = str(prjt_path + r"\output")
AlexNet_path_model = str(output_path + "./ALL_AlexNet_model.pkl")
model_alexnet = torch.load(AlexNet_path_model)
model_alexnet.eval()
Step2: Load test data (載入競賽平台提供的公開測試資料集)
(1)載入資料位置
ALL_test_data_path = test_data_path
print('Total test images:', len(os.listdir(ALL_test_data_path)))
共有11148張測試集圖片
(2)自建Dataset
t = transforms.Compose([
transforms.ToPILImage(), # first convert the numpy array to a PIL Image
transforms.ToTensor(), # you can add other transformations in this list
transforms.Resize(size=(255, 255))
])
class CustomImageDataset_NOT_label(Dataset):
def __init__(self, transform=None, target_transform=None):
self.img_name = os.listdir(ALL_test_data_path)
#print(self.img_name[100])
self.transform = transform
self.target_transform = target_transform
def __len__(self):
return len(self.img_name)
def __getitem__(self, idx):
#print(self.img_name[100])
img_path = os.path.join(test_data_path, str(self.img_name[idx]))
img_specific_name = self.img_name[idx]
image = read_image(img_path)
if self.transform:
image = self.transform(image)
return img_specific_name, image
test_dataset = CustomImageDataset_NOT_label(transform=t) # same size to each img
print(test_dataset[1][1]) # 第一張圖片的 tensor
print(test_dataset[1][0]) # 第一張圖片的 檔案名稱: 0006061f-abda-4e2b-a07f-506ce19a0efc.jpg
print(len(test_dataset))
(3)自建Dataloader(without label)
以前2個batch進行測試
batch_size = 10 # 一個batch有10張圖片
# all test data
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size)
print(len(test_loader)) # 1115
Step3: Use a saved model for inference: (Predict for test data)
def test(model, test_loader, optimizer): # predict
model.eval()
with torch.no_grad():
ALL_img_name_list = [] # jpg檔名
ALL_pred_class_str_list = [] # 預測類別index對應的字串
for i, data in enumerate(tqdm(test_loader)):
img_name_list, x = data # <class 'tuple'>, tensor
x = x.cuda()
optimizer.zero_grad()
y_hat = model(x) # tensor, torch.Size([10, 33])
pred_class_idx = torch.max(y_hat, 1)[1]
pred_class_idx = pred_class_idx.detach().cpu().numpy() # <class 'numpy.ndarray'>, (10, 1)
ALL_img_name_list.extend(img_name_list)
pred_class_str = list(map(class_names_dict.get, pred_class_idx)) # list, 預測類別的字串種類
ALL_pred_class_str_list.extend(pred_class_str)
return ALL_img_name_list, ALL_pred_class_str_list
Step4:將以上輸出轉成類別字串,以符合平台上傳要求
test_flag = True
optimizer_conv = torch.optim.SGD(model_alexnet.classifier[6].parameters(), lr=0.001, momentum=0.9)
optimizer = optimizer_conv
def use_save_model_to_predict(test_flag, save_model):
if test_flag:
model = save_model
model.eval()
ALL_img_name_list, ALL_pred_class_str_list = test(model, test_loader, optimizer)
return ALL_img_name_list, ALL_pred_class_str_list
ALL_img_name_list, ALL_pred_class_str_list = use_save_model_to_predict(test_flag = True, save_model=model_alexnet)
prediction_df = pd.DataFrame(
{'filename': ALL_img_name_list,
'label': ALL_pred_class_str_list})
prediction_df.to_csv(output_path + "./AlexNet_preditions_1014.csv", index=False)
完成預測資料程式碼撰寫,目前正在進行多個模型在公開測試集資料預測。
因共有1萬多張圖片要進行預測,需要時間進行運算,結果應該可以在明天和大家分享,剩下兩個模型: EfficientNet和ResNet,若預測結果明天還沒出來,則會以鐵人賽季後賽
的形式和大家分享~
心得小語:
身體洗三溫暖的一天,但今天進度不錯,非常開心!! 美中不足是一直狂拉肚子&畏寒,但是一定比中鏢得COVID好一點啦,感恩一切~明天就是鐵人賽最終日啦!!
今日工時: 50min*5
我不害怕明天,因為我經歷過昨天,也熱愛今天
I am not afraid of tomorrow for I have seen yesterday and love today.