cs231n

[cs231n] Lecture 2 | Image Classification with Linear Classifiers

dotz0ver 2025. 3. 26. 16:59

 

  본 글은 Stanford Univ. Spring 2024 CS231n 강의 "Lecture 2: Image Classification with Linear Classifiers"를 바탕으로 정리한 내용입니다.

📌 강의 영상: YouTube
📄 강의 슬라이드: PDF 링크


Image Classification

Image Classification(이미지 분류)은 이미지를 입력으로 받은 후, 미리 정해놓은 카테고리 집합(예를 들어 개, 고양이, 트럭 등) 중 어떤 카테고리에 속할지를 고르는 것입니다.

우리의 시각 체계는 시각 인식 태스크에 고도화되어 있으므로 이미지 인식에 문제가 없겠지만, 기계의 관점에서는 다릅니다.

컴퓨터는 아래와 같이 이미지를 격자 모양의 숫자집합으로밖에 보질 못하며, 각 픽셀은 RGB로 표현됩니다. 이러한 거대한 숫자 집합에서 "고양이"를 인식하는 것은 상당히 어려울 것입니다.

이처럼 우리가 부여한 의미와 실제 픽셀 값 사이에는 큰 차이가 있으며, 이를  바로 Semantic Gap(의미론적 차이)라 합니다. 이 간극을 극복하는 것이 이미지 분류 문제에서 가장 중요한 도전 과제입니다.

 

Semantic Gap

고양이 한 마리가 얌전히 앉아만 있으면 아무 일도 일어나지 않을 것입니다. 하지만 카메라를 아주 조금만 옆으로 옮겨도 모든 픽셀 값들이 크게 달라질 것입니다. 그러나 이 달라진 픽셀 값에도 불구하고 여전히 고양이라는 사실은 변하지 않습니다. 우리가 만든 알고리즘은 이런 다양한 변형에도 강인해야 합니다.

  • Viewpoint variation
  • Illumination
  • Background Clutter
  • Occlusion
  • Deformation
  • Intra-class variation
  • Context

이러한 문제들은 사실 굉장히 어렵습니다. 인간의 뇌는 이런 문제들을 쉽게 처리하기 때문에 컴퓨터가 얼마나 어려워하는지를 간과할 수 있습니다. 만약 위의 모든 문제를 다룰 수 있는 알고리즘을 원한다면, 이는 거의 기적에 가까운 일이 될 것입니다. 하지만 일부 제한된 상황을 가정한다면 인간의 정확도에 맞먹는, 매우 빠르게 동작하는 프로그램을 구현하는 것이 가능합니다.

 

전통적인 객체 인식 방법은 이미지에서 edges(윤곽선)와 corners(모서리)를 추출해 명시적인 규칙을 정의하는 방식이었습니다. 예를 들어, 고양이를 인식하려면 "두 개의 귀와 하나의 코가 있다"는 규칙을 만들고 이를 기반으로 감지하는 방식이었죠. 하지만 이런 접근법은 다양한 변형(각도, 조명, 배경 변화)에 취약하고, 새로운 객체를 인식하려면 처음부터 다시 규칙을 작성해야 하는 한계가 있습니다.

 

따라서 명시적인 규칙 기반 접근법은 확장성이 부족하고 강인하지 못하기 때문에, 다양한 객체를 효과적으로 인식하려면 Data-Driven Approach(데이터 중심 접근법)을 활용해야 하며, 이를 통해 복잡한 패턴을 학습하고 일반화할 수 있는 알고리즘을 개발하는 방법을 탐구할 것입니다.

 

Data-Driven Approach

데이터 중심 접근법에서는 방대한 데이터를 수집하고 이를 머신러닝 모델에 학습시켜 객체를 인식합니다. 이를 위해 먼저 고양이, 비행기, 사슴 등 다양한 이미지 데이터를 모으고, Google Image Search나 기존 데이터셋을 활용하여 대량의 데이터를 확보합니다.

이렇게 수집된 데이터로 모델을 학습시키면, 객체의 특징을 자동으로 학습하여 새로운 이미지에서도 고양이와 개를 구별할 수 있게 됩니다. 모델이 학습하는 과정은 단순히 규칙을 나열하는 것이 아니라, 패턴을 스스로 찾아내고 일반화하는 과정입니다.

