본문 바로가기

Data/Data Science

[Pytorch] MNIST CNN 코드 작성 & 공부

반응형

앞에 import 한 내용, dataloader은 같은 내용이므로 생략한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(110, kernel_size = 5)
        self.conv2 = nn.Conv2d(1020, kernel_size = 5)
        self.mp = nn.MaxPool2d(2)
        self.fc = nn.Linear(32010)
        
    def forward(self, x):
        in_size = x.size(0)
        x = F.relu(self.mp(self.conv1(x)))
        x = F.relu(self.mp(self.conv2(x)))
        x = x.view(in_size, -1)
        x = self.fc(x)
        return F.log_softmax(x)
    
model = Net()

 

CNN 모델 구성 코드

 

전체적인 모델 그림

 

 

MaxPool2d(2) => Pooling window 크기가 2*2

MaxPooling : Kernel size안에서 제일 큰 수를 선택

AvgPooling : Kernel size안에서 평균 값을 선택

 

 

Conv2d(in_channel, out_channel, kernel_size)

MNIST는 흑백이미지이므로 in_channel이 1이다. 따라서 처음의 Conv2d의 in_channel은 1로 설정을 해야한다. 만약에 색상이 있는 이미지라면 RGB이므로 3이 될꺼같다.

 

 

13번째 줄에서는 view()함수를 사용해서 linear하게 변환해줌

 

김성훈 교수님 강의를 보다가

Fully connected neural net 이랑 Locally connected neural net이라는걸 알게됐는데

 

fully connected 같은 경우에는 모든 weight를 고려해서 하나의 노드를 만드는 편에 비해 locally connected는 특정 부분의 weight만을 따져서 fully connected보단 좀더 유연함+ 계산량의 장점으로 인해 CNN 에선 Locally connected를 사용함.

 

1
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum = 0.5)

 

optimizer는 SGD를 사용했다.

 

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
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 = F.nll_loss(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]))
 
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)
        # sum up batch loss
        test_loss += F.nll_loss(output, target, size_average=False).data[0]
        # get the index of the max log-probability
        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)))

 

Loss함수는 nll_loss를 사용하였고. train과 test함수는 앞에서 DNN 모델과 비슷해서 넘어가도록 하겠다.

 

[출저]: https://github.com/hunkim/PyTorchZeroToAll/blob/master/10_1_cnn_mnist.py

반응형