Pytorch 에서 모델 의 정확 도 를 구 하 는 두 가지 방법 소결

방법 1:epoch 과정 에서 직접 정확 도 를 구한다.
소개:이 코드 는 LeNet 5 에서 캡 처 한 것 입 니 다.

def train_model(model,train_loader):
    optimizer = torch.optim.Adam(model.parameters())
    loss_func = nn.CrossEntropyLoss()
    EPOCHS = 5
    for epoch in range(EPOCHS):
        correct = 0
        for batch_idx,(X_batch,y_batch) in enumerate(train_loader):
            optimizer.zero_grad()
            #             ,X_batch y_batch      ?
            # :X_batch y_batch      ,        ,  torch.utils.data.ipynb
            output = model(X_batch.float())   #X_batch.float()     
            loss = loss_func(output,y_batch)
            loss.backward()
            optimizer.step()
            
            # Total correct predictions
            #   1         ,   1          
 
            #             
            predicted = torch.max(output.data,1)[1]
            correct += (predicted == y_batch).sum()
            #print(correct)
            if batch_idx % 100 == 0:
                print('Epoch :{}[{}/{}({:.0f}%)]\t Loss:{:.6f}\t Accuracy:{:.3f}'.format(epoch,batch_idx * len(X_batch),len(train_loader.dataset),100.*batch_idx / len(train_loader),loss.data.item(),float(correct*100)/float(BATCH_SIZE)*(batch_idx+1)))
                
if __name__ == '__main__':
    myModel = LeNet5()
    print(myModel)
    train_model(myModel,train_loader)
    evaluate(myModel,test_loader,BATCH_SIZE)
방법 2:함 수 를 구축 한 다음 에 epoch 에서 이 함 수 를 호출 합 니 다.
소개:이 코드 는 타이 타 닉(타이 타 닉 호)데이터 분석 캡 처 입 니 다.

epochs = 10
log_step_freq = 30
 
dfhistory = pd.DataFrame(columns = ['epoch','loss',metric_name,'val_loss','val_'+metric_name])
print('Start Training...')
nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print('========='*8 + '%s'%nowtime)
 