이러한 접근법을 사용하면 기존의 방식처럼 하나의 함수를 호출하는 것이 아니라, 데이터를 학습시키는 단계(Train)와 예측하는 단계(Predict)가 필요합니다.

  • Train 함수: 이미지와 레이블을 입력받아 학습된 모델을 생성
  • Predict 함수: 학습된 모델을 이용해 새로운 이미지의 객체를 예측

이는 Machine Learning의 key insight입니다. 하지만 Data-Driven Approach는 더 넓은 범위에서 적용되는 일반적인 개념입니다. 본격적으로 복잡한 알고리즘을 배우기에 앞서, 먼저 심플한 Classifier를 살펴보며 머신러닝의 핵심 원리를 이해하는 것이 중요합니다.


Nearest Neighbor Classifier

NN Classifier는 가장 단순한 형태의 분류기 중 하나입니다. 이 알고리즘의 핵심 아이디어는 학습 단계에서 별도의 모델을 만들지 않고, 단지 학습 데이터를 그대로 저장해 두었다가, 예측할 때 저장된 데이터 중에서 입력 이미지와 가장 유사한 샘플의 레이블을 반환하는 것입니다.

  • 학습(Train) 단계: 별도의 파라미터를 학습하지 않고, 오직 학습 데이터를 기억합니다.
  • 예측(Predict) 단계: 새로운 이미지가 들어오면, 학습 데이터와 비교하여 가장 가까운(유사한) 이미지의 레이블을 예측합니다.

이 예제에서는 CIFAR-10 데이터셋을 사용합니다. CIFAR-10은 머신러닝 연습용으로 자주 사용되는 데이터셋으로, 다음과 같은 특징을 가지고 있습니다.

  • 10가지 클래스: 예: 비행기, 자동차, 새, 고양이 등
  • 학습용 이미지: 총 약 50,000개의 이미지가 각 카테고리에 균등하게 분포되어 있음
  • 테스트용 이미지: 약 10,000개의 이미지가 제공됨

NN 알고리즘을 CIFAR-10에 적용하면, 테스트 이미지와 학습 이미지 간의 유사도를 계산하여, 가장 가까운 이미지의 레이블을 예측하게 됩니다. 예를 들어, 테스트 이미지가 개라면, 가장 가까운 학습 샘플 역시 개일 가능성이 높습니다. 다만, 2등, 3등 샘플은 개와 비슷하게 생긴 다른 동물(사슴, 말 등)이 나타날 수도 있습니다.

 

Distance Metric

NN 분류기를 적용할 때 가장 중요한 부분 중 하나는 테스트 이미지와 학습 이미지 간의 유사도를 어떻게 측정할지 결정하는 것입니다. 실제로 테스트 이미지를 모든 학습 이미지와 비교할 때는 다양한 방법이 있으며, 구체적으로는 어떤 ‘비교 함수(distance metric)’를 사용할지가 핵심이 됩니다.

 

이 예제에서는 L1 Distance(Manhattan Distance)를 사용했는데, 이는 두 이미지의 동일한 위치 픽셀 값의 차이를 절댓값으로 구하고 그 결과를 모두 더해 ‘거리’로 삼는 매우 간단한 방식입니다. 비록 실제 이미지 분류 문제에서 최적의 방법은 아닐 수 있지만, 이미지 간의 차이를 정량적으로 파악한다는 점에서 연습해 볼 만합니다. 예컨대, 예제에서는 두 이미지 간에 456 정도의 차이가 있는 것으로 계산되어, 단순히 수치로 비교함으로써 이미지 유사도를 판단할 수 있음을 보여줍니다.

 

아래 코드는 Nearest Neighbor 분류기를 NumPy에서 제공하는 Vectorizaed operations로 간단히 구현한 예시입니다. 보시다시피, train 함수는 단순히 학습 데이터(X)와 레이블(y)을 그대로 저장하고, predict 함수에서 L1 Distance(Manhattan Distance)를 이용해 테스트 샘플과 모든 학습 샘플 간의 거리를 계산한 뒤, 가장 가까운(거리가 최소인) 학습 샘플의 레이블을 반환합니다.

import numpy as np

