PyTorch의 이미지 처리 모델 레이어를 쉽게 이해하는 방법

나는 TensorFlow를 비교적 잘 사용하고 있지만, PyTorch 최근에 시도하고 싶고 공부하기 시작했습니다. 새로운 라이브러리를 착용하려고 하면 우선 알기 쉬운 사례의 해석으로 시작하는 것이 기본이라고 생각합니다. 심층 학습의 경우는 역시 간단한 컨벌루션 네트워크로 시작하는 것이 좋다고 생각합니다. PyTorch의 Tutorial 페이지에서 LeNet이라는 모델의 구현이 있기 때문에 그것을 사용해보고 공부를 시작했습니다. ( htps : // py와 rch. 오 rg / 트리어 ls / 베긴 r / b ぃ t · 네우라 l_ html # sphx-glr-begine rb t ~ 네우라 l - 네와 rks - t-lpy )

다만, 도중에 각 층은 어떻게 데이터를 처리하고 있거나 출력의 형태 등을 확인하고 싶어지기 때문에 단순하게 셋업해 돌리는 것만으로도 아무것도 부족하네요. 천재 개발자라면 nn.Conv2의 설정을 보고 32x32가 어떻게 처리되는 머리 속에서 이미지할 수 있을지도 모릅니다만, 나는 천재가 아니기 때문에 아무래도 중간의 형태를 보고 싶습니다.

다른 더 효율적인 방법이있을 수 있지만, 나는이 방법으로 확인하고 있습니다. 설명을 위해 PyTorch의 nn.Conv2d 레이어를 사용합니다. 먼저 ipython을 엽니다. 그런 다음 필요한 라이브러리를 가져옵니다.
import torch # PyTorchをインポート
import torch.nn as nn # conv2dが存在する

그런 다음 nn.Conv2d를 정의합니다. 이 conv2d 설정은 위에서 언급한 LeNet의 첫 번째 계층입니다.
# 入力は1つのチャネル、出力は6つのチャネル、カーネルは3x3
conv1 = nn.Conv2d(1, 6, 3)

그렇게 하여 가정하고 있는 입력의 더미 데이터를 작성합니다. LeNet의 입력은 32x32이므로 그 차원에서 생성합니다. 그 후에는 흑백 이미지이어야하므로 채널은 하나뿐입니다.
# 1つの画像 (batch_size = 1), 1つのチャネル、32x32のイメージ
x = torch.randn(1, 1, 32, 32)

레이어를 정의하고 더미 데이터를 만들었으므로 나중에 데이터를 레이어로 전달하기 만하면됩니다.
x = conv1(x)

Conv2d 문서의 Shape 출력 크기 (Hout, Wout) 함수는 이것입니다. ( htps : // py와 rch. 오 rg/도 cs/마s r/게네라 d/와 rch. 응. 곤 v2d. HTML )



조금 복잡해 보일 수 있지만 Hin과 Win은 입력 할 때 세로와 가로 크기입니다 (32x32). 이번에는 Padding을 사용하지 않으므로 0입니다. 다큐멘테이션으로 확인하면 dilation과 stride를 설정하지 않으면 1이 됩니다. Kernel 사이즈는 위의 Conv2d 를 설정했을 때 3x3 으로 했으므로 kernel_size[0] 과 kernel_size[1] 는 모두 3 입니다.

전부 함수에 있으면 이렇게 됩니다:

H = ((32 + 0 - 1 x (3 - 1) - 1)/1) + 1 = ((32 - 3)/1) + 1 = 30
W = ((32 + 0 - 1 x (3 - 1) - 1)/1) + 1 = ((32 - 3)/1) + 1 = 30

이 계산에 따르면 우리가 가정하는 출력의 형태는 (1, 6, 30, 30)입니다. 30, 30은 미리 계산된 Hout과 Wout입니다. 6은 Conv2에서 설정한 출력 채널 수입니다. 그리고 하나의 이미지 밖에 입력하지 않으므로 출력도 하나뿐입니다.

출력의 형태 Shape 프로퍼티을 호출하면 확인할 수 있습니다. 확실히 위의 계산은 정답이었습니다.
x.shape # (1, 6, 30, 30)

이 방법은 Conv2d에 국한되지 않고 기본적으로 모든 계층에서 시도 할 수 있습니다. 예를 들어 LeNet에서 Conv2d 다음에 오는 max_pool2d의 출력도 같은 방법으로 확인할 수 있습니다. 각 레이어에서 무슨 일이 일어나고 있는지 확인하고 싶을 때 유용합니다.

좋은 웹페이지 즐겨찾기