-
텐서플로우(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]
'데이터분석' 카테고리의 다른 글
[Tensorflow 2.0] custom gradient 함수로 reverse gradient 구현하기 (0) 2019.11.07 [tensorflow 2.0] tf.slice (0) 2019.11.01 배열 3차원 이상 곱셈 (380) 2019.10.16 sklearn, numpy를 활용한 데이터 차원축소 (374) 2019.10.15 sklearn, pandas, numpy를 활용한 데이터 전처리 (0) 2019.10.14