[파이토치로 시작하는 딥러닝 기초]10.1_Convolutional Neural Network

2020. 12. 30. 21:05·AI Study/DL_Basic
목차
  1. Convolution이란?
  2. Stride and Padding
  3. Python nn.Conv2d
  4. 입력의 형태
  5. Convolution 의 output 크기
  6. 실습
  7. Neuron과 Convolution
  8. Pooling
  9. CNN implementation 실습
  10. MNIST에 CNN 적용하기
  11. 학습단계(Code 기준)
반응형

10. Convolution Neural Network

 

10.1 Convolution

  • Convolution?
  • Neuron과 Convolution
  • Pooling

Convolution이란?

  • 이미지위에서 stride값 만큼 filter(kernel)을 이동시키면서 겹쳐지는 부분의 각 원소의 값을 곱해서 모두 더한 값을 출력으로 하는 연산

Stride and Padding

  • stride : filter를 한번에 얼마나 이동할 것인가
  • padding : zero-padding (input 이미지의 상하좌우에 0의 띠가 둘러진다)

Python nn.Conv2d

입력의 형태

  • input type: torch.Tensor 타입
  • input shape : (N * C * H * W) => (batch_size, channel, height, width)

Convolution 의 output 크기

$${Output \space size = \frac{input \space size - filter \space size + (2 * padding)}{Stride} + 1}$$

 

실습

import torch
import torch.nn as nn

conv = nn.Conv2d(1, 1, 11, stride = 4, padding = 0)
conv

>>>
Conv2d(1, 1, kernel_size=(11, 11), stride=(4, 4))

inputs = torch.Tensor(1, 1, 227, 227)
inputs.shape

>>>
torch.Size([1, 1, 227, 227])

out = conv(inputs)
out.shape

>>>
torch.Size([1, 1, 55, 55])

Neuron과 Convolution

Perceptron과 ConVolution

Pooling

  • 이미지의 사이즈를 줄이기 위해서 사용되기도 함
  • fully connected 연산을 대체하기 위해서 Avarage Pooling을 사용하는 경우도 있음

CNN implementation 실습

inputs = torch.Tensor(1, 1, 28, 28)
conv1 = nn.Conv2d(1, 5, 5)
pool = nn.MaxPool2d(2)
out = conv1(inputs)
out2 = pool(out)

print("out size : ", out.size()) 
print("out2 size : ", out2.size())

>>>
out size :  torch.Size([1, 5, 24, 24])
out2 size :  torch.Size([1, 5, 12, 12])

MNIST에 CNN 적용하기

