단층신경망
모형 정의
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의 값 하나를 출력
]
)
평탄화


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

시그모이드 함수 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)형태는 동일.