我們完成了資料的爬蟲採集和人工清洗。今天,我們要將這些乾淨的圖片「精加工」:先進行結構化分割,然後實作 PyTorch/Fast.ai 的資料DataLoader,最後結合 Day 17 我們提及的遷移學習理論,正式啟動我的多模型 Stage 1 訓練。
一、數據準備最後環節:8:1:1 資料分割
在訓練之前,必須將清洗好的圖片進行嚴格的 8:1:1 資料分割:80% 訓練集、10% 驗證集、10% 測試集。這一步確保了我的模型評估是科學且客觀的。
# 程式碼實作:隨機分配檔案並建立 train/val/test 資料夾結構
import os, random, shutil
MY_PROJECT_PATH = '/content/drive/MyDrive/My_Disaster_Project/'
SOURCE_ROOT = os.path.join(MY_PROJECT_PATH, 'Disaster_Crawler_Cleaned/')
TARGET_ROOT = os.path.join(MY_PROJECT_PATH, 'Disaster_Data_Processed/')
SPLIT_RATIOS = {'train': 0.8, 'val': 0.1, 'test': 0.1}
CLASSES = ['Drought', 'Tsunami', 'Tornado', 'Sandstorm'] # 假設的類別
for class_name in CLASSES:
二、實作 PyTorch 資料載入管線 (DataLoader)
資料分割完成後,我的資料夾結構符合 Fast.ai 的 ImageFolder 要求。我現在實作 DataLoader,它同時完成了數據載入、資料擴增和標準化 。
from fastai.vision.all import *
source = 'your_data_root_path' # 指向 TARGET_ROOT
dls = DataBlock(
blocks=(ImageBlock, CategoryBlock), # 圖像與類別的數據結構
get_items=get_image_files, # 獲取資料夾內所有圖像文件
# 根據父資料夾 'train'/'val' 分割
splitter=GrandparentSplitter(train_name='train', valid_name='val'),
get_y=parent_label, # 將父資料夾名稱作為標籤
item_tfms=Resize(460), # 調整圖像大小
# 批量級別的資料增強:尺寸為 224,並自動包含 ImageNet 標準化
batch_tfms=aug_transforms(mult=2, min_scale=0.5, size=224)
).dataloaders(source, bs=32) # 使用 Batch Size=32 載入數據
註:batch_tfms=aug_transforms(size=224) 這一行是核心。它對訓練集執行了隨機翻轉、旋轉等資料擴增,並將所有圖片轉換為224 X 224尺寸,同時進行了 ImageNet 標準化,確保數據格式與遷移學習基底模型的要求一致。
# 檢查 Dataloaders 資訊
print(f"總共的類別: {dls.vocab}")
print(f"訓練集樣本數: {len(dls.train_ds)} 張")
print(f"驗證集樣本數: {len(dls.valid_ds)} 張")
# 觀察一個批次的數據
dls.show_batch(max_n=4) #

註:視覺化驗證: dls.show_batch 顯示了經過資料擴增後的圖像,證明我的數據已成功轉化為模型可食用的食糧。
