- 이번 글에서는 텐서플로와 간단한 데이터셋으로 이진 분류모델을 구현해보겠습니다.
교재 홍보
- 다음의 교재의 내용을 참고하였습니다.
- 교재 구매 : https://www.yes24.com/Product/Goods/112012471
케라스 창시자에게 배우는 딥러닝 개정 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 |
