이번엔 Iris 데이터 중 두 종류를 분류하는 퍼셉트론을 제작한다. y값은 1 또는 -1을 사용하고 활성화 함수로는 하이퍼탄젠트(hypertangent)함수를 사용한다.
비용 함수로는 다음 식을 사용한다.
import tensorflow as tf
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
idx = np.in1d(iris.target, [0, 2])
X_data = iris.data[idx, 0:2]
y_data = (iris.target[idx] - 1.0)[:, np.newaxis]
X_data.shape, y_data.shape # shape확인
num_iter = 500
lr = 0.0003
X_data[0:1].shape # rank 맞추기
w = tf.Variable(tf.random.normal([2, 1], dtype=tf.float64))
b = tf.Variable(tf.random.normal([1, 1], dtype=tf.float64))
zero = tf.constant(0, dtype=tf.float64)
for epoch in range(num_iter):
for i in range(X_data.shape[0]):
x = X_data[i:i+1]
y = y_data[i:i+1]
with tf.GradientTape() as tape:
logit = tf.matmul(x, w) + b
y_hat = tf.tanh(logit)
loss = tf.maximum(zero, tf.multiply(-y, y_hat))
grad = tape.gradient(loss, [w, b])
w.assign_sub(lr * grad[0])
b.assign_sub(lr * grad[1])
y_pred = tf.tanh(tf.matmul(X_data, w) + b)
print("예측치 :", -1 if y_pred[0] < 0 else 1, "정답 :", y_data[0]) # 예측치 : -1 정답 : [-1.]
print("예측치 :", -1 if y_pred[51] < 0 else 1, "정답 :", y_data[51]) # 예측치 : 1 정답 : [1.]
print("예측치 :", -1 if y_pred[88] < 0 else 1, "정답 :", y_data[88]) # 예측치 : 1 정답 : [1.]
Reference
1) 제로베이스 데이터스쿨 강의자료