Part2-16 Optimizer 및 Training
사용한 모델
Optimization
model = Net().to(device)
optimizer = optim.SGD(model.parameters(),lr = 0.001, momentum=0.5)
#파라미터 확인 tensorflow처럼 summary가 없음
params = list(model.parameters())
for i in range(8):
print(params[i].size())
>>> torch.Size([20, 1, 5, 5]) #
torch.Size([20])
torch.Size([50, 20, 5, 5])
torch.Size([50])
torch.Size([500, 800])
torch.Size([500])
torch.Size([10, 500])
torch.Size([10])
#모델 학습하기 전에는 train모드로 변경해서 학습 진행
model.train() #train mode
# device에 compile
data, target = data.to(device), target.to(device)
#옵티마이저 사용전에 클리어 한번 해줘야함
optimizer.zero_grad()
#예측
output = model(data)
#Nagative Log_likelihood loss 사용
loss = F.nll_loss(output, target)
# backpropagation으로 기울기 계산, 계산하고 끝이 아님
loss.backward()
#옵티마이저에 업데이트해야함
optimizer.step()
training
epochs = 1
log_interval = 100
for epoch in range(1, epochs+1):
#Train mode
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
if batch_idx % log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100 * batch_idx / len(train_loader), loss.item()
))
Evaluation
1epoch로 테스트
#평가모드로 전환
model.eval()
test_loss = 0
correct = 0
#테스트모드에서는 backpropagation, gradient 계산 등을 꺼서 메모리 사용량을 감소시켜 속도증가
with torch.no_grad():
data, target = next(iter(test_loader))
data, target = data.to(device), target.to(device)
output = model(data)
#계산용
test_loss += F.nll_loss(output, target, reduction='sum').item() #reduction으로 하나의 스칼라 값으로 나오게 함
pred = output.argmax(dim= 1, keepdim = True)
correct = pred.eq(target.view_as(pred)).sum().item() #예측값과 비교해서 정답인지 확인
test_loss
>>>26.188135147094727
output.shape
torch.Size([64, 10])
pred.shape #argmax했기 때문
>>> torch.Size([64, 1])
pred.eq(target.view_as(pred)).sum().item() /64 #정답률
>>> 0.890625
전체연산
1 epoch 학습하고 평가하여 epoch수만큼 반복
#학습하고 테스트
for epoch in range(1, epochs+1):
#Train mode
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
if batch_idx % log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100 * batch_idx / len(train_loader), loss.item()
))
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
test_loss += F.nll_loss(output,target, reduction='sum').item()
pred = output.argmax(dim = 1, keepdim =True)
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
print('\nTest set: Average Loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset), 100 * correct / len(test_loader.dataset)))
Part2-18 Tensorflow와 pytorch 비교
두 방법 모두 데이터-모델설계-Optimization-Train-Evaluation
하이퍼파라미터는 import 아래에 보통 넣어둠
Tensorflow 방법
fit, evaluation으로 진행
pytorch방법
Data_loader를 사용해서 데이터를 불러오는 과정 필요
tensorflow처럼 프로그래스바가 생성되지 않아 직접 생성해야함
인채널, 아웃채널 지정해줘야함
예제상에서는 tensorflow가 데이터를 불러오기 쉬워보이나,
실제 데이터에서는 pytorch도 유리한점이 있음
fit, evaluation을 더 풀어서 진행
compile후 training하면서 loss, opimater 지정

'책&강의 학습 > 올인원 패키지 :딥러닝&인공지능' 카테고리의 다른 글
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 10회차 미션 (0) | 2020.07.08 |
|---|---|
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 9회차 미션 (0) | 2020.07.07 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 7회차 미션 (0) | 2020.07.05 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 6회차 미션 (0) | 2020.07.04 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 5회차 미션 (0) | 2020.07.03 |
댓글