class NearestNeighbor:
    def __init__(self):
        pass
    
    def train(self, X, y):
        """ X is N x D where each row is an example. Y is 1-dimension of size N """
        # the nearest neighbor classifier simply remembers all the training data
        self.Xtr = X
        self.ytr = y

    def predict(self, X):
        """ X is N x D where each row is an example we wish to predict label for """
        num_test = X.shape[0]
        # lets make sure that the output type matches the input type
        Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

        # loop over all test rows
        for i in range(num_test):
            # find the nearest training image to the i'th test image
            # using the L1 distance (sum of absolute value differences)
            distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
            min_index = np.argmin(distances) # get the index with smallest distance
            Ypred[i] = self.ytr[min_index] # predict the label of the nearest example

        return Ypred
  • Train 시간: 학습 데이터(이미지)를 단순히 저장하기만 하면 되므로, 데이터 크기에 상관없이 사실상 O(1)에 가깝습니다.
  • Test 시간: 테스트 이미지가 들어올 때마다 모든 학습 이미지와 거리를 비교해야 하므로, 학습 데이터가 N개라면 O(N)의 시간이 걸립니다.

실제 환경에서 분류기를 사용할 때는 Train 시간이 다소 오래 걸리더라도, Test 시간이 빠른 모델이 선호됩니다. 예를 들어, 대규모 데이터센터에서는 학습 과정에 많은 자원을 투입할 수 있지만, 최종 모델은 스마트폰이나 웹 브라우저 같은 저전력 기기에서 빠르게 동작해야 할 수도 있기 때문입니다. 그러나 Nearest Neighbor 알고리즘은 이와 반대로, 훈련 시간은 매우 짧지만 예측 단계에서 모든 학습 샘플과 거리를 계산해야 하므로 테스트 시간이 길어지는 문제가 있습니다.

반면, CNN과 같은 parametric model은 학습에는 상당한 시간이 걸릴 수 있으나, 일단 학습이 완료되면 예측이 매우 빠르게 이루어진다는 점에서 실제 서비스 환경에서 더 적합할 수 있습니다. 결국 Train Time과 Test Time 간의 Trade-off를 어떻게 해결하느냐가 알고리즘 선택의 중요한 기준이 됩니다.


K-Nearest Neighbors

Nearest Neighbor(NN) 알고리즘을 2차원 평면에 시각화해 보면, 학습 데이터의 각 점(색깔로 구분된 class label)을 기준으로 공간 전체가 분할되는 decision regions를 확인할 수 있습니다. 예컨대 초록색 점들이 몰려 있는 한가운데 노란색 점이 하나 끼어 있다면, 그 주변 영역은 전부 노란색으로 분류되어 ‘작은 섬’처럼 보이는 문제가 생깁니다. 이는 단 하나의 이웃만 참고하는 NN 알고리즘의 특성상, noise나 spurious가 있을 경우 전체 분류 결과가 크게 왜곡될 수 있기 때문입니다.

이러한 단점을 보완하기 위해 나온 것이 k-NN(k-Nearest Neighbors) 알고리즘입니다. Distance metric을 이용하여 한 점을 분류할 때 가장 가까운 이웃을 k개 찾아서, 그 이웃들이 속한 클래스 중 다수결로 최종 레이블을 결정합니다. 이때 거리에 따라 가중치를 주는 등 다양한 변형도 가능하지만, 가장 간단한 방식은 ‘득표수’만 따져서 최다 득표 클래스로 분류하는 방법입니다. 이렇게 여러 이웃의 정보를 종합하면, NN에서 발생하던 단일 이상치로 인한 잘못된 분류 영역을 줄이고, 더 안정적인 분류 결과를 얻을 수 있게 됩니다.

 

위 그림을 통해 k-NN 알고리즘에서 k값을 달리 설정하면 결정 경계가 어떻게 달라지는지 시각적으로 확인할 수 있습니다. 동일한 데이터에 대해 k를 1, 3, 5로 설정하면, k가 커질수록 노이즈에 의해 생긴 작은 섬 같은 영역이 사라지고, 경계가 더 매끄러워지는 것을 볼 수 있습니다. 예를 들어, k=3에서는 녹색 무리 속 노란색 점이 만들어낸 노란 영역이 제거되고, k=5에서는 경계가 훨씬 부드럽게 바뀝니다.

 

