합성곱 신경망(Convolutional Neural Network, CNN)은 이미지, 시계열 데이터 등에서 패턴을 학습하는 데 탁월한 성능을 보이며, 이는 합성곱(Convolution) 연산을 통해 데이터를 처리하는 방식에 기인합니다. CNN은 주로 2D 이미지 데이터를 처리하는 데 사용되지만, 특정 작업에서는 1D 또는 3D 데이터의 처리도 필요합니다. 이번 글에서는 1D, 2D, 3D 합성곱에 대해 알아보고, 파이토치(PyTorch)로 구현하는 방법을 포함하여 자세히 설명하겠습니다.
1D 합성곱
1D 합성곱은 주로 시계열 데이터나 순차적인 데이터를 처리하는 데 사용됩니다. 예를 들어, 오디오 신호, 주가 데이터, 센서 데이터 등이 1D 데이터에 해당합니다. 1D 합성곱은 필터가 입력 데이터의 한 차원에서 이동하며 연산을 수행합니다.
1D 합성곱 예제
다음은 파이토치를 사용하여 1D 합성곱을 구현하는 예제입니다.
import torch
import torch.nn as nn
# 1D 합성곱 레이어 정의
class Simple1DConv(nn.Module):
def __init__(self):
super(Simple1DConv, self).__init__()
self.conv1 = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=3)
def forward(self, x):
return self.conv1(x)
# 예제 입력 데이터 (1 x 1 x 5) 형태
input_data = torch.tensor([[[1.0, 2.0, 3.0, 4.0, 5.0]]]) # 배치 크기 1, 채널 1
model = Simple1DConv()
output = model(input_data)
print(output)
위 코드에서 Simple1DConv 클래스는 1D 합성곱 레이어를 가지고 있으며, 입력 데이터는 (배치 크기, 채널 수, 길이)의 형태를 가집니다. 합성곱 연산 후의 출력 크기는 다음과 같이 계산됩니다:
출력 길이 = (입력 길이 – 커널 크기) + 1
여기서 입력 길이는 5, 커널 크기는 3이므로 출력 길이는 3이 됩니다.
2D 합성곱
2D 합성곱은 이미지와 같은 2차원 데이터에 적용됩니다. 필터가 입력 이미지의 두 차원에서 이동하여 연산을 수행하며, 이는 이미지의 특징을 추출하는 데 유용합니다.
2D 합성곱 예제
파이토치를 사용하여 2D 합성곱을 구현하는 간단한 예제입니다.
import torch
import torch.nn as nn
# 2D 합성곱 레이어 정의
class Simple2DConv(nn.Module):
def __init__(self):
super(Simple2DConv, self).__init__()
self.conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3)
def forward(self, x):
return self.conv2d(x)
# 예제 입력 데이터 (배치 크기 1, 채널 1, 높이 5, 너비 5)
input_data = torch.tensor([[[[1.0, 2.0, 3.0, 4.0, 5.0],
[6.0, 7.0, 8.0, 9.0, 10.0],
[11.0, 12.0, 13.0, 14.0, 15.0],
[16.0, 17.0, 18.0, 19.0, 20.0],
[21.0, 22.0, 23.0, 24.0, 25.0]]]]) # 배치 크기 1, 채널 1
model = Simple2DConv()
output = model(input_data)
print(output)
위 코드에서 Simple2DConv 클래스는 2D 합성곱 레이어를 정의합니다. 입력 데이터는 (배치 크기, 채널 수, 높이, 너비)의 형태이며, 출력 크기는 다음과 같이 계산됩니다:
출력 높이 = (입력 높이 – 커널 높이) + 1
출력 너비 = (입력 너비 – 커널 너비) + 1
입력 높이와 너비가 모두 5이고 커널 크기가 3이므로 출력은 (1, 1, 3, 3) 형태가 됩니다.
3D 합성곱
3D 합성곱은 비디오 데이터나 볼륨 데이터와 같이 3차원 데이터에 적용됩니다. 이는 시간이 지나면서 변화하는 데이터나 의료 이미지와 같은 3D 구조를 분석하는 데 유용합니다.
3D 합성곱 예제
다음은 파이토치를 사용하여 3D 합성곱을 구현하는 예제입니다.
import torch
import torch.nn as nn
# 3D 합성곱 레이어 정의
class Simple3DConv(nn.Module):
def __init__(self):
super(Simple3DConv, self).__init__()
self.conv3d = nn.Conv3d(in_channels=1, out_channels=1, kernel_size=3)
def forward(self, x):
return self.conv3d(x)
# 예제 입력 데이터 (배치 크기 1, 채널 1, 깊이 5, 높이 5, 너비 5)
input_data = torch.tensor([[[[[1.0, 2.0, 3.0, 4.0, 5.0],
[6.0, 7.0, 8.0, 9.0, 10.0],
[11.0, 12.0, 13.0, 14.0, 15.0],
[16.0, 17.0, 18.0, 19.0, 20.0],
[21.0, 22.0, 23.0, 24.0, 25.0]],
[[1.0, 2.0, 3.0, 4.0, 5.0],
[6.0, 7.0, 8.0, 9.0, 10.0],
[11.0, 12.0, 13.0, 14.0, 15.0],
[16.0, 17.0, 18.0, 19.0, 20.0],
[21.0, 22.0, 23.0, 24.0, 25.0]],
[[1.0, 2.0, 3.0, 4.0, 5.0],
[6.0, 7.0, 8.0, 9.0, 10.0],
[11.0, 12.0, 13.0, 14.0, 15.0],
[16.0, 17.0, 18.0, 19.0, 20.0],
[21.0, 22.0, 23.0, 24.0, 25.0]]]]]) # 배치 크기 1, 채널 1
model = Simple3DConv()
output = model(input_data)
print(output)
위 코드는 Simple3DConv 클래스를 정의하며 3D 합성곱 레이어를 가지고 있습니다. 입력 데이터는 (배치 크기, 채널 수, 깊이, 높이, 너비)의 형태를 갖습니다. 출력 크기는 아래와 같이 계산됩니다:
출력 깊이 = (입력 깊이 – 커널 깊이) + 1
출력 높이 = (입력 높이 – 커널 높이) + 1
출력 너비 = (입력 너비 – 커널 너비) + 1
결론
이번 강좌에서는 파이토치를 사용하여 1D, 2D, 3D 합성곱을 구현하는 방법에 대해 알아보았습니다. 다양한 데이터 종류에 따라 적절한 합성곱 레이어를 활용하여 효과적인 모델을 설계할 수 있습니다. 깊이 있는 모델을 구성하기 위해서는 여러 개의 합성곱 레이어를 쌓아올리거나, 다양한 활성화 함수와 최적화 기법을 적용할 수 있습니다. 앞으로의 실습에서는 이러한 기법들을 활용한 고급 모델 구조를 설계하는 방법을 다뤄보도록 하겠습니다.