학습단계(Code 기준)

  1. 라이브러리 가져오고(torch, torchvision, matplotlib 같은 것들)
  2. GPU 사용 설정하고 random value를 위한 seed 설정!
  3. 학습에 사용되는 parameter 설정(learning_rate, training_epochs, batch_size, etc)
  4. 데이터 셋을 가져오고(학습에 쓰기 편하게) loader 만들기
  5. 학습 모델 만들기(class CNN(torch.nn.Module)
  6. Loss function(criterion)을 선택하고 최적화 도구 선택(optimizer)
  7. 모델 학습 및 loss check(Criterion의 output)
  8. 학습된 모델의 성능을 확인한다.

## 1. library를 가져오고
import torch
import torch.nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms

import torch.nn.init
## 2. GPU 사용 설정하고
device = 'cuda' if torch.cuda.is_available() else 'cpu'

torch.manual_seed(777)
if device == 'cuda':
    torch.cuda.manual_seed_all(777)
## 3. 학습에 사용되는 parameter 설정
learning_rate = 0.001
training_epochs = 15
batch_size = 100
## 4. dataset을 가져오고
mnist_train = dsets.MNIST(root = 'MNIST_data/',
                          train = True,
                          transform = transforms.ToTensor(),
                          download = True)
mnist_test = dsets.MNIST(root = 'MNIST_data/',
                         train = False,
                         transform = transforms.ToTensor(),
                         download = True)
data_loader = torch.utils.data.DataLoader(dataset = mnist_train,
                                          batch_size = batch_size, 
                                          shuffle = True,
                                          drop_last = True)
## 5. 모델 만들기
class CNN(nn.Module):
    
    def __init__(self):
        super(CNN, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(1, 32, kernel_size = 3, stride = 1, padding = 1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        
        self.layer2 = nn.Sequential(
            nn.Conv2d(32, 64, kernel_size = 3, stride = 1, padding = 1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        
        self.fc = nn.Linear(7*7*64, 10, bias = True)
        torch.nn.init.xavier_uniform_(self.fc.weight)
        
    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        
        out = out.view(out.size(0), -1)
        out = self.fc(out)
        
        return out
## 6. loss function 과 최적화 도구 선택
criterion = nn.CrossEntropyLoss().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate)
## 7. training
total_batch = len(data_loader)
print('Learning Started.')

for epoch in range(training_epochs):
    avg_cost = 0
    
    for X, Y in data_loader:
        X = X.to(device)
        Y = Y.to(device)
        
        optimizer.zero_grad()
        hypothesis = model(X)
        
        cost = criterion(hypothesis, Y)
        cost.backward()
        optimizer.step()
        
        avg_cost += cost / total_batch
        
    print('[Epoch : {}] cost = {}'.format(epoch + 1, avg_cost))

print('learning Finished!!')

>>>
Learning Started.
[Epoch : 1] cost = 0.2222660630941391
[Epoch : 2] cost = 0.0628141239285469
[Epoch : 3] cost = 0.04567364975810051
[Epoch : 4] cost = 0.03739927336573601
[Epoch : 5] cost = 0.03022618591785431
[Epoch : 6] cost = 0.02474653162062168
[Epoch : 7] cost = 0.020215149968862534
[Epoch : 8] cost = 0.018039338290691376
[Epoch : 9] cost = 0.015427193604409695
[Epoch : 10] cost = 0.012006986886262894
[Epoch : 11] cost = 0.010384107939898968
[Epoch : 12] cost = 0.009809502400457859
[Epoch : 13] cost = 0.008090809918940067
[Epoch : 14] cost = 0.007567755412310362
[Epoch : 15] cost = 0.004932000767439604
learning Finished!!
with torch.no_grad(): ## 학습을 안하니까 no_grad()
    X_test = mnist_test.test_data.view(len(mnist_test), 1, 28, 28).float().to(device)
    Y_test = mnist_test.test_labels.to(device)
    
    prediction = model(X_test)
    correct_prediction = torch.argmax(prediction, 1) == Y_test
    accuracy = correct_prediction.float().mean()
    print('Accuracy : ', accuracy.item())
    
>>>
Accuracy :  0.9876999855041504

 

반응형

'AI Study > DL_Basic' 카테고리의 다른 글

[파이토치로 시작하는 딥러닝 기초]10.3 ImageFolder / 모델 저장 / 모델 불러오기  (0) 2021.01.04
[파이토치로 시작하는 딥러닝 기초]10.2_visdom  (0) 2020.12.31
[파이토치로 시작하는 딥러닝 기초]07_MLE, Overfitting, Regularization, Learning Rate  (0) 2020.12.28
[파이토치로 시작하는 딥러닝 기초]06_Softmax Classification  (0) 2020.12.28
[파이토치로 시작하는 딥러닝 기초]05_ Logistic Regression  (0) 2020.12.22
  1. Convolution이란?
  2. Stride and Padding
  3. Python nn.Conv2d
  4. 입력의 형태
  5. Convolution 의 output 크기
  6. 실습
  7. Neuron과 Convolution
  8. Pooling
  9. CNN implementation 실습
  10. MNIST에 CNN 적용하기
  11. 학습단계(Code 기준)
'AI Study/DL_Basic' 카테고리의 다른 글
  • [파이토치로 시작하는 딥러닝 기초]10.3 ImageFolder / 모델 저장 / 모델 불러오기
  • [파이토치로 시작하는 딥러닝 기초]10.2_visdom
  • [파이토치로 시작하는 딥러닝 기초]07_MLE, Overfitting, Regularization, Learning Rate
  • [파이토치로 시작하는 딥러닝 기초]06_Softmax Classification
자동화먹
자동화먹
많은 사람들에게 도움이 되는 생산적인 기록하기
    반응형
  • 자동화먹
    자동화먹의 생산적인 기록
    자동화먹
  • 전체
    오늘
    어제
    • 분류 전체보기 (144)
      • 생산성 & 자동화 툴 (30)
        • Notion (24)
        • Obsidian (0)
        • Make.com (1)
        • tips (5)
      • Programming (37)
        • Python (18)
        • Oracle (6)
        • Git (13)
      • AI Study (65)
        • DL_Basic (14)
        • ML_Basic (14)
        • NLP (21)
        • Marketing&Recommend (4)
        • chatGPT (0)
        • etc (12)
      • 주인장의 생각서랍 (10)
        • 생각정리 (4)
        • 독서기록 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    데이터분석
    seq2seq
    Python
    데이터베이스
    gcp
    파이토치로 시작하는 딥러닝 기초
    빅데이터분석
    ML
    nlp
    파이토치
    notion
    GPT
    git
    Transformer
    git commit
    빅데이터
    머신러닝
    노션첫걸음
    Jupyter notebook
    cnn
    LSTM
    python기초
    Github
    pytorch
    기초
    Google Cloud Platform
    딥러닝
    노션
    자연어처리
    dl
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
자동화먹
[파이토치로 시작하는 딥러닝 기초]10.1_Convolutional Neural Network

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.