now is better than never

[딥러닝] 3. 출력층 설계 본문

머신러닝 & 딥러닝

[딥러닝] 3. 출력층 설계

김초송 2023. 4. 28. 14:37

출력층 함수

  • 신경망에서 순전파로 흘러왔던 확률들의 숫자를 취합해서 결론을 내는 함수
  • 분류하고 싶은 가짓수 = 출력층 뉴런의 개수
  1. 소프트맥스 (Softmax) 함수
    : 분류
  2. 항등 (Identity)  함수
    : 회귀 (숫자 예측)
      입력값을 받아서 그대로 출력

 

소프트맥스 (Softmax)

def softmax(x):
    max_x = np.max(x)
    minimize_x = x - max_x # 너무 큰 수는 제곱 안 돼서 작게 만듦
    np_exp = np.exp(minimize_x)
    return np_exp / sum(np_exp)

 

직접 모델 구현

import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.array([1, 2])
w1 = np.array([1, 3, 5, 2, 4, 6]).reshape(2, 3)
w2 = np.array([3, 4, 5, 6, 7, 8]).reshape(3, 2)
w3 = np.array([4, 3, 2, 1]).reshape(2, 2)

# 은닉 1층
y = x.dot(w1)
y_hat = sigmoid(y)
# 은닉 2층
z = y_hat.dot(w2)
z_hat = sigmoid(z)
# 출력층
k = z_hat.dot(w3)
k_hat = softmax(k)
k_hat

np.sum(k_hat) # 1.0

 

TensorFlow 로 퍼셉트론 구현

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.losses import mse

tf.random.set_seed(777)
x = np.array([1, 2]).reshape(1, 2) 
y = np.array([0, 1]).reshape(1, 2) # label

model = Sequential()

# 퍼셉트론
model.add(Dense(3, input_shape=(2,), activation='sigmoid')) # 은닉 1층
model.add(Dense(2, activation='sigmoid')) # 은닉 2층
model.add(Dense(2, activation='softmax')) # 출력층

model.compile(optimizer=SGD(), loss=mse, metrics=['acc'])

model.fit(x, y, epochs=10)

result = model.predict(x)
result

 

본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.