AI/Tensorflow
Tensorflow iris 붓꽃 모델 자격증 공부
Urong
2020. 12. 22. 16:48
728x90
세번째 모델에 대한 공부이다.
구글링을 해보면 참 많이 나오는 dataset이며 초기 공부에 많이 쓰이는 붓꽃분류 모델이다.
Python을 이용하여 작성하였으며 각 코드에 대해서는 주석으로 메모를 해 놓았다.
시험에는 dataset전처리 및 확인 모델링등이 자주 나온다고 하니 꼭 알아두도록 하자.
from IPython.display import Image
Image('https://user-images.githubusercontent.com/15958325/56006707-f69f3680-5d10-11e9-8609-25ba5034607e.png')
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import ModelCheckpoint
#data = tfds.load('iris', split=tfds.Split.TRAIN.subsplit(tfds.percent[:80])) #옛날방식이다.
train_dataset = tfds.load('iris', split='train[:80%]')
valid_dataset = tfds.load('iris', split='train[80%:]')
#dataset전처리
#dataset의 확인
#for data in train_dataset.take(5):
# x = data['features']
# y = data['label']
# y = tf.one_hot(y, 3) #3에는 dataset에서 num_classes숫자를 찾아넣어준다.
#print(x)
#print(y)
#dataset확인 후 전처리
def preprocess(data):
x = data['features']
y = data['label']
y = tf.one_hot(y, 3)
return x, y
#data mapping
BATCH_SIZE = 10 #batch? batch_size 는 한개의 batch에 들어가는 data의 수
# batch_size = 10 이면 batch =100개 data가 1000개 일 경우 100번의 update가 일어난다.
# batch_size가 작으면, 학습이 정교하게된다. 느려진다.
# batch_size가 크면, 속도가 빠르다. 정교함이 떨어진게 된다.
train_dataset = train_dataset.map(preprocess).batch(BATCH_SIZE) #학습데이터
valid_dataset = valid_dataset.map(preprocess).batch(BATCH_SIZE) #검증데이터
#모델링
#이제 Modeling을 할 차례입니다.
#Sequential 모델 안에서 층을 깊게 쌓아 올려 주면 됩니다.
#input_shape는 Iris 꽃 데이터셋의 X의 feature 갯수가 4개 이므로 (4, )로 지정합니다.
#깊은 출력층과 더 많은 Layer를 쌓습니다.
#Dense Layer에 activation='relu'를 적용합니다.
#분류(Classification)의 마지막 층의 출력 숫자는 분류하고자 하는 클래스 갯수와 같아야 합니다.
model = tf.keras.models.Sequential([
#input_shape는 x의 feature갯수가 4개이므로 (4,)로 지정한다.
Dense(512, activation='relu', input_shape=(4,)),
Dense(256, activation='relu'),
Dense(128, activation='relu'),
Dense(64, activation='relu'),
Dense(32, activation='relu'),
#Classification을 위한 Sformax, 클래스 갯수 = 3개
Dense(3, activation='softmax') #2개이상이면 softmax
])
#model compile
#optimizer는 가장 최적화가 잘되는 알고리즘인 'adam'을 사용합니다.
#loss설정
#출력층 activation이 sigmoid 인 경우: binary_crossentropy
#출력층 activation이 softmax 인 경우:
#원핫인코딩(O): categorical_crossentropy
#원핫인코딩(X): sparse_categorical_crossentropy)
#metrics를 'acc' 혹은 'accuracy'로 지정하면, 학습시 정확도를 모니터링 할 수 있습니다.
#전처리 단계에서 one-hot encoding 을 해주었습니다. 따라서, categorical_crossentropy를 지정해주면 됩니다.
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
#ModelCheckpoint: 체크포인트 생성
#val_loss 기준으로 epoch 마다 최적의 모델을 저장하기 위하여, ModelCheckpoint를 만듭니다.
#checkpoint_path는 모델이 저장될 파일 명을 설정합니다.
#ModelCheckpoint을 선언하고, 적절한 옵션 값을 지정합니다.
checkpoint_path = 'my_checkpoint.ckpt'
checkpoint = ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
save_best_only=True,
monitor='val_loss',
verbose=1)
#학습 (fit)
#validation_data를 반드시 지정합니다.
#epochs을 적절하게 지정합니다.
#callbacks에 바로 위에서 만든 checkpoint를 지정합니다.
history = model.fit(train_dataset,
validation_data=(valid_dataset),
epochs=20,
callbacks=[checkpoint],
)
#학습 완료 후 Load Weights (ModelCheckpoint)
#학습이 완료된 후에는 반드시 load_weights를 해주어야 합니다.
#그렇지 않으면, 열심히 ModelCheckpoint를 만든 의미가 없습니다.
#checkpoint를 저장한 파일명을 입력합니다.
model.load_weights(checkpoint_path)
#학습 Loss (오차)에 대한 시각화
import matplotlib.pyplot as plt
plt.figure(figsize=(12,9))
plt.plot(np.arange(1,21), history.history['loss'])
plt.plot(np.arange(1,21), history.history['val_loss'])
plt.title('Loss / Val Loss', fontsize=20)
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['loss', 'val_loss'], fontsize=15)
plt.show()
plt.figure(figsize=(12,9))
plt.plot(np.arange(1,21), history.history['acc'])
plt.plot(np.arange(1,21), history.history['val_acc'])
plt.title('Acc / Val Acc', fontsize=20)
plt.xlabel('Epochs')
plt.ylabel('Acc')
plt.legend(['acc', 'val_acc'], fontsize=15)
plt.show()
iris 붓꽃 dataset에는 3종류의 classfication이 되어 있고 이것은 4가지의 변수로 정하게 되어있다.
모델링은 했지만 이미지나 뭔가를 입력해서 값을 출력하는 것은 없다.
단지 모델의 loss 와 acc 값만 출력하는 plot가 있을 뿐이다.
728x90
반응형