0417 질문 모음
CNN Explainer
An interactive visualization system designed to help non-experts learn about Convolutional Neural Networks (CNNs).
poloclub.github.io
🤔 Q1. 이미지에서는 주로 CNN 합성곱신경망을 사용하게 되는데,
기존 DNN이 갖고 있는 어떤 문제점 때문에 합성곱 신경망을 이미지에 주로 사용하게 되는 것일까?
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) |
A. 기존의 DNN은 이미지 분류 문제에서 상당한 성과를 보여주었지만, 이미지 처리 작업에는 여전히 몇 가지 문제가 있다.
이러한 문제점 중에서 가장 큰 것은 공간 정보의 손실이다.
DNN은 입력 이미지를 일련의 벡터로 변환한 후 각 벡터를 독립적으로 처리한다. 이러한 처리는 이미지의 공간 정보를고려하지 않고 이미지를 픽셀 또는 특징 벡터의 모음으로 간주한다. 이는 이미지 내의 객체나 패턴이 어디에 위치하고 있는지를 고려하지 않기 때문에 이미지의 성질을 놓치게 된다.
반면, CNN은 합성곱 연산을 사용하여 입력 이미지의 공간 정보를 보존한다. 이 방식은 이미지의 특성을 지역적으로 추출하며, 이러한 지역적인 특성을 조합하여 전체 이미지를 분류한다. 이 방법은 이미지 분류 작업에서 매우 효과적이며, 이미지 분류를 포함한 다양한 이미지 처리 작업에서 사용된다.
따라서, 이미지 처리 작업에서 CNN은 DNN보다 효과적인 방법이다.
🤔 Q2. tf.keras.layers.Flatten(input_shape=(28, 28)), 입력층에서 데이터를 1차원 벡터로 변환하게 되면 어떤 문제가 있을까?
A. tf.keras.layers.Flatten() 레이어는 이미지와 같은 2D 데이터를 1D 벡터로 변환한다. 이를 통해 DNN 모델에 이미지 데이터를 입력할 수 있다. 그러나 이러한 변환은 일부 문제를 유발할 수 있다.
첫째로, 이미지의 공간 정보가 유실된다. 이미지의 공간 정보는 픽셀의 위치 및 상호 관계를 나타내며, 이러한 정보는 일반적으로 CNN과 같은 공간 정보를 고려하는 모델에서 중요한 역할을 한다.
둘째로, 데이터의 차원이 매우 커질 수 있다. 예를 들어, 28x28 크기의 이미지를 1D 벡터로 변환하면 784개의 요소를 가진 벡터가 생성된다. 이는 더 큰 이미지 데이터셋의 경우 더 큰 차원을 갖는 벡터를 생성할 수 있으며, 이는 연산 비용 증가 및 과적합과 같은 문제를 초래할 수 있다.
따라서, 이미지와 같은 2D 데이터를 처리하는 경우 CNN과 같은 모델을 사용하는 것이 좋다. CNN은 이미지의 공간 정보를 고려하면서도 상대적으로 적은 수의 파라미터를 가진다. 이러한 이유로, CNN은 이미지 분류 작업에서 일반적으로 매우 효과적으로 사용된다.
🤔 Q3. 합성곱 신경망에서는 이 문제를 어떻게 해결했을까?
A. 합성곱 신경망(CNN)은 이미지 처리에서 공간 정보를 보존하기 위한 몇 가지 기술을 사용한다.
첫째로, CNN은 이미지의 지역적인 특징을 추출하기 위해 합성곱(convolution) 연산을 사용한다. 합성곱 연산은 이미지의 일부분을 처리하고 이를 통해 이미지의 지역적인 패턴을 인식한다. 이러한 지역적인 패턴은 일반적으로 작은 커널(kernel)과 함께 사용되며, 이 커널은 이미지 내에서 이동하면서 이미지의 각 지역을 처리한다. 이러한 방식으로, CNN은 이미지의 공간 정보를 보존하면서 지역적인 특징을 추출할 수 있다.
둘째로, CNN은 풀링(pooling) 연산을 사용하여 이미지의 크기를 줄인다. 풀링 연산은 합성곱 연산의 결과를 축소하여 정보의 손실을 방지한다. 풀링 연산은 일반적으로 최대값을 취하는 최대 풀링(max pooling)이나, 평균값을 취하는 평균 풀링(average pooling)과 같은 방법으로 수행된다.
이러한 합성곱과 풀링 연산을 조합하여 CNN은 이미지의 지역적인 패턴을 인식하고 공간 정보를 보존하는 방식으로 이미지 분류 작업을 수행한다. 이러한 방식은 2D 이미지 데이터에서 공간 정보를 유지하면서도 학습 가능한 파라미터 수를 감소시킬 수 있다. 따라서, CNN은 이미지 처리 작업에서 매우 효과적인 방법이다.
커널을 사용할 수도 있다. 커널은 일반적으로 작은 크기의 정방 행렬로 구성되며, 이미지의 작은 부분에 적용되어 특징을 추출하는 데 사용다. 커널은 합성곱(convolution) 연산에서 사용되며, 이 연산은 이미지와 커널 사이에서 일종의 곱셈과 덧셈 작업을 수행한다.
이러한 컨볼루션을 통해 이미지에서 특징(feature)을 추출할 수 있다. 예를 들어, 가장 기본적인 컨볼루션 연산은 엣지(edge) 검출에 사용된다. 이 연산에서는 엣지와 관련된 부분이 강조되어 출력되는 특징 맵(feature map)이 생성된다.
이러한 방식으로, CNN은 여러 개의 커널을 사용하여 이미지의 다양한 특징을 추출한다. 이렇게 추출된 특징 맵은 일반적으로 풀링(pooling) 레이어를 통해 축소되어 다음 층으로 전달된다. 이러한 방식으로, CNN은 이미지에서 계층적으로 특징을 추출하고 이를 통해 이미지 분류와 같은 작업을 수행한다.
🤔 Q4. 필터를 랜덤하게 행렬로 여러장 생성하게 되면 랜덤한 패턴이 필터 수 만큼 만들어지게 된다.
필터 안의 사이즈를 지정할 때 어떤 파라미터를 사용 할까?
A. 필터 안의 사이즈를 지정할 때 사용하는 파라미터는 주로 "커널 크기(kernel size)" 또는 "필터 크기(filter size)" 라고 부른다. (두 개는 동일한 개념)
커널 크기는 필터가 적용되는 이미지의 크기를 결정하며, 일반적으로 정방형의 형태를 가지며 홀수값을 사용한다. 예를 들어, 3x3 또는 5x5 크기의 필터를 사용하는 것이 일반적이다.
커널 크기가 작을수록, 즉 3x3과 같이 작은 크기의 필터를 사용할수록, 이미지의 작은 부분에 대한 특징을 더욱 자세하게 추출할 수 있다. 반면, 큰 커널 크기를 사용하면 더 큰 영역에서 특징을 추출할 수 있으며, 이는 더 강력한 필터링 효과를 가져올 수 있다.
그러나, 커널 크기가 너무 크면 필터링 결과 이미지의 크기가 작아지게 되어 정보 손실이 발생할 수 있으며, 더 많은 연산이 필요해짐에 따라 연산량이 늘어나게 된다. 따라서, 적절한 커널 크기를 선택하는 것이 중요하다. 일반적으로, 3x3 또는 5x5 크기의 필터를 많이 사용하지만, 특정한 문제에 맞게 더 작거나 더 큰 필터를 사용할 수도 있다.
🤔 Q5. 패딩을 1로 하여 외곽을 0으로 채우면 어떤 효과가 있을까?
A. 패딩을 1로 하여 외곽을 0으로 채우면, 컨볼루션 연산 결과로 나오는 출력 데이터의 크기가 입력 데이터와 동일하게 유지된다. 이는 입력 데이터의 경계 부분에서도 특징을 추출할 수 있도록 하며, 모델의 성능을 향상시킬 수 있다.
예를 들어, 이미지 분류 문제에서 패딩을 사용하지 않으면, 이미지의 가장자리 부분에 위치한 픽셀들은 합성곱 연산을 수행할 때 입력 데이터와 일부만 겹치기 때문에 출력 데이터에 반영되지 않을 수 있다. 따라서 패딩을 적용하여 입력 데이터의 크기를 확장하면, 이러한 문제를 해결할 수 있다.
또한, 패딩을 적용하면 모델의 파라미터 수가 증가하게 된다. 이는 모델이 더욱 복잡해지게 되어, 모델의 표현력이 높아질 수 있다는 것을 의미한다. 하지만, 패딩을 너무 많이 적용하면, 모델의 연산량이 증가하게 되어 학습 시간이 길어지게 될 수 있으므로 적절한 패딩 크기를 선택하는 것이 중요하다.