DAY 3 : DataSet/Lodaer | EfficientNet

210825

Dataset/Loader

์˜ค๋Š˜์˜ ๋ฏธ์…˜์€ ๋ฐ์ดํ„ฐ์…‹๊ณผ ๋ฐ์ดํ„ฐ๋กœ๋”๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ. ์‚ฌ์‹ค ํ›„๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์—์„œ๋Š” ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์—†์ง€๋งŒ, ์ •๋ง๋กœ ๋ง‰์ƒ ์ฒ˜์Œ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๋„ˆ๋ฌด ๋ง‰๋ง‰ํ–ˆ๋‹ค. ๊ทธ๋งŒํผ ๋‚ด๊ฐ€ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๊ฑฐ๊ฒ ์ง€.

์ผ๋‹จ ์ฒ˜์Œ์—๋Š” ์บ๊ธ€์„ ์ฐธ๊ณ ํ–ˆ๋‹ค. ์บ๊ธ€ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ด ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ์–ด๋– ํ•œ ํ๋ฆ„์œผ๋กœ ์จ์ง€๋Š” ๊ตฌ๋‚˜๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ ์•Œ๊ฒŒ๋œ ๋ถ€๋ถ„์€ CFG ๋ผ๋Š” ๋”•์…”๋„ˆ๋ฆฌ ๋ณ€์ˆ˜์— ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ชจ๋‘ ์„ ์–ธํ•ด๋†“๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ๋” ์•Œ์•„๋ณด๋‹ˆ ์ด๋ฅผ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•˜๋Š” ์‚ฌ๋žŒ๋„ ์žˆ์—ˆ๋‹ค.

Config

DATA_DIR = './input/data/train/images/'
CFG = {
    'fold_num': 5,
    'seed': 719,
    'epochs': 30,
    'train_bs': 30,
    'valid_bs': 60,
    'T_0': 10,
    'lr': 1e-5,
    'max_lr': 1e-3,
    'weight_decay':1e-6,
    'num_workers': 8,
    'accum_iter': 2, # suppoprt to do batch accumulation for backprop with effectively larger batch size
    'verbose_step': 1,
    'device': torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
}
print(f'{CFG["device"]} is using!')

Train_test_split

์ดํ›„, Train data์™€ Valid data๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค. ์ด ๋•Œ๋Š” sklearn ์˜ train_test_split ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

  • ์ธ์ž๋กœ data ํ•˜๋‚˜๋งŒ ์ฃผ์–ด์ง€๋ฉด train_data ์™€ valid_data๋กœ ๋‚˜๋ˆ„์–ด ์ฃผ๋ฉฐ ์ธ์ž๋กœ data์™€ label์ด ์ฃผ์–ด์ง€๋ฉด trainX, trainY, validX, validY๋กœ ๋‚˜๋ˆ„์–ด์กŒ๋‹ค. ๋‚˜๋Š” ์ „์ž๊ฐ€ ํ•„์š”ํ•ด์„œ data ์ธ์ž ํ•˜๋‚˜๋งŒ ์ฃผ์—ˆ๋‹ค.

Transform

  • ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ 384 * 512์ด๋‹ค. ์–ผ๊ตด์ด ๋Œ€๋ถ€๋ถ„ ์ค‘์•™์— ์œ„์น˜ํ•˜๋ฏ€๋กœ CenterCrop์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. CenterCrop์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์„์ˆ˜๋ก GPU์‚ฌ์šฉ์ด ์ค„์–ด๋“ ๋‹ค. ์‹ค์ œ๋กœ ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ๋Š” batch size๋ฅผ ๋งค์šฐ ์ž‘๊ฒŒ ํ•ด์•ผ๋งŒ ๋Œ์•„๊ฐ”๋‹ค.

    • ์‚ฌ๋žŒ์˜ ์–ผ๊ตด ์ •๋ณด๋งŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ๋ฒฝ์ด๋‚˜ ์˜ท๋“ฑ์˜ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๊ฐ€ ํ•™์Šต์— ์˜คํžˆ๋ ค ๋ฐฉํ•ด๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

    • ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ๊ณ  ํ•˜๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด b4๊ฐ€ ํ•™์Šตํ•œ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋Š” 380์ด๋‹ค.

