1. Package load
2. 데이터셋 다운로드 및 훈련, 검증, 테스트 데이터셋 구성
3. 하이퍼파라미터 세팅
4. Dataset 및 DataLoader 할당
5. 네트워크 설계
6. train, validation, test 함수 정의
7. 모델 저장 함수 정의
8. 모델 생성 및 Loss function, Optimizer 정의
9. Training
10. 저장된 모델 불러오기 및 test
11. Transfer Learning
import torch.optim as optim
# Optimizer를 생성합니다.
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 학습 과정(training loop)은 다음과 같습니다:
optimizer.zero_grad() # 변화도 버퍼를 0으로
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step() # 업데이트 진행
신경망(Neural Networks) — PyTorch Tutorials 1.11.0+cu102 documentation
Note Click here to download the full example code 신경망(Neural Networks) 신경망은 torch.nn 패키지를 사용하여 생성할 수 있습니다. 지금까지 autograd 를 살펴봤는데요, nn 은 모델을 정의하고 미분하는데 autograd
tutorials.pytorch.kr
6. train, validation, test 함수 정의
def train(num_epochs, model, data_loader, criterion, optimizer, saved_dir, val_every, device):
print('Start training..')
best_loss = 9999999
for epoch in range(num_epochs):
for i, (imgs, labels) in enumerate(data_loader):
imgs, labels = imgs.to(device), labels.to(device)
## 코드 시작 ##
outputs = model(imgs) # 위의 설명 1. 을 참고하여 None을 채우세요.
loss = criterion(outputs, labels) # 위의 설명 2. 를 참고하여 None을 채우세요.
optimizer.zero_grad() # Clear gradients: 위의 설명 3. 을 참고하여 None을 채우세요.
loss.backward() # Gradients 계산: 위의 설명 3. 을 참고하여 None을 채우세요.
optimizer.step() # Parameters 업데이트: 위의 설명 3. 을 참고하여 None을 채우세요.
## 코드 종료 ##
_, argmax = torch.max(outputs, 1)
accuracy = (labels == argmax).float().mean()
if (i+1) % 3 == 0:
print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}, Accuracy: {:.2f}%'.format(
epoch+1, num_epochs, i+1, len(data_loader), loss.item(), accuracy.item() * 100))
if (epoch + 1) % val_every == 0:
avrg_loss = validation(epoch + 1, model, val_loader, criterion, device)
if avrg_loss < best_loss:
print('Best performance at epoch: {}'.format(epoch + 1))
print('Save model in', saved_dir)
best_loss = avrg_loss
save_model(model, saved_dir)
train(num_epochs, model, train_loader, criterion, optimizer, saved_dir, val_every, device)
torch.nn.eval() -> model.eval()
def validation(epoch, model, data_loader, criterion, device):
print('Start validation #{}'.format(epoch) )
model.eval()
with torch.no_grad():
total = 0
correct = 0
total_loss = 0
cnt = 0
for i, (imgs, labels) in enumerate(data_loader):
imgs, labels = imgs.to(device), labels.to(device)
## 코드 시작 ##
outputs = model(imgs)
loss = criterion(outputs, labels)
## 코드 종료 ##
total += imgs.size(0)
_, argmax = torch.max(outputs, 1)
correct += (labels == argmax).sum().item()
total_loss += loss
cnt += 1
avrg_loss = total_loss / cnt
print('Validation #{} Accuracy: {:.2f}% Average Loss: {:.4f}'.format(epoch, correct / total * 100, avrg_loss))
model.train()
return avrg_loss
모델 검증 과정에서는 model.eval()을 통해 모델을 evaluation 모드로 작동해줘야 함을 기억하시기 바랍니다. Batch normalization 과 Dropout은 훈련과 검증시에 작동하는 방식이 다르기 때문입니다. 평가가 끝난 후에는 다시 model.train()을 통해 train 모드로 바꿔줘야 하는 사실도 잊지 마세요.
train time과 eval time에서 다르게 동작해야 하는 대표적인 예들은
- Dropout Layer
- BatchNorm Layer
.eval() 함수는 evaluation 과정에서 사용하지 않아야 하는 layer들을 알아서 off 시키도록 하는 함수인 셈이다.
evaluation/validation 과정에선 보통 model.eval()과 torch.no_grad()를 함께 사용한다고 한다.
validation을 할 때는 optimizer를 쓰지 않고 이미 있는 NN을 이용하여 정확도를 평가하는 것이다.
[PyTorch] model.eval() 의미
“Talk is cheap. Show me the code.”
bluehorn07.github.io
추론을 실행하기 전에는 반드시 model.eval() 을 호출하여 드롭아웃 및 배치 정규화를 평가 모드로 설정하여야 합니다. 이것을 하지 않으면 추론 결과가 일관성 없게 출력됩니다. 만약 학습을 계속하고 싶다면, model.train() 을 호출하여 학습 모드로 전환되도록 해야 합니다
'AI > PyTorch' 카테고리의 다른 글
[PyTorch] Conv1d, Conv2d 차이점 (0) | 2021.06.29 |
---|---|
[PyTorch] CNN 설계 7 - 9 (0) | 2021.06.15 |
[PyTorch] CNN 설계 5. 네트워크 설계 (0) | 2021.06.15 |
[PyTorch] CNN 설계 4. Dataset 및 DataLoader 할당 (0) | 2021.06.15 |
[PyTorch] torch.optim의 인자 model.parameters() (0) | 2021.06.15 |