Real Late Starter

[PyTorch] 5. Network의 정의 본문

PyTorch

[PyTorch] 5. Network의 정의

조슈아박 2020. 2. 12. 04:55

이번 포스트에서는 파이토치를 통해 간단한 딥러닝 네트워크를 만들어보고 어떤 방식으로 네트워크를 만들고 구성하는지에 대해서 알아보겠습니다. 

1. Define the Network

 

- Class 선언으로 사용하고자 하는 Network를 직접 구현할 수 있다.

- Class로 선언할 Network의 필수 요소는?

 

네트워크를 정의 할 때의 꼭 들어가야하는 필수 요소는 바로 __init__과 forward 함수 입니다.

이 두가지 함수를 채워 넣으려면 어떤 것들을 사용해야 할까?

- Convolution, Pooling, ReLU, Drop out, Normalize ...

torch.nn 그리고 torch.nn.functional 라이브러리를 가지고 네트워크 함수를 채워 넣을 수 있습니다.

# Network Class

class my_network(nn.Module):

    def __init__(self):
        super(my_network, self).__init__()
        (사용할 함수들을 정의하는 장소)
    
    def forward(self, x):
        (함수들을 사용하여 Network의 forward를 정의하는 장소)
        return 

Network 클래스의 구조에 대해 살펴 보겠습니다.

우선 class를 쓰고 내가 만들 클래스의 이름을 작성해줍니다. 예제의 경우는 my_network라고 이름을 정의하였습니다.

괄호안에 nn.Module를 써줍니다. 

 

그리고 __init__과 forward를 define 해줍니다.

__init__에서는 super(<내가 만들 클래스의 이름>, self).__init__() 이렇게 꼭 작성을 해주어야 합니다.

다음으로 사용할 함수들을 super 밑에 작성해주면됩니다.

 

forward에서는 self와 x를 함께 넣어준다. 데이터의 input 값이 하나일 경우에는 x만 있어도 되지만 input이 여러개면 x,y,z 와 같이 정의 할 수 있습니다. 끝에는 return을 적어서 원하는 output를 도출해낼 수 있습니다.

 

2. Network 생성 해보기

 

지난번 포스트에서 진행했었던 CIFAR-10 데이터를 가지고 컨볼루션 네트워크를 만들어보도록 하겠습니다.

우선 CIFAR-10 데이터의 input의 크기를 확인해봐야 합니다. 위의 코드에서 보이는 것처럼 torch.Size([8, 3, 32, 32])이라고 출력이 됩니다. 이것은 배치가 8이고 채널은 3 가로세로 32인 이미지를 나타냅니다. 이러한 정보를 토대로 Convolution Layer에 넣어 보도록 하겠습니다.

 

2-1) Conv2d

아래는 pytorch에서 제공하는 공식 Document(https://pytorch.org/docs/stable/nn.html#convolution-layers)의 Conv2d의 내용입니다.

위의 CIFAR-10 이미지데이터를 Conv2d에 넣으려고 합니다. 밑에서 보이는 바와 같이 in_channels, out_channels, kernel_size를 입력해주어야 하고 나머지 파라미터들은 default값으로 넣어줄 수 있습니다.

 

아까전에 본 것과 같이 8 x 3 x 32 x 32인 데이터에서 in_channels는 3이 됩니다. out_channels는 내가 filter를 얼마나 줄 것인가와 관련되있다고 할 수 있습니다. 필터는 5로 주겠습니다. 또한 kernel_size는 필터, 커널의 사이즈입니다. 필터 사이즈를 어떻게 할 것인가 했을 때 5라고 설정한다면 다음과 같이 작성할 수 있겠습니다.

import torch.nn as nn

nn.Conv2d(3,5,5)

이번에는 실제 코드와 함께 진행해 보겠습니다.

이미지 데이터를 불러올 때 이러한 포멧으로 확인합니다. 배치 사이즈는 8개이고 채널3인 32 by 32의 이미지를 나타냅니다.

 

그리고 nn.Conv2d에서 input_channel, output_channel, kernel_size를 입력해줍니다. 그리고 out1에 imgs를 Variable로 감싸고 네트워크 안에 넣은 것을 선언해줍니다. out1의 shape를 보면 8, 5, 28, 28이 나왔습니다.

 

다음은 5, 10, 5로 넣어서 진행해봤습니다. 

 

이번에는 하나 씩 확인하는 것이 아닌 전체 클래쓰를 만들어서 네트워크를 구성해보겠습니다.

클래쓰를 선언하고 my_network로 이름을 설정합니다. 클래쓰안에 __init__과 forward 함수를 넣어줍니다. init에는 super가 꼭 들어가야합니다. 그 밑에 자신이 사용할 네트워크 레이어를 입력해줍니다.

그리고 자신이 쓸 네트워크를 토대로 forward에서 네트워크를 통과한 데이터들을 어떻게 사용할지를 입력해주면 됩니다.

 

이렇게 네트워크를 클래스로 만들어서 출력결과를 확인해보면 위에서 본 out2과 같은 형태를 띄고 있는 것을 알 수 있습니다.

이런 식을 네트워크를 정의하고 사용할 수 있다는 것을 이번 포스트에서 확인 해보았습니다. 지금까지 Neural Network를 간단하게 구성하는 방법을 알아 보았습니다.

 

이 포스트는 김군이(https://www.youtube.com/watch?v=KXiDzNai9tI&t=984s)님의 강의를 듣고 공부하며 정리한 내용을 올린 것입니다.

'PyTorch' 카테고리의 다른 글

[PyTorch] 7. Custom Dataset  (1) 2020.02.20
[PyTorch] 4-1. 나만의 이미지 데이터셋 만들기  (22) 2020.02.11
[PyTorch] 4. Data Loader  (1) 2020.01.23
[PyTorch] 3. nn & nn.functional  (0) 2020.01.22
[PyTorch] 2. Autograd & Variable  (0) 2020.01.18