데이터분석

텐서플로우(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]