Kaggle資料集
範例為貓狗辨識的例子,要確認以下幾點:
資料集結構
根據資料的特性選擇合適的資料結構。例如: 對於結構化資料,可以使用 DataFrame(如 pandas);對於圖像資料,可以使用 NumPy 數組或 PyTorch 的 Tensor。這邊採用Tensor。
train_dir = '/kaggle/working/dataset/train_set/'
test_dir = '/kaggle/working/dataset/test_set/'
class dataset(torch.utils.data.Dataset):
def __init__(self, file_path, transform = None):
self.file_path = file_path
self.file_list = glob.glob(file_path+'*/*.jpg')
self.transform = transform
def __len__(self):
return len(self.file_list)
def __getitem__(self,idx):
img_path = self.file_list[idx]
image = Image.open(img_path)
if self.transform:
img = self.transform(image)
label = img_path.split('/')[-1].split('.')[0]
if label == 'dog':
label = 1
elif label == 'cat':
label = 0
return img, label
train_dataset = dataset(train_dir, transform)
test_dataset = dataset(test_dir, transform)
dataset 要回傳一組 (img, label)
比如現在idx=50,看到 getitem 的 function
img_path = self.file_list[idx]
:他會抓 file_list中第51個資料在讀取資料時進行預處理(如標準化、正則化等),可以確保資料的一致性和質量。這可以在自定義的 Dataset 類中實現。
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean = [0.4883, 0.4551, 0.4170], std = [0.2276, 0.2230, 0.2233]),
transforms.Resize([64, 64])
])
為什麼要用到 Data Augmentation?
增加資料量
資料增強可以有效地增加訓練資料的數量,這對於小規模資料集特別有用。通過生成更多的資料樣本,模型可以學習到更多的特徵,從而提高其性能。
提高模型的泛化能力
資料增強可以幫助模型學習到更廣泛的特徵,從而提高其在未見過的資料上的表現。這是因為資料增強引入了資料的多樣性,使模型不僅僅依賴於訓練資料中的特定模式。
減少過擬合
過擬合是指模型在訓練資料上表現良好,但在測試資料上表現不佳。資料增強通過引入隨機變換,可以使模型更難記住訓練資料中的具體樣本,從而減少過擬合的風險。
模擬真實世界的變化
在實際應用中,資料可能會受到各種變化的影響,例如旋轉、縮放、平移等。資料增強可以模擬這些變化,使模型在面對真實世界資料時更加穩健。
在明天章節會詳細介紹各種 Data Augmentation 方法
# 定義資料增強
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(10),
transforms.ToTensor(),
transforms.Normalize(mean = [0.4883, 0.4551, 0.4170], std = [0.2276, 0.2230, 0.2233]),
transforms.Resize([64, 64])
])
將資料集分割為訓練集、驗證集和測試集,以便在不同階段評估模型的性能。可以使用 sklearn 的 train_test_split 函數來實現,也可以使用torch的。
train_set, val_set = torch.utils.data.random_split(train_dataset, [7000, 1000])
# 7000筆,1000筆
常用在訓練時,可以幫忙看大概一個 epoch 耗時需要用多久時間。方便計算大概要花多久時間才能完成訓練。
pytorch 要自己寫才會產生進度條,如果是 pytorch lightning 就有預設可以直接使用(包含log file)。
from tqdm import tqdm
import time
epoches = 50
for epoch in tqdm(range(epoches)):
time.sleep(50)
可以用 logger.info 紀錄每個 iteration 的重要參數和指標。
# 設置logging模組
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filename='data_reading.log', filemode='w')
logger = logging.getLogger("logger_name")
logger = logging.StreamHandler()
logger.setLevel(logging.DEBUG)
logger.info("Epoch[{}] Iteration[{}/{}] Loss: {:.3f}, Acc: {:.3f}, Base LearningRate: {:.2e}".format(epoch, (n_iter + 1), len(train_loader), loss.avg, acc.avg, base_lr))