Real Late Starter
[PyTorch] 5. Network의 정의 본문
이번 포스트에서는 파이토치를 통해 간단한 딥러닝 네트워크를 만들어보고 어떤 방식으로 네트워크를 만들고 구성하는지에 대해서 알아보겠습니다.
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 |