어떤가요? 힘들게 정의한 네트워크와 사전 정의된 네트워크가 다르지 않습니다. 앞으로 ResNet을 사용할 필요가 있을 경우 사전 훈련된 모델을 코드 한두 줄로 불러와 사용하게 될 것입니다. 하지만 그 구조를 알고 사용하는 것과 모르고 사용하는 것은 큰 차이가 있습니다. 추후 네트워크를 변경하거나 입출력 텐서의 크기를 알고자 할 경우 네트워크를 알고 있다면 수정이 어렵지 않을 것입니다. 따라서 향후 논문에서 새로운 모델의 네트워크가 발표되더라도 그 구조부터 익히는 훈련이 필요합니다.
모델 학습을 위해 옵티마이저와 손실 함수를 정의합니다.
코드 6-82 옵티마이저와 손실 함수 정의
optimizer = optim.Adam(model.parameters(), lr=1e-7) ------ lr=1e-7은 1*10의 -7승을 의미
criterion = nn.CrossEntropyLoss()
model = model.to(device)
criterion = criterion.to(device)
모델이 얼마나 잘 학습되었는지 측정하기 위한 함수를 정의합니다.
코드 6-83 모델 학습 정확도 측정 함수 정의
def calculate_topk_accuracy(y_pred, y, k=2):
with torch.no_grad():
batch_size = y.shape[0]
_, top_pred = y_pred.topk(k, 1) ------ ①
top_pred = top_pred.t() ------ ②
correct = top_pred.eq(y.view(1, -1).expand_as(top_pred)) ------ ③
correct_1 = correct[:1].reshape(-1).float().sum(0, keepdim=True)
correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True) ------ 이미지의 정확한 레이블 부여를 위해 사용. 즉, 첫 번째 레이블이 아닌 정확한 레이블 부여를 위해 사용
acc_1 = correct_1 / batch_size
acc_k = correct_k / batch_size
return acc_1, acc_k