์์ ๋ฐ์ดํฐ์ ์ผ๋ก๋ CNNs ํ์ต์ ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ.
๋งค์ฐ ํฐ ๋ฐ์ดํฐ์ (์. 100๊ฐ์ง ๋ถ๋ฅ์ ๋ํด 120๋ง๊ฐ์ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ ImageNet)์์ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง(ConvNet)์ ๋ฏธ๋ฆฌ ํ์ตํ ํ, ์ด ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง์ ๊ด์ฌ์๋ ์์ ์ ์ํ ์ด๊ธฐ ์ค์ ๋๋ ๊ณ ์ ๋ ํน์ง ์ถ์ถ๊ธฐ(fixed feature extractor)๋ก ์ฌ์ฉํ๋ค.
- fine tuning - ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์๋ก์ด ๋ฌธ์ ์ ์ ์ฉํ๊ธฐ ์ํด ์ผ๋ถ ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ๋ ํ์ต ๊ณผ์
- ๊ณ ์ ๋ ํน์ง ์ถ์ถ๊ธฐ๋ก์จ์ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง- ๋ง์ง๋ง์ ์์ ํ ์ฐ๊ฒฐ ๋ ๊ณ์ธต์ ์ ์ธํ ๋ชจ๋ ์ ๊ฒฝ๋ง์ ๊ฐ์ค์น๋ฅผ ๊ณ ์ . ์ด ๋ง์ง๋ง์ ์์ ํ ์ฐ๊ฒฐ๋ ๊ณ์ธต์ ์๋ก์ด ๋ฌด์์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ณ์ธต์ผ๋ก ๋์ฒด๋์ด ์ด ๊ณ์ธต๋ง ํ์ต.
model_ft = models.resnet18(pretrained=True)
num_ftrs = model_ft.fc.in_features
# ์ฌ๊ธฐ์ ๊ฐ ์ถ๋ ฅ ์ํ์ ํฌ๊ธฐ๋ 2๋ก ์ค์ ํฉ๋๋ค.
# ๋๋, nn.Linear(num_ftrs, len (class_names))๋ก ์ผ๋ฐํํ ์ ์์ต๋๋ค.
model_ft.fc = nn.Linear(num_ftrs, 2)
model_ft = model_ft.to(device)
criterion = nn.CrossEntropyLoss()
# ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ค์ด ์ต์ ํ๋์๋์ง ๊ด์ฐฐ
optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)
# 7 ์ํญ๋ง๋ค 0.1์ฉ ํ์ต๋ฅ ๊ฐ์
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
# ํ์ต ๋ฐ ํ๊ฐ
model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
num_epochs=25)
model_conv = torchvision.models.resnet18(pretrained=True)
for param in model_conv.parameters():
param.requires_grad = False
# ์๋ก ์์ฑ๋ ๋ชจ๋์ ๋งค๊ฐ๋ณ์๋ ๊ธฐ๋ณธ๊ฐ์ด requires_grad=True ์
num_ftrs = model_conv.fc.in_features
model_conv.fc = nn.Linear(num_ftrs, 2)
model_conv = model_conv.to(device)
criterion = nn.CrossEntropyLoss()
# ์ด์ ๊ณผ๋ ๋ค๋ฅด๊ฒ ๋ง์ง๋ง ๊ณ์ธต์ ๋งค๊ฐ๋ณ์๋ค๋ง ์ต์ ํ๋๋์ง ๊ด์ฐฐ
optimizer_conv = optim.SGD(model_conv.fc.parameters(), lr=0.001, momentum=0.9)
# 7 ์ํญ๋ง๋ค 0.1์ฉ ํ์ต๋ฅ ๊ฐ์
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_conv, step_size=7, gamma=0.1)
# ํ์ต ๋ฐ ํ๊ฐ
model_conv = train_model(model_conv, criterion, optimizer_conv,
exp_lr_scheduler, num_epochs=25)