for epoch in range(1,epochs+1):
    
    #1.    
    net.train()
    loss_sum = 0.0
    metric_sum = 0.0
    step = 1
    
    for step,(features,labels) in enumerate(dl_train,1):
        #    
        optimizer.zero_grad()
        
        #       
        predictions = net(features)
        loss = loss_func(predictions,labels)
        metric = metric_func(predictions,labels)
        
        #       
        loss.backward()
        optimizer.step()
        
        #  batch    
        loss_sum += loss.item()
        metric_sum += metric.item()
        if step%log_step_freq == 0:
            print(('[Step = %d] loss: %.3f,' + metric_name+': %.3f %%')%(step,loss_sum/step,100*metric_sum/step))
            
    #2,    
    net.eval()
    val_loss_sum = 0.0
    val_metric_sum = 0.0
    val_step =1
        
    for val_step,(features,labels) in enumerate(dl_valid,1):
        #      
        with torch.no_grad():
            pred = net(features)
            val_loss = loss_func(pred,labels)
            val_metric = metric_func(labels,pred)
        val_loss_sum += val_loss.item()
        val_metric_sum += val_metric.item()
            
    #3,    
    info = (epoch,loss_sum/step,100*metric_sum/step,
            val_loss_sum/val_step,100*val_metric_sum/val_step)
    dfhistory.loc[epoch-1] = info
        
    #  epoch    
    print(('
EPOCH = %d,loss = %.3f,' + metric_name+\ '=%.3f %%,val_loss = %.3f'+' val_'+metric_name+'= %.3f %%')%info) nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print('
'+'=========='*8 + '%s'%nowtime) print('Finishing Training...')
보충:Pytorch 는 Top 1 정확도 와 Top 5 정확도 실현
이전 에는 Top 1 과 Top 5 가 무엇 인지 잘 몰 랐 는데 사실은 매우 간단 하 다.바로 두 가지 평가 기준 이다.그 중에서 Top 1 은 일반적인 Accuracy 이 고 Top 5 는 Top 1 의 평가 기준 보다 더욱 엄격 하 다.
구체 적 으로 말 하면,예 를 들 어 모두 10 가지 로 나 누 어야 한다.매번 분류 기의 출력 결 과 는 10 개 를 1 로 더 한 확률 값 이다.Top 1 은 바로 이 10 개 값 중 가장 큰 확률 값 에 대응 하 는 분류 가 정확 한 주파수 이 고,Top 5 는 10 개 확률 값 에서 큰 것 부터 작은 것 까지 다섯 개 를 정렬 한 다음 에 이 다섯 개의 분류 에 그 정확 한 분류 가 존재 하 는 지 확인 한 다음 에 빈 도 를 계산한다.
Pytorch 는 다음 과 같이 실 현 됩 니 다.

def evaluteTop1(model, loader):
    model.eval()
    
    correct = 0
    total = len(loader.dataset)

    for x,y in loader:
        x,y = x.to(device), y.to(device)
        with torch.no_grad():
            logits = model(x)
            pred = logits.argmax(dim=1)
            correct += torch.eq(pred, y).sum().float().item()
        #correct += torch.eq(pred, y).sum().item()
    return correct / total

def evaluteTop5(model, loader):
    model.eval()
    correct = 0
    total = len(loader.dataset)
    for x, y in loader:
        x,y = x.to(device),y.to(device)
        with torch.no_grad():
            logits = model(x)
            maxk = max((1,5))
        y_resize = y.view(-1,1)
            _, pred = logits.topk(maxk, 1, True, True)
            correct += torch.eq(pred, y_resize).sum().float().item()
    return correct / total
주의:
y_resize=y.view(-1,1)는 매우 관건 적 인 단계 입 니 다.correct 의 연산 에서 관건 은 pred 와 y 입 니 다.resize 차원 이 일치 하고 원래 y 는[128]이 며 128 은 batch 크기 입 니 다.
pred 의 차원 은[128,10]이 고 여기 가 CIFAR 10 10 분류 라 고 가정 합 니 다.따라서 y 를[128,1]과 같은 차원 으로 바 꿔 야 하지만 Y.view(128,1)가 직접 될 수 는 없다.전체 데이터 세트 를 옮 겨 다 닐 때
마지막 batch 크기 는 128 이 아니 므 로 view()의 첫 번 째 size 는-1 알 수 없 는 것 으로 설정 하고 두 번 째 size 가 1 인지 확인 하면 됩 니 다.
보충:topk 함수 의 구체 적 인 용법
pytorch -- topk()

torch.topk(input, k, dim=None, largest=True, sorted=True, out=None) -> (Tensor, LongTensor)
주어진 dim 차원 을 따라 입력 장 량 input 의 k 최대 값 을 되 돌려 줍 니 다.
dim 을 지정 하지 않 으 면 기본적으로 input 의 마지막 1 차원 입 니 다.
만약 largest 가 False 라면,가장 작은 k 개의 값 을 되 돌려 줍 니 다.
원본 그룹(values,indices)을 되 돌려 줍 니 다.그 중에서 indices 는 원본 입력 장 량 input 에서 측정 요소 아래 표 시 됩 니 다.
불 값 sorted 를 으로 설정 하면True_,돌아 오 는 k 개의 값 이 정렬 되 었 는 지 확인 합 니 다.
매개 변수
input(Tensor)C 입력 장 량
k(int)C"top-k"의 k
dim(int,optional)C 정렬 차원
largest(bool,optional)C 불 값,최대 또는 최소 값 으로 되 돌아 가 는 것 을 제어 합 니 다.
sorted(bool,optional)C 불 값,반환 값 정렬 여 부 를 제어 합 니 다.
out(tuple,optional)C 선택 가능 한 출력 장 량(Tensor,LongTensor)출력 버퍼
실례
신경 망 의 출력 이 다음 과 같다 고 가정 하면 두 가지 로 분류 된다.batch_size=4

import torch 
output = torch.tensor([[-5.4783, 0.2298],
                           [-4.2573, -0.4794],
                           [-0.1070, -5.1511],
                           [-0.1785, -4.3339]])
top 1 값 을 얻 으 려 면 다음 과 같 습 니 다:

maxk = max((1,))  #  top1   ,  top1 top5     max((1,5))
_, pred = output.topk(maxk, 1, True, True)
topk 매개 변수 에서 maxk 는 top 1 의 정확 도 를 얻 었 고 dim=1 은 줄 에 따라 값 을 얻 었 으 며 largest=1 은 최대 값 을 얻 었 습 니 다.
결 과 는 다음 과 같다.

_
tensor([[ 0.2298],
        [-0.4794],
        [-0.1070],
        [-0.1785]])

pred
tensor([[1],
        [1],
        [0],
        [0]])
_top 1 의 값 입 니 다.pred 는 최대 값 의 색인(size=4*1)입 니 다.보통 실제 값 과 비교 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기