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