데이터분석
텐서플로우(tensorflow) 2.x 에서 iris dataset 분류하기
jaehwi0823
2019. 10. 17. 21:10
전세계 머신러닝, 딥러닝 개발자들이 가장 많이 사용하는 프레임워크인 tensorflow의 기초 활용 방법에 대해 정리합니다.
01. low-level 단순 예제
tensorflow의 low-level은 직접 텐서를 곱하고, 가중치를 업데이트 하는 등의 상세한 프로세스를 직접 나열합니다. 여기에서는 iris 데이터를 예측하는 간단한 tensorflow 모형을 만들어 봅니다.
# iris 데이터셋 활용
from sklearn.datasets import load_iris
iris = load_iris()
# 데이터 확인
print(iris.keys())
# input, output 분리
X = iris['data']
y = iris['target']
# 개발/검증 분리
from sklearn.model_selection import train_test_split
train, test, label_tr, label_te = train_test_split(X,
y,
test_size=0.2,
stratify=y,
random_state=1)
# toy example
class TfModel(object):
def __init__(self, learning_rate=0.01):
self.w = tf.Variable(tf.random.uniform(shape=(4, 1)))
self.b = tf.Variable(tf.zeros(shape=(1)))
self.optimizer = tf.keras.optimizers.SGD(lr=learning_rate)
def fit(self, train, target, epochs=10):
costs=[]
for step in range(epochs):
with tf.GradientTape() as tape:
z = tf.matmul(tf.cast(train, tf.float32), self.w) + self.b
z = tf.reshape(z, [-1])
se = tf.square(target - z)
mc = tf.reduce_mean(se)
grads = tape.gradient(mc, [self.w, self.b])
self.optimizer.apply_gradients(zip(grads, [self.w, self.b]))
costs.append(mc.numpy())
return costs
def transform(self, X):
return tf.matmul(tf.cast(X, tf.float32), self.w) + self.b
# cost 감소 확인
md = TfModel()
costs = md.fit(train, label_tr)
costs
만들어진 모형이 얼마나 잘 동작하는지 테스트 데이터의 loss를 계산해봅시다.
pred = md.transform(test)
tf.reduce_mean(tf.square(pred - label_te))
# <tf.Tensor: id=2410, shape=(), dtype=float32, numpy=0.7382826>
02. tf.keras 활용 예제
이제 사용자의 편의를 위해 구성된 상위 api tf.keras를 활용합니다. 상위 api를 활용하면 더욱 직관적이면서도 손쉽게 모델링이 가능합니다.
import tensorflow as tf
import numpy as np
# 빈 모델을 선언
model = tf.keras.models.Sequential()
# 빈 모델에 첫번째 layer을 추가,
# units에는 hidden node 갯수를 명시하고, input 차원에 train 데이터의 차원을 입력
model.add(
tf.keras.layers.Dense(units=6,
input_dim=train.shape[1],
activation='tanh')
)
# 두번째 layer을 추가
model.add(
tf.keras.layers.Dense(units=3,
activation='softmax')
)
# 만들어진 모델 확인
model.summary()
# 모형 학습방식 정의
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01,
momentum=0.9,
nesterov=True)
# 모형 컴파일
model.compile(optimizer = optimizer,
loss='categorical_crossentropy')
# low-level 방식과 다르게 target을 범주화
label_tr_oh = tf.keras.utils.to_categorical(label_tr)
# 모형 적합
history = model.fit(train,
label_tr_oh,
batch_size=16,
epochs=30)
# 결과 확인
np.argmax(model.predict_proba(train), axis=1)
# 정확도(Accuracy) 출력
np.sum(np.argmax(pred, axis=1) == label_tr) / train.shape[0]