https://github.com/lukemelas/EfficientNet-PyTorch/issues/42
  • ๊ทธ ์™ธ์— ๋งŽ์€ Transform์„ ํ•ด์ฃผ์ง€๋Š” ์•Š์•˜๋‹ค. RandomChoice๋ฅผ ์‚ฌ์šฉํ•ด์„œ 4๊ฐœ์˜ trsf ๋ฅผ ์ž„์˜๋กœ ์ ์šฉ๋˜๋„๋ก ํ•ด์ฃผ์—ˆ๊ณ  ์ด ์•ˆ์— ์žˆ๋Š” ๋ณ€ํ™˜์€ ๋ฐ๊ธฐ, ์ฑ„๋„ ๋“ฑ์˜ ํ”ฝ์…€๊ฐ’ ๋ณ€ํ™˜์ด๋‹ค.

  • 1/2 ํ™•๋ฅ ๋กœ ์ขŒ์šฐ๋ฐ˜์ „์ด ์ผ์–ด๋‚˜๋„๋ก ํ–ˆ๋‹ค.

  • ToTensor ๋ฅผ ์ด์šฉํ•ด ํ…์„œ๋กœ ๋ณ€ํ™˜๋˜๊ฒŒ ํ–ˆ๊ณ  ์ •๊ทœํ™”๋ฅผ ํ–ˆ๋‹ค. ์ด ๋•Œ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๊ฐ’์€ train image์˜ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ ๊ฐ’์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ–ˆ๊ณ  ์ด๋ฅผ ์ƒ์ˆ˜๋กœ ๊ณ„์† ์“ฐ๋„๋ก ํ–ˆ๋‹ค.

    • seed๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์–ด์„œ ๊ณ„์† ๋˜‘๊ฐ™์€ train image๋กœ ๊ณ ์ •๋œ๋‹ค.

  • ๋‹จ์ˆœํžˆ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ๋ชจ๋“  ํ”ฝ์…€๊ฐ’์„ ํ•ฉํ•˜๊ณ  ์ด์—๋Œ€ํ•œ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

Dataset

  • init

    • dataframe์„ ์ธ์ž๋กœ ๋ฐ›๊ณ  ๊ทธ ์•ˆ์— ์žˆ๋Š” ํŠน์ • ์ปฌ๋Ÿผ์„ X์™€ y๋กœ ์ •ํ–ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” path ์™€ label ์ด๋‹ค.

  • getitem

    • PIL ํŒจํ‚ค์ง€์˜ Image ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™”๋‹ค. cv2 ๋ฅผ ์‚ฌ์šฉํ•  ๊นŒ ํ–ˆ์ง€๋งŒ BGR๋กœ ์ฝ์–ด์ง€๊ณ  ์ด๋ฅผ ๋งค๋ฒˆ convert ํ•ด์ค˜์•ผ ํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค.

    • dataframe์—์„œ index๋กœ ์ ‘๊ทผํ•˜๋ ค๋ฉด iloc ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

    • image๋Š” transform์—์„œ ToTensor ๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ tensor ํ˜•ํƒœ๊ฐ€ ๋˜๋‹ˆ๊นŒ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ณ , label์€ tensor๋กœ ์บ์ŠคํŒ…ํ•ด์ค€๋‹ค.

  • ๋ฐ์ดํ„ฐ์…‹์„ ์ƒ์„ฑํ•œ๋‹ค.

DataLoader

  • ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์˜ ๋ฐฐ์น˜ ์‚ฌ์ด์ฆˆ๋Š” ์ž‘๊ฒŒ ํ–ˆ๊ณ  ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ์˜ ๋ฐฐ์น˜ ์‚ฌ์ด์ฆˆ๋Š” 2๋ฐฐ๋กœ ์„ค์ •ํ–ˆ๋‹ค,

    • ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์˜ ๋ฐฐ์น˜ ์‚ฌ์ด์ฆˆ๋Š” 30 ๋˜๋Š” 60์œผ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

EfficientNet

์‚ฌ์‹ค, ์—ฌ๋Ÿฌ ๋ชจ๋ธ์„ ์ฐพ์•„๋ณด๊ณ  ์‹คํ—˜์„ ํ†ตํ•ด ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งž์ง€๋งŒ, ์—ฌ๋Ÿฌ ์ด์œ ๋ฅผ ํ†ตํ•ด EfficientNet์„ ์ œ์ผ ๋จผ์ € ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

  • ์ด์ „ 1๊ธฐ ๋ฉค๋ฒ„์˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜๋‹ˆ EfficientNet ์‚ฌ์šฉ

  • ์ด๋ฏธ์ง€๋„ท ๋ฆฌ๋”๋ณด๋“œ์—์„œ EfficientNet์ด 3๋“ฑ์ด๋‹ค.

    • ๊ทธ๋ž˜์„œ ๋‚ด์ผ 1, 2๋“ฑ ๋ชจ๋ธ์ธ ViT๋„ ์‚ฌ์šฉํ•ด๋ณผ ์˜ˆ์ •

  • ๋ฉ˜ํ† ๋‹˜์˜ ์ถ”์ฒœ

์ƒ๊ฐ๋ณด๋‹ค ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์€ ์‰ฌ์› ๋‹ค.

