퍼셉트론

yeoni·2023년 6월 27일
0

Tensorflow

목록 보기
6/15

이번엔 Iris 데이터 중 두 종류를 분류하는 퍼셉트론을 제작한다. y값은 1 또는 -1을 사용하고 활성화 함수로는 하이퍼탄젠트(hypertangent)함수를 사용한다.

y^=tanh(wTx)\Large{ \hat{y} = tanh(w^Tx) }

비용 함수로는 다음 식을 사용한다.

Loss=i=1Nmax(0,yiyi^)\large{ Loss = \sum_{i=1}^N \max(0, -y_i \hat{y_i}) }
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확인

Perceptron 구현

  • 데이터 하나당 한번씩 weights 업데이트
  • step size == 0.0003
  • iteration == 200
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) 제로베이스 데이터스쿨 강의자료

profile
데이터 사이언스 / just do it

0개의 댓글