In [1]데이터 로더
full_train_dataset = ImageFolder('./dataset_intel_img_cls/seg_train', transform=transform)
test_dataset = ImageFolder('./dataset_intel_img_cls/seg_test', transform=transform)
val_size = int(len(full_train_dataset) * 0.2)
train_size = len(full_train_dataset) - val_size
train_dataset, val_dataset = random_split(full_train_dataset, [train_size, val_size])
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
len(train_dataset), len(val_dataset), len(test_dataset), len(full_train_dataset.classes)
Out[1] 출력 보기
(11228, 2806, 3000, 6)
In [2]r1: 동결 + 분류기 교체
model = convnext_tiny(weights=ConvNeXt_Tiny_Weights.DEFAULT)
for param in model.parameters():
param.requires_grad = False
model.classifier[-1] = nn.Linear(in_features=768, out_features=6, bias=True)
trainable_params = filter(lambda p: p.requires_grad, model.parameters())
optimizer = optim.Adam(trainable_params, lr=1e-4)
Out[2] 출력 보기
[Epoch 1/20] train_loss=0.8935 train_acc=0.7882 | val_loss=0.4816 val_acc=0.8899
...
[Epoch 20/20] train_loss=0.1749 train_acc=0.9379 | val_loss=0.1811 val_acc=0.9373
총 학습 시간: 2208.6초
In [3]r2: features.7 미세조정
for name, param in model.named_parameters():
if name.startswith('features.7'):
param.requires_grad = True
trainable_params = filter(lambda p: p.requires_grad, model.parameters())
optimizer = optim.Adam(trainable_params, lr=1e-5)
Out[3] 출력 보기
[FT Epoch 7/10] train_loss=0.0846 train_acc=0.9730 | val_loss=0.1550 val_acc=0.9487
...
Early stopping at epoch 10
fine-tuning 학습 시간: 1155.4초
In [4]test 평가
eval_model = convnext_tiny()
eval_model.classifier[-1] = nn.Linear(eval_model.classifier[-1].in_features, num_classes)
eval_model.load_state_dict(torch.load('best_convnext_intel_finetune.pth', map_location=device))
eval_model.to(device).eval()
correct, total = 0, 0
with torch.no_grad():
for data, label in test_loader:
pred = eval_model(data.to(device))
correct += (pred.argmax(dim=1) == label.to(device)).sum().item()
total += data.size(0)
print(f'Test Accuracy: {correct/total:.4f}')
Out[4] 출력 보기
Test Accuracy: 0.9440