๋˜, ๋ชจ๋ธ๋“ค์„ ๋ชจ์•„๋†“์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ timm ์„ ์‚ฌ์šฉํ•ด์„œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜๋„ ์žˆ์—ˆ๋‹ค. efficientnet ๋ชจ๋ธ์˜ ์ข…๋ฅ˜๋Š” ๊ต‰์žฅํžˆ ๋งŽ๋‹ค.

๋‚˜๋Š” ์ด ์ค‘์—์„œ efficientnet_b4 ๋ชจ๋ธ์„ ์„ ํƒํ–ˆ๋‹ค. ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • b7 ์‹œ๋ฆฌ์ฆˆ ๋ถ€ํ„ฐ๋Š” V100 ์œผ๋กœ ๋Œ๋ฆด ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค.

    • ์ด ๋‹น์‹œ batch_size๋Š” 30์ด๋‹ค. ๋” ์ž‘๊ฒŒํ–ˆ์œผ๋ฉด ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์—ˆ๊ฒ ์ง€๋งŒ, 15,000 ์žฅ์˜ ๋ฐ์ดํ„ฐ์…‹์„ ์—ฌ๋Ÿฌ epoch๋ฅผ ๋Œ๋ ค๊ฐ€๋ฉฐ ํ™•์ธํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ ์–ด๋„ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • b5 ์‹œ๋ฆฌ์ฆˆ ๋ถ€ํ„ฐ๋Š” pretrained=True ์ธ ๋ชจ๋ธ์ด ์—†๋‹ค. ์ฆ‰ b4 ๊นŒ์ง€๋งŒ pretrained ๋œ ๋ชจ๋ธ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ–ˆ๋‹ค.

์‹ค์ œ๋กœ pretrained์˜ ํž˜์€ ์—„์ฒญ๋‚ฌ๋Š”๋ฐ, ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • 7๋ฒˆ ์ดํ•˜์˜ ์ ์€ epoch ์ˆ˜๋กœ๋„ train data๊ฐ€ ์™„์ „ํžˆ ํ•™์Šต๋˜์—ˆ๋‹ค. ๊ทธ๋งŒํผ ์ ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

  • ๋”ฐ๋ผ์„œ, ์ ์€ epoch ์•ˆ์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‹คํ—˜์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. Loss ํ•จ์ˆ˜๋Š” ์–ด๋–ค๊ฒƒ์ด ์ข‹๊ณ , Lr Scheduler๋Š” ์–ด๋–ค ๊ฒƒ์ด ์ข‹๊ณ  ๋“ฑ์˜ ์‹คํ—˜.

  • ๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด, pretrained ๋œ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ๋ฉด ์˜ค๋ฒ„ํ”ผํŒ… ๋˜๋Š” ์‹œ์ ์˜ epoch๋ฅผ ์•Œ๊ธฐ๊ฐ€ ์–ด๋ ค์› ๊ณ , ๋งค๋ฒˆ ๋ฐ”๋€” ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๋‹ค. ๋˜, ์‹œ๊ฐ„๋„ ๋งŽ์ด ์†Œ์š”๋˜์–ด ์–ด๋–ค ์‹คํ—˜์„ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ , early stopping ๊ฐ™์ด ๋ถ€์ˆ˜์ ์ธ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.

์‚ฌ์‹ค, ํ•œ๋ฒˆ 50~100 epoch ์”ฉ ๋Œ๋ฆฌ๋ฉด์„œ ํ•™์Šต ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ์ œ์ถœ์— ๋Œ€ํ•œ ์••๋ฐ•๋„ ์žˆ์—ˆ๊ณ , ์—ฌ๋Ÿฌ ์‹คํ—˜๋„ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ๋˜, ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํ…Œํฌ๋‹‰์„ ํ•ด๋ณผ๊ฒŒ ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์•„์‰ฝ์ง€๋งŒ ๊ทธ๋ž˜๋„ pretrained ๋œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด์„œ ๋˜ ๋‹ค์–‘ํ•œ ์‹คํ—˜๊ณผ ํ…Œํฌ๋‹‰์„ ์ ์šฉํ–ˆ๊ธฐ์— ํ›„ํšŒ๋Š” ์—†๋‹ค.

์•„๋ฌด๋Ÿฐ ํ…Œํฌ๋‹‰์„ ์ ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ๋ ธ์„ ๋•Œ์˜ f1 ์ ์ˆ˜๋Š” 60์  ์ค‘๋ฐ˜ ์ •๋„๊ฐ€ ๋‚˜์™”๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ์ ์ˆ˜๊ฐ€ ๋‚ฎ๋„ค ์‹ถ์—ˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ํ…Œํฌ๋‹‰์„ ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ์žˆ๋‹ค.

Last updated

Was this helpful?