logo

단층신경망

모형 정의

keras.utils.set_random_seed(812)  # 실행 결과 재현용 난수 초기값

model = keras.models.Sequential(
    [
        keras.layers.Rescaling(1 / 255),  # 픽셀값을 0~1 범위로 변환
        keras.layers.Flatten(),  # 28×28 이미지를 길이 784의 벡터로 변환
        keras.layers.Dense(1, activation="sigmoid"),  # 클래스 1의 값 하나를 출력
    ]
)

평탄화

2차원 이미지를 1차원 벡터로 평탄화하는 과정

행 단위로 펼친 이미지 벡터

Dense

  • 선형 모형 형태의 레이어
  • 모든 입력에 대해 가중치 를 곱하고, 편향 를 더함
  • Fully Connected라고도 함
  • 활성화 함수를 적용하기 전에는 -∞ ~ +∞ 범위의 로짓을 출력
  • 이항 분류에서는 로짓을 클래스 1의 확률로 변환하기 위해 활성화 함수(activation function)를 적용

Dense 레이어 연결 구조

시그모이드 함수 sigmoid function

  • 출력층에서 0과 1 사이의 출력을 표현하기 위해 사용
  • S자(sigma)를 닮은(oid)이라는 뜻
  • 계단 함수는 거의 모든 구간에서 기울기가 0이므로 경사 기반 학습에 부적합
  • 0과 1 사이에서 매끄럽게 변하는 함수
  • 훈련된 이항 분류 모델의 출력은 클래스 1의 확률의 형태로 해석(예: 0.8 → 1일 확률이 80%)
  • 통계에서는 로지스틱(logistic) 함수라고 부름

시그모이드 함수 그래프

시그모이드 출력 확인

시그모이드에 들어가는 Dense 레이어가 계산한 로짓. 가 증가할 때 출력이 어떻게 변하는지 확인.

z = np.array([-1.0, 0.0, 1.0], dtype=np.float32)
keras.ops.convert_to_numpy(keras.activations.sigmoid(z))
실행 결과
array([0.2689414, 0.5      , 0.7310586], dtype=float32)
  • : 음수 로짓은 0.5보다 작은 값으로 변환
  • : 두 클래스의 경계가 되는 값
  • : 양수 로짓은 0.5보다 큰 값으로 변환

가 커질수록 시그모이드 출력은 1에 가까워지고, 작아질수록 0에 가까워짐.

모델 출력 확인

원본 x_train에서 숫자 0과 1만 추린 x_train_binary의 첫 이미지 세 장을 모델에 입력.

initial_predictions = model.predict(
    x_train_binary[:3]  # 출력 형태를 확인할 첫 이미지 세 장
)
initial_predictions
실행 결과
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 412ms/step
array([[0.52201015],
       [0.39018074],
       [0.4942927 ]], dtype=float32)
y_train_binary[:3]  # 첫 이미지 세 장의 정답
실행 결과
array([0, 1, 1])
  • 출력의 모양은 (3, 1). 이미지 세 장마다 클래스 1에 대한 값 하나를 출력. 첫 번째 이미지의 0.52201015는 클래스 1에 약 52.2%, 클래스 0에 약 47.8%를 부여하는 형식.
  • 아직 model.fit()으로 훈련하기 전이므로 이 값들은 무작위로 초기화된 가중치에서 나온 결과로 실제 확률은 아님.
  • 모델 훈련을 거치면서 정답에 가까운 방향으로 변화.
  • 초기 가중치는 하드웨어와 라이브러리 버전에 따라 달라질 수 있으므로 구체적인 출력값도 달라질 수 있음. 출력의 범위와 (사례 수, 1) 형태는 동일.
Previous
이항 분류