그렇다면 labeling이 안 된 흰색 지역은 어떻게 처리할까요? 이는 예제에서 “가장 가까운 이웃”을 찾지 못하거나, k개 이웃 간 다수결이 불가능한 경우를 단순히 흰색으로 처리했기 때문입니다. 실제로는 추가적인 규칙이나 추론 방법을 적용해 이 부분을 보완할 수 있습니다. 또, 이미지를 고차원 벡터로 볼 때는 픽셀 간 거리가 노이즈에 취약할 수 있으므로, k값 조절이나 L1/L2 같은 거리 척도 선택을 신중히 해야 합니다. 이러한 간단한 원리만으로도 텍스트 등 다양한 데이터에 적용할 수 있다는 점이 k-NN의 장점입니다.

그렇다면 이제 거리 척도(distance metric)를 어떻게 선택하느냐에 따라 공간이 어떻게 달라지는지 살펴봅시다. 예를 들어, L1 Distance(Manhattan)에서는 원점으로부터 일정 거리에 있는 점들이 사각형 모양으로 나타납니다. 좌표계를 회전하면 이 모양도 달라지죠. 반면, L2 Distance(Euclidean)에서는 우리가 익숙한 ‘원(circle)’ 형태가 나오며, 좌표계 회전에 영향을 받지 않습니다. 따라서 키·몸무게처럼 각 특징이 독립적인 의미를 가질 때는 L1이, 요소 간 관계가 복잡하고 회전 불변성이 중요한 경우에는 L2가 더 적합할 수 있습니다. 이런 유연성 덕분에 k-NN은 이미지뿐 아니라, 텍스트처럼 전혀 다른 종류의 데이터에도 적절한 거리 척도만 정의해주면 적용 가능하다는 장점이 있습니다.

L1(Manhattan) 거리와 L2(Euclidean) 거리를 동일한 데이터에 적용하면, 결정 경계의 형태가 달라집니다. L1에서는 경계가 좌표축에 영향을 받아 각진 형태를 띠고, L2에서는 축에 구애받지 않아 보다 부드럽고 자연스러운 경계가 형성됩니다. 즉, 어떤 거리 척도를 사용하느냐가 분류 결과의 기하학적 구조에 직접적인 영향을 미치는 것입니다.

 

지금까지 예로 든 시각화와 설정들은 아래 웹 데모 사이트에서 확인할 수 있습니다. 여기서 k값이나 거리 척도를 바꿔보며 직접 k-NN 분류기의 동작을 체험해 볼 수 있으니, 관심 있다면 방문해 보시길 추천합니다.
http://vision.stanford.edu/teaching/cs231n-demos/knn/


Hyperparameters

k-NN을 적용하려면 K값거리 척도(L1, L2 등) 같은 하이퍼파라미터를 먼저 정해야 합니다. 이들은 학습 과정에서 자동으로 결정되는 것이 아니라, 문제와 데이터 특성에 따라 달라지는 problem-dependent 요소입니다. 가장 간단한 방법은 다양한 K값과 거리 척도를 시도해 보고, 검증 데이터를 통해 어느 조합이 성능이 좋은지 확인하는 것입니다.

 

예컨대 L1 Distance는 각 좌표축(특징)이 독립적인 의미를 가질 때 유리할 수 있고, L2 Distance는 좌표계 변화(회전 등)에 영향을 덜 받아 일반적인 유사도 측정에 자주 쓰입니다. 결국 하이퍼파라미터 선택은 문제에 따라 달라지므로, 여러 시도를 통해 최적 값을 찾아가는 과정이 필요합니다.

그렇다면 이렇게 다양한 하이퍼파라미터 조합을 시도할 때, 어떤 기준으로 ‘최적’을 판단해야 할까요?

하이퍼파라미터를 결정할 때, 학습 데이터에서 정확도를 최대화하는 방식은 최악의 선택입니다. 예를 들어, k-NN에서 k=1로 두면 학습 데이터를 완벽히 분류할 수 있지만, 새로운 데이터에 대해서는 엉망이 될 수 있습니다. 또한, 데이터를 단순히 학습용(train)과 테스트용(test)으로만 나눈 뒤, 테스트 데이터에 맞춰 하이퍼파라미터를 고르는 것도 위험합니다. 이렇게 하면 테스트셋이 사실상 ‘학습 과정’에 포함되어 버려, 최종 모델의 일반화 성능을 제대로 평가할 수 없게 되기 때문입니다.

 

