Pytorch 의 데이터 세트 구분&정규 화 방법
트 레이 닝 세트:트 레이 닝 데이터
검증 집합:서로 다른 알고리즘(예 를 들 어 격자 검색 을 이용 하여 초 매개 변 수 를 조정 하 는 등)을 검증 하고 어떤 것 이 더 효과 적 인지 검증 합 니 다.
테스트 집합:분류 기의 성능 을 정확하게 평가 합 니 다.
정상 적 인 절차:집회 기록 의 모든 시간 스탬프 인 자 를 검증 하고 test 데 이 터 를 불 러 오기 전에 가장 좋 은 인 자 를 불 러 와 평가 합 니 다.예 를 들 어 6000 개의 epoch 를 훈련 한 후에 3520 번 째 epoch 의 vaidation 이 가장 잘 표현 되 고 테스트 할 때 3520 번 째 epoch 의 인 자 를 불 러 옵 니 다.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
#
batch_size=200
learning_rate=0.01
epochs=10
#
train_db = datasets.MNIST('../data', train=True, download=True, #train=True
transform=transforms.Compose([ #transform
transforms.ToTensor(), # Tensor
transforms.Normalize((0.1307,), (0.3081,)) # ( )
]))
#DataLoader , 。 。
train_loader = torch.utils.data.DataLoader(train_db, batch_size=batch_size, shuffle=True)
#
test_db = datasets.MNIST('../data', train=False,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
]))
test_loader = torch.utils.data.DataLoader(test_db, batch_size=batch_size, shuffle=True)
#
print('train:', len(train_db), 'test:', len(test_db)) #train: 60000 test: 10000
train_db, val_db = torch.utils.data.random_split(train_db, [50000, 10000])
print('db1:', len(train_db), 'db2:', len(val_db)) #db1: 50000 db2: 10000
train_loader = torch.utils.data.DataLoader(train_db, batch_size=batch_size, shuffle=True)
val_loader = torch.utils.data.DataLoader(val_db, batch_size=batch_size, shuffle=True)
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.model = nn.Sequential( # ,
nn.Linear(784, 200),
nn.ReLU(inplace=True),
nn.Linear(200, 200),
nn.ReLU(inplace=True),
nn.Linear(200, 10),
nn.ReLU(inplace=True),
)
def forward(self, x):
x = self.model(x)
return x
net = MLP()
# sgd , 、 ,net.parameters() [[w1,b1,w2,b2,...]
optimizer = optim.SGD(net.parameters(), lr=learning_rate)
criteon = nn.CrossEntropyLoss()
for epoch in range(epochs):
for batch_idx, (data, target) in enumerate(train_loader):
data = data.view(-1, 28*28) # [ ,784]
logits = net(data) #
loss = criteon(logits, target) #nn.CrossEntropyLoss() Softmax
optimizer.zero_grad() #
loss.backward() #
optimizer.step() #
if batch_idx % 100 == 0: # 100 batch
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))
#
val_loss = 0
correct = 0
for data, target in val_loader:
data = data.view(-1, 28 * 28)
logits = net(data)
val_loss += criteon(logits, target).item()
pred = logits.data.max(dim=1)[1]
correct += pred.eq(target.data).sum()
val_loss /= len(val_loader.dataset)
print('
VAL set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)
'.format(
val_loss, correct, len(val_loader.dataset),
100. * correct / len(val_loader.dataset)))
#
test_loss = 0
correct = 0 #correct
for data, target in test_loader:
data = data.view(-1, 28 * 28)
logits = net(data)
test_loss += criteon(logits, target).item() # criteon(logits, target) ,
pred = logits.data.max(dim=1)[1] # pred=logits.argmax(dim=1)
correct += pred.eq(target.data).sum()
test_loss /= len(test_loader.dataset)
print('
Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)
'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
2.정규 화정규 화 는 의합 문 제 를 해결 할 수 있다.
2.1L2 범 수(더 자주 사용)
최적화 기 를 정의 할 때 weigth 설정decay,즉 L2 범 수 앞의λ매개 변수.
optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate, weight_decay=0.01)
2.2L 1 범 수Pytorch 는 다음 과 같이 직접 호출 할 수 있 는 방법 이 없습니다.
3.운동량(Momentum)
Adam 유 틸 리 티 에는 momentum 이 내장 되 어 있 으 며 SGD 는 수 동 으로 설정 해 야 합 니 다.
optimizer = torch.optim.SGD(model.parameters(), args=lr, momentum=args.momentum, weight_decay=args.weight_decay)
4.학 습 률 감소torch.optim.lr_scheduler 에 서 는 다양한 epoch 수 를 바탕 으로 학습 율 을 조정 하 는 방법 을 제공 합 니 다.
4.1torch.optim.lr_scheduler.ReduceLRON Plateau:측정 기준 을 바탕 으로 학습 율 을 동태 적 으로 낮 춥 니 다.
torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
훈련 과정 에서 optimizer 는 learning rate 를 scheduler 관리 에 맡 깁 니 다.지표(예 를 들 어 loss)의 연속 patience 횟수 가 개선 되 지 않 았 을 때 학습 율 을 낮 춰 야 합 니 다.factor 는 매번 하락 하 는 비율 입 니 다.scheduler.step(loss_val)호출 할 때마다 loss 를 감청 합 니 다.val。
4.2torch.optim.lr_scheduler.StepLR:epoch 기반
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
epoch 가 지나 갈 때마다 stopsize 시 학습 율 은 모두 초기 학습 율 의 gamma 배로 변 한다.5.조기 정지(오 버 피 팅 방지)
경험 치 기반.
6.Dropout 랜 덤 부활
각 층 을 옮 겨 다 니 며 신경 망 의 노드 확률 을 제거 하고 간소화 한 샘플 을 얻 을 수 있 습 니 다.
torch.nn.Dropout(p=dropout_prob)
p 는 노드 수 를 삭제 하 는 비율 을 나타 낸다(Tip:tensorflow 에서 keepprob 는 노드 수 를 유지 하 는 비율 을 표시 합 니 다.헷 갈 리 지 마 세 요)테스트 단 계 는 dropout 를 사용 할 필요 가 없 기 때문에 train 전에 net 을 실행 합 니 다.dropped.train()은 dropout 를 사용 하 는 것 과 같 습 니 다.테스트 전에 net 을 실행 합 니 다.dropped.eval()은 dropout 를 사용 하지 않 는 것 과 같 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Pytorch는 cpu와 gpu의 사용을 어떻게 전환하는지 상세히 설명합니다.앞에서 말했듯이pytorch에서 서버에 있는 gpu가 점용될 때 우리는 먼저 cpu로 코드를 디버깅하고 싶을 때가 많다. 그러면 gpu와 cpu의 전환이 필요하다. 장치를 가변 매개 변수로 사용하려면argparse를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.