반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.autograd import Variable
batch_size = 64
train_dataset = datasets.MNIST(root='./mnist_data/',
train=True,
transform=transforms.ToTensor(),
download=True)
test_dataset = datasets.MNIST(root='./mnist_data/',
train=False,
transform=transforms.ToTensor())
'''
Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
Processing...
Done!
'''
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size,
shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size,
shuffle=False)
|
cs |
torchvision의 datasets에 있는 MNIST 데이터셋을 가져오고
DataLoader로 batch_size를 정해준다.
datasets.MNIST안에있는 bool형식의 train 인자 값으로 학습용, 테스트용 데이터셋을 불러읽는다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.l1 = nn.Linear(784, 520)
self.l2 = nn.Linear(520, 320)
self.l3 = nn.Linear(320, 240)
self.l4 = nn.Linear(240, 120)
self.l5 = nn.Linear(120, 10)
def forward(self, x):
x = x.view(-1, 784) # (n, 1, 28, 28)인 데이터 형식을 (n, 784) 형식으로 변경
x = F.relu(self.l1(x))
x = F.relu(self.l2(x))
x = F.relu(self.l3(x))
x = F.relu(self.l4(x))
return self.l5(x)
|
cs |
모델 생성부분
activation function은 ReLu 함수를 사용하였고
모델의 구성은
784 - 520 - 320 - 240 - 120 - 10 (노드 수)
로 되어있다.
reshape말고 view라는 함수를 사용하여 데이터의 차원을 변환시켰다.
1
2
3
4
|
model = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
|
cs |
위에서 선언한 모델 클래스를 model로 객체선언하고
loss 함수는 CrossEntropyLoss() 함수
optimizer 함수는 SGD를 사용하였다. (Stochastic Gradient Decent)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def train(epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = Variable(data), Variable(target)
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
if batch_idx % 10 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.data[0]))
|
cs |
학습과정이 담긴 함수를 보면
optimizer는 zero_grad라는 함수를 써서 최적화를 하고
loss.backward로 w 수치를 조정해주는거같다
이두개는 거의 항상 같은 패턴인듯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def test():
model.eval()
test_loss = 0
correct = 0
for data, target in test_loader:
data, target = Variable(data, volatile=True), Variable(target)
output = model(data)
test_loss += criterion(output, target).data[0]
pred = output.data.max(1, keepdim=True)[1]
correct += pred.eq(target.data.view_as(pred)).cpu().sum()
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)))
|
cs |
검증단계 함수
1
2
3
|
for epoch in range(1, 10):
train(epoch)
test()
|
cs |
로 MNIST DNN 모델을 돌려볼수가 있다.
[참조 1]: https://github.com/hunkim/PyTorchZeroToAll
[참조 2]: https://github.com/jaeyung1001/
[개인 깃허브링크, 현재 jupyter로 작성중]
반응형
'Data > Data Science' 카테고리의 다른 글
[SQL] Coalesce 함수를 이용한 NULL값 처리 (0) | 2019.01.21 |
---|---|
[Pytorch] CrossEntropy, BCELoss 함수사용시 주의할점 (0) | 2018.11.07 |
[Pytorch] MNIST CNN 코드 작성 & 공부 (0) | 2018.10.08 |
[RNN]Recurrent Neural Networks (0) | 2018.03.08 |
[Tensorflow] 텐서플로우를 이용한 간단한 RNN 코딩 (0) | 2018.03.02 |