ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 텐서플로우(tensorflow) 2.x 에서 iris dataset 분류하기
    데이터분석 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]

     

    댓글

Designed by Tistory.