본문 바로가기

Conv1D, Conv2D, Conv3D 차이

말 그대로다. 1차원 배열 데이터에는 Conv1D를, 2차원 배열 데이터에는 Conv2D를 사용한다. 아직까지 Conv3D를 사용해 본 적은 없지만 마찬가지로 3차원 배열 데이터에 사용한다. 즉, Conv1D, Conv2D, Conv3D 차이는 입력 데이터의 차원이다. 그런데 여기서 끝나면 의문이 생긴다. 코드를 보자.

 

model = tf.keras.models.Sequential([
    # Note the input shape is the desired size of the image 150x150 with 3 bytes color
    tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax')
])

 

다 볼 필요 없고 3번째 줄만 보면 된다. 입력 차원(input_shape)이 3차원인데 왜 Conv2D지?

 

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(tokenizer.vocab_size, 64),
    tf.keras.layers.Conv1D(128, 5, activation='relu'),
    tf.keras.layers.GlobalAveragePooling1D(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

 

이것도 마찬가지다. 2번째 줄이랑 3번째 줄만 보자. 입력 차원이 (tokenizer.vocab_size, 64)로 2차원인데 Conv1D를 쓰지....?

 

입력 데이터의 차원이라고만 알고 있으면 이상하게 여겨질 법하다. Conv1D, Conv2D, Conv3D에서 1D, 2D, 3D는 합성곱을 진행할 입력 데이터의 차원을 의미한다. 합성곱 진행 방향을 고려해야 한다는 말이다. 무슨 소리인지 모르겠다면 하나씩 살펴보자.

1D Convolution


출처: https://ko.n4zc.com/article/programming/python/6upqgul5.html

 

Conv1D는 합성곱 진행 방향이 한 방향(가로)이다. 앞서 본 코드를 다시 보면

 

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(tokenizer.vocab_size, 64),
    tf.keras.layers.Conv1D(128, 5, activation='relu'),
    tf.keras.layers.GlobalAveragePooling1D(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

 

차원이 (tokenizer.vocab_size, 64)인 word embedding에 대해 한 방향으로만 합성곱을 진행하겠다는 뜻인 거다. 단어별로 64번 합성곱을 하는지, 아니면 embedding dimension인 차원별로 tokenizer.vocab_size만큼 합성곱을 하는지 잘 모르겠지만 어쨌든 둘 중 한 방향으로 합성곱을 진행한다. 즉, 합성곱을 진행할 입력 데이터의 차원은 1이다.

 

Conv1D는 위의 코드 예시처럼 sequence 모델자연어 처리(Natural Language Processing, NLP)에서 주로 사용한다. 

2D Convolution


출처: https://ko.n4zc.com/article/programming/python/6upqgul5.html

 

Conv2D는 합성곱 진행 방향이 두 방향(가로, 세로)이다. 얘도 앞서 본 코드를 다시 보면

 

model = tf.keras.models.Sequential([
    # Note the input shape is the desired size of the image 150x150 with 3 bytes color
    tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax')
])

 

차원이 (150, 150, 3)인 image에 대해 두 방향으로만 합성곱을 진행하겠다는 뜻이다. 150x150 이미지에 3채널이므로, 150x150 matrix에 대해 합성곱을 총 3번(R, G, B) 진행한다. 즉, 합성곱을 진행할 입력 데이터의 차원은 2이다.

 

Conv2D는 위의 코드 예시처럼 컴퓨터 비전(Computer Vision, CV)에서 주로 사용한다.

3D Convolution


출처: https://thomelane.github.io/convolutions/3DConv.html

 

Conv3D는 합성곱 진행 방향이 세 방향(가로, 세로, 높이)이다. 아직 써본 적이 없어서 텐서플로우 공식문서에서 코드를 가져왔다. 데이터는 3D 프레임을 가진 4개의 비디오로, input_shape은 무려 6차원이다.

 

# With extended batch shape [4, 7], e.g. a batch of 4 videos of 3D frames,
# with 7 frames per video.
input_shape = (4, 7, 28, 28, 28, 1)
x = tf.random.normal(input_shape)
y = tf.keras.layers.Conv3D(
2, 3, activation='relu', input_shape=input_shape[2:])(x)
print(y.shape)

 

차원이 (4, 7, 28, 28, 28, 1)인 영상에 대해 세 방향으로만 합성곱을 진행한다. 합성곱을 진행할 데이터의 차원은 28x28x28인 영상으로, 3차원이다. 

 

Conv3D는 위의 코드 예시처럼 의료(CT 영상) 분야비디오 프로세싱에서 주로 사용한다.

참고


[1] Conv1D와 Conv2D, Conv3D의 차이점

[2] 합성곱이 진행되는 방향

[3] Conv1D와 Conv2D, Conv3D 주요 사용 분야

[4] Conv1D 코드

[5] Conv2D 코드

[6] Conv3D 코드