본문 바로가기
인공지능/Deep Learning

[DeepLearning] Dive into Deep Learning 필사 7. Convolutional Neural Networks (CNN) (7.4. Multiple Input and Multiple Output Channels)

by 이준언 2024. 10. 7.

7.4. Multiple Input and Multiple Output Channels

7.4.1. Multiple Input Channels

* Multiple Input Channels 다중 입력 채널

일반적으로 이미지 데이터를 처리할 때, 입력 데이터는 여러 개의 채널로 구성되어 있다. 다중 입력 채널을 처리하기 위해서는 각 입력 채널에 대해 별도의 커널을 적용하고 결과를 합산해야한다. 

def corr2d_multi_in(X, K):
    # Iterate through the 0th dimension (channel) of K first, then add them up
    return sum(d2l.corr2d(x, k) for x, k in zip(X, K))
    
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
               [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])

corr2d_multi_in(X, K)

 

7.4.2. Multiple Output Channels

* Multiple Output Channels 다중 출력 채널

여러 입력 채널을 처리한 후, 여러 개의 출력 채널을 생성할 수 있다. CNN에서는 필터 또는 커널을 여러 개 적용하여 다양한 출력 특징 맵을 만들 수 있다. 각각의 출력 채널을 서로 다른 필터를 통해 특정한 패턴을 학습한다.

def corr2d_multi_in_out(X, K):
    # Iterate through the 0th dimension of K, and each time, perform
    # cross-correlation operations with input X. All of the results are
    # stacked together
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
    
K = torch.stack((K, K + 1, K + 2), 0)
K.shape

corr2d_multi_in_out(X, K)

7.4.3. 1×1 Convolutional Layer

* 1X1 Convolutional Layer 

크기가 1X1 인 필터(커널)을 사용하는 합성곱 계층

입력 채널의 각 위치에서 하나의 값만을 곱하여 합성곱 연산을 수행한다. 즉 공간적 차원(높이, 너비)에서는 변화가 없고, 대신 입력 채널 간의 상호작용을 학습하는 데 집중한다. 

이는 채널간의 상호작용을 학습하여 복잡한 특징을 추출하거나 입력의 특징을 다른 채널로 변환할 때 유용하다. 또한 입력 채널의 수를 줄여 계산 효율성을 높일 수 있다. 이를 통해 모델의 복잡도를 줄이면서 성능을 유지할 수 있다.

def corr2d_multi_in_out_1x1(X, K):
    c_i, h, w = X.shape
    c_o = K.shape[0]
    X = X.reshape((c_i, h * w))
    K = K.reshape((c_o, c_i))
    # Matrix multiplication in the fully connected layer
    Y = torch.matmul(K, X)
    return Y.reshape((c_o, h, w))
    
    
def corr2d_multi_in_out_1x1(X, K):
    c_i, h, w = X.shape
    c_o = K.shape[0]
    X = X.reshape((c_i, h * w))
    K = K.reshape((c_o, c_i))
    # Matrix multiplication in the fully connected layer
    Y = torch.matmul(K, X)
    return Y.reshape((c_o, h, w))

 

 

1. 두 개의 합성곱 커널 k1, k2 가 있을 때,

 

1) 두 합성곱 연산의 결과가 단일 합성곱으로 표현될 수 있음을 증명

두 개의 합성곱을 연속해서 수행하면 사실상 하나의 큰 커널로 단일 합성곱을 수행하는 것과 같다. 이는 수학적으로 두 커널의 convolution 결과가 또 하나의 커널과 동일한 계산을 하기 때문이다. 즉, 두 커널을 하나로 합치면 단일 커널로 합성곱 연산을 할 수 있다.

 

2) 동등한 단일 합성곱의 차원

두 커널의 합성 결과는 차원적으로 두 커널을 합성한 크기이다. k1*k2 의 차원으로 계산

 

3) 항상 두 합성곱으로 분해할 수 있는가?

모든 경우에 두 합성곱으로 분해할 수 있는 것은 아니다. 특정 커널이나 비선형성이 존재할 경우 합성곱을 두 개로 나누어 표현할 수 없는 상황이 발생할 수 있다. 

 

2. 주어진 입력 크기와 커널 크기를 이용한 계산

1) Forward propagation의 계산 비용

계산 비용은 입력 이미지의 차원과 커널 크기에 따라 결정된다. 각 채널에 대해 곱셈과 덧셈 연산이 이루어지며, 이는 h×w×kh×kw×ci×co 로 계산할 수 있다.

 

2) 메모리 사용량

메모리는 입력 크기와 출력 크기에 비례

 

3) 역전파 연산 시 메모리 사용량

역전파 시에도 동일한 메모리 구조를 사용하지만, 추가로 미분을 위한 중간 저장 공간이 필요할 수 있다.

 

4) 역전파 계산 비용

순전파에서 계산된 값의 도함수를 구하는 것과 유사하며, 추가적인 연산이 포함될 수는 있지만 계산 비용 자체는 큰 차이가 없다.

 

3.

입력 및 출력 채널을 두 배로 늘리면 연산에서 모든 입력 채널이 모든 출력 채널과 상호작용하므로 계산 비용이 4배 증가한다.

 

4.

Y1, Y2는 모두 1X1 합성곱이므로, 행렬곱 연산을 통해 같은 결과를 얻는다.

 

5. 합성곱을 행렬곱형태로 표현하면 계산이 더 효율적이며, 특히 1X1 합성곱에서 공간적 정보 대신 채널 간 연산에 집중할 수 있다. 이는 연산의 병렬화와 최적화에 유리하다.

 

6. 빠른 합성곱 구현과 Δ값 선택

Δ-wide strip을 사용하면 더 많은 출력을 한 번에 계산할 수 있어 효율적이다. 하지만 Δ가 너무 크면 메모리 사용량이 증가하므로 적절한 크기를 선택해야 한다. 

 

7. 행렬 c*c 계산 효율화

행렬을 블록 대각선 형태로 나누어 계산하면 병렬 처리가 가능해진다. 하지만 이 방식은 중복 계산이 발생할 수 있고, 이를 보완하기 위해 메모리 최적화가 필요하다.