결국, 한 번도 보지 못한 데이터에 대한 예측 성능을 제대로 평가하려면, 데이터를 나눌 때 대부분을 train용, 일부를 validation용, 그리고 나머지를 test용으로 분할하는 방식을 취합니다.  학습 단계에서 여러 하이퍼파라미터를 시도한 뒤, 밸리데이션 세트로 성능을 평가하여 최적의 하이퍼파라미터를 찾습니다. 그리고 test set는 오직 최종 검증을 위해 한 번만 사용해야, 모델이 한 번도 보지 못한 데이터에 대해 어느 정도로 잘 작동하는지 공정하게 평가할 수 있습니다.

Cross-Validation

 

또한, 데이터가 적을 경우에는 교차 검증(Cross Validation) 기법을 활용하기도 합니다. 예를 들어 5-Fold Cross Validation에서는 트레이닝 데이터를 5개로 나누어, 그중 4개로 학습하고 1개로 검증하는 과정을 다섯 번 반복해 하이퍼파라미터를 결정합니다. 다만 딥러닝처럼 대규모 모델에서는 계산 부담이 커서 교차 검증을 자주 쓰지 않는 편입니다.

현실적으로 테스트 셋이 ‘한 번도 보지 못한 데이터’를 제대로 대표하려면, i.i.d.(독립·동일 분포)라는 전제가 필요하지만, 실제로는 이 가정이 깨질 때가 많습니다. 그래서 데이터를 한 번에 모아서 무작위로 나눈다든지, Cross Validation을 통해 여러 하이퍼파라미터를 시험해보는 방식을 사용합니다.

예를 들어, k-NN에 대해 5-Fold Cross Validation을 수행한 결과를 그래프로 나타내면, X축은 K(이웃 수), Y축은 분류 정확도가 되고, 각 점은 단일 실험 결과, 세로선은 표준 편차를 의미합니다. 여기서 K=7에서 성능이 가장 좋게 나타났으며, 폴드를 나누어 반복 실험하므로 분산(variance)도 함께 확인할 수 있습니다. 이렇게 교차 검증을 거치면, 데이터 분포가 완벽히 i.i.d. 가 아니더라도 어느 정도 신뢰할 만한 하이퍼파라미터를 선택할 수 있습니다.

하지만 k-NN 분류기를 실제 이미지 분류에 적용하는 일은 드뭅니다. 위 이미지를 보면, 왼쪽은 원본이고 오른쪽 세 장은 얼굴 일부가 가려지거나 픽셀이 살짝 이동했거나 색조가 바뀐 사례입니다. 그런데 픽셀 단위로 L2 Distance를 계산하면 이 세 장 모두 원본과 동일한 거리로 측정됩니다. 이는 k-NN에서 사용하는 단순 거리 척도가 ‘지각적 유사도’를 전혀 반영하지 못한다는 것을 잘 보여줍니다. 게다가 k-NN은 예측할 때 모든 학습 샘플과 거리를 비교하므로 속도가 느리고, 고차원(예: 이미지) 데이터일수록 필요한 샘플 수가 기하급수적으로 늘어나는 차원의 저주 문제도 큽니다. 이런 이유들로 실제 이미지 분류에서는 k-NN을 거의 사용하지 않습니다.


Linear Classifier

Linear Classification은 매우 간단한 알고리즘이지만, Neural Network(NN)와 CNN 같은 딥러닝 모델의 기본 블록 역할을 하기 때문에 중요합니다. NN을 레고 블록에 비유하듯, CNN이나 RNN 등 다양한 컴포넌트를 조합해 복잡한 문제(예: Image Captioning)도 해결할 수 있는데, 그 토대가 바로 Linear Classifier입니다.

다만, 여기서는 먼저 CIFAR-10 데이터셋(32×32 컬러 이미지 5만 장)으로 다시 돌아와, k-NN과는 다른 접근을 취하는 Linear Classification이 어떻게 작동하는지 살펴보도록 하겠습니다.

Linear Classifier파라메트릭 모델의 가장 간단한 형태로, 입력 이미지 x와 파라미터 W를 이용해 클래스별 점수를 계산합니다.

 

