데이터 분석가
article thumbnail
  • 이번 글에서는 텐서플로와 간단한 데이터셋으로 이진 분류모델을 구현해보겠습니다.

교재 홍보

 

케라스 창시자에게 배우는 딥러닝 개정 2판 - 예스24

단어 하나, 코드 한 줄 버릴 것이 없다!단 한 권의 딥러닝 책을 선택한다면 바로 이 책이다!케라스 창시자이자 구글 딥러닝 연구원인 저자는 ‘인공 지능의 민주화’를 강조한다. 이 책 역시 많

www.yes24.com

1. 데이터 생성

  • 모델에 넣어줄 입력 데이터로 2D 평면에 두 가지 클래스를 가진 데이터셋을 생성해 줍니다.
num_samples_per_class = 1000
negative_samples = np.random.multivariate_normal(
    mean = [0, 3], # x축의 위치를 살짝 조정
    cov = [[1, 0.5], [0.5, 1]], # 공분산이 0.5로 양수이므로 데이터 방향이 우상향
    size = num_samples_per_class
)

positive_samples = np.random.multivariate_normal(
    mean = [3, 0], # x축의 위치를 살짝 조정
    cov = [[1, 0.5], [0.5, 1]], # 공분산이 0.5로 양수이므로 데이터 방향이 우상향
    size = num_samples_per_class
)
  • 두 클래스를 수직으로 쌓아 inputs 배열을 만들고 각 클래스에 대한 레이블 역할을 하는 0과 1로 이루어진 targets 배열을 만들어준다.
inputs = np.vstack((negative_samples, positive_samples)).astype(np.float32)
targets = np.vstack((
    np.zeros((num_samples_per_class, 1), dtype='float32'),
    np.ones((num_samples_per_class, 1), dtype='float32')
))

2. 생성 데이터 시각화

  • 생성한 inputs 데이터를 시각화 해줍니다.
import matplotlib.pyplot as plt
plt.scatter(inputs[:, 0], inputs[:, 1], c=targets[:, 0]) # c=targets[:, 0]으로 색 구분
plt.show()

3. 모델 생성

  • 모델의 변수와 정방향 패스 함수를 정의해줍니다.
input_dim = 2 # 입력은 2차원 배열
output_dim = 1 # 출력 예측은 하나의 점수, 0에 가까우면 0, 1에 가까우면 1
W = tf.Variable(initial_value = tf.random.uniform(shape=(input_dim, output_dim))) # 임의의 초기값을 균등분포에서 가져옴
b = tf.Variable(initial_value = tf.zeros(shape=(output_dim, ))) # 임의의 초기값을 0으로 설정
def model(inputs):
    return tf.matmul(inputs, W) + b # inputs와 W를 행렬곱해준다.

4. 손실 함수

  • 모델의 성능 평가를 위한 손실 함수를 정의 한다.
def square_loss(targets, predictions):
  per_sample_losses = tf.square(targets - predictions) # 각 샘플의 손실 값을 담고 있다.
  return tf.reduce_mean(per_sample_losses) # 샘플당 손실 값을 하나의 스칼라 손실 값으로 평균을 냄

5. 훈련 스텝 함수

  • 훈련 데이터를 입력 받아 이 데이터에 대한 손실을 최소화하도록 가중치 W와 b를 업데이트 해주는 함수를 정의한다.
learning_rate = 0.1 # step

def training_step(inputs, targets):
  # 순전파 수행
  with tf.GradientTape() as tape:
    predictions = model(inputs)
    loss = square_loss(targets, predictions)
  # 역전파 수행, 각각의 업데이트 된 기울기(가중치) 산출
  grad_loss_wrt_W, grad_loss_wrt_b = tape.gradient(loss, [W, b])
  W.assign_sub(grad_loss_wrt_W * learning_rate) # 가중치 업데이트
  b.assign_sub(grad_loss_wrt_b * learning_rate) # 회귀식으로 따지면 절편

  return loss

6. 훈련 실행

  • 40번의 에포크 후 손실이 어떻게 수렴하는지 파악한다.
for step in range(40):
    loss = training_step(inputs, targets)
    print(f"{step}번째 스텝의 손실: {loss:.4f}")

7. 모델의 예측 결과와 시각화

  • 훈련된 모델의 예측 값이 0.5보다 작으면 0(음성)으로 크면 1(양성)으로 분류되는 예측결과를 시각화합니다.
x = np.linspace(-1, 4, 100)
y = - W[0] /  W[1] * x + (0.5 - b) / W[1]

fig, ax = plt.subplots(ncols = 2, figsize=(10, 5))

ax[0].scatter(inputs[:, 0], inputs[:, 1], c=targets[:, 0])
ax[0].set_title("Target")
ax[1].scatter(inputs[:, 0], inputs[:, 1], c=predictions[:, 0] > 0.5)
ax[1].set_title("Prediction")
ax[1].plot(x, y, '--r')
plt.show()

'DeepLearning' 카테고리의 다른 글

CNN_강아지 vs 고양이  (0) 2023.08.30
CNN_MNIST  (0) 2023.08.29
다중 분류 모델_Reuter  (0) 2023.08.29
이진 분류 모델_IMDB데이터  (0) 2023.08.28
MNIST데이터를 활용한 딥러닝  (0) 2023.08.24
profile

데이터 분석가

@이꾹꾹

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!