Pytorch 에서 모델 의 정확 도 를 구 하 는 두 가지 방법 소결
소개:이 코드 는 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)입 니 다.보통 실제 값 과 비교 합 니 다.이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Pytorch에서 shuffle을 사용하여 데이터를 흐트러뜨리는 작업우선 내가 너에게 한 가지 알려줘야 할 것은 바로pytorch의tensor이다. 만약에random을 직접 사용한다면.shuffle는 데이터를 흐트러뜨리거나 아래의 방식을 사용하여 직접 쓰기를 정의합니다. 그러면 혼란...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.