위 이미지는 32×32×3 크기의 컬러(RGB) 이미지를 3072차원 벡터 \(\mathbf{x}\)로 펼친 뒤, 10×3072 크기의 weight matrix \(\mathbf{W}\)를 곱하고, 10×1 크기의 bias vector \(\mathbf{b}\)를 더해 10차원 결과 \(\mathbf{f}(\mathbf{x}) = \mathbf{W}\mathbf{x} + \mathbf{b}\)를 얻는 과정을 보여줍니다.
이 10차원 벡터는 CIFAR-10의 각 클래스(예: 고양이, 개, 비행기 등)에 대한 score를 의미하며, 그중 가장 큰 값을 갖는 클래스가 최종 예측이 됩니다.

  • \(\mathbf{x}\): 펼친 입력 이미지 (3072×1)
  • \(\mathbf{W}\): 가중치 행렬 (10×3072)
  • \(\mathbf{b}\): 바이어스 벡터 (10×1)
  • \(\mathbf{f}(\mathbf{x})\): 클래스별 점수 (10×1)

이 방식의 장점은, 예측할 때 \(\mathbf{W}\)와 \(\mathbf{b}\)만 있으면 되므로 k-NN처럼 모든 학습 이미지를 저장할 필요가 없다는 점입니다. 또한 bias vector \(\mathbf{b}\)를 통해 특정 클래스에 추가 점수를 부여할 수도 있어, 데이터가 편향되어 있거나 사전 확률이 다른 경우 유리하게 작동할 수 있습니다. (가령 고양이 이미지가 압도적으로 많은 데이터셋이라면, 고양이 클래스에 해당하는 바이어스가 상대적으로 커질 수 있습니다.)

 

아래 슬라이드들은 Linear Classifier가 다양한 관점에서 해석하는 방법을 보여줍니다.

Viewpoint

위 예시(Algebraic Viewpoint)에서는 2×2 크기의 간단한 이미지(4픽셀)를 4차원 벡터로 펼친 뒤, 이를 4×3 가중치 행렬과 곱하고 3차원 바이어스를 더해 고양이·개·배(cat/dog/ship) 세 클래스의 점수(score)를 산출합니다. 각 점수는 입력 벡터와 가중치 행렬의 특정 행(‘템플릿’) 간 내적(dot product)으로 계산되며, 바이어스 항은 데이터와 무관하게 클래스별 점수를 조금씩 조정(scailing offsets)합니다. 이런 식으로 보면, Linear Classifier는 사실상 “입력이 특정 클래스 템플릿에 얼마나 가까운가”를 재는 템플릿 매칭과 유사하다는 것을 알 수 있습니다.

 

하지만 Linear Classifier는 클래스마다 오직 하나의 템플릿만 학습할 수 있다는 한계가 있습니다. 그래서 더 복잡한 Neural Network를 사용하면, 클래스당 여러 특성을 동시에 반영하여 더 높은 정확도를 기대할 수 있죠.

또 다른 관점에서, 이미지를 고차원 공간의 한 점으로 간주하면, Linear Classifier는 선형 결정 경계(hyperplane)를 학습해 각 클래스를 구분합니다. 예컨대 비행기 이미지가 있는 구역을 파란색 선으로 나누는 식입니다. 모델이 무작위 파라미터에서 시작해 점차 데이터를 잘 분류하려고 학습하는 과정을 지켜보는 것도 흥미롭지만, 고차원 공간에서는 Linear Classifier를 간단히 무너뜨릴 수 있는 예제를 만드는 일이 생각보다 쉽습니다. 이는 단 하나의 템플릿선형 결정 경계만으로는 복잡한 분포를 충분히 표현하기 어렵다는 점을 시사합니다.

위 그림들은 Linear Classifier가 해결하기 어려운 데이터 분포를 예시로 보여줍니다. 맨 왼쪽처럼 ‘홀/짝수’라는 parity 기반 구분은 한두 개의 선(초평면)으로 나누기 어렵고, 오른쪽처럼 하나의 클래스가 여러 섬(modes)으로 나뉘어 존재하는 경우에도 선형 결정 경계만으로는 구분이 불가능합니다. 결국, 클래스마다 단 하나의 템플릿을 두고 직선(또는 초평면)으로 분류하는 Linear Classifier단순하고 해석하기 쉽지만, 복잡한 분포나 다중 모드가 나타나는 실제 문제를 처리하기에는 한계가 있습니다.

'cs231n' 카테고리의 다른 글

[cs231n] Lecture 1 | Introduction  (1) 2023.10.10