오늘은 딥러닝 3일차로 여러옵션과 Function API에 대해 배웠습니다.
argmax()
는 각 축에서 가장 높은 값을 뽑아주는 함수입니다.
mnist는 숫자를 손글씨로 나타낸 데이터들 입니다. 해당 데이터는 2차원 데이터이지만 reshape를 통해 1차원 데이터로 바꾸어주었습니다. 하지만 2차원 데이터를 1차원 데이터로 바꾸는 것이 맞는가에 대해서 생각해봐야합니다.
히든레이어(은닉층)의 노드는 관습적으로 2의 배수로 설정합니다.
Flatten 레이어를 사용하면 reshape로 1차원으로 전처리 해주지 않아도 reshape와 같이 1차원 형태로 늘려주는 기능을 하는 레이어입니다.
▶실습
이번 실습에서는 Fashion MNIST 데이터를 사용했습니다.
▶필요패키지 불러오기
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
▶데이터셋 분리
train과 test 데이터 셋으로 분리합니다.
(x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data()
▶전처리
이제 데이터 셋 분리까지 끝났으면 딥러닝 모델링에 앞서 전처리에 들어갑니다.
우선 분류문제이기 때문에 x와 y에 대해서 정규화 및 One-Hot Encoding을 실행합니다.
x_max = x_train.max()
x_min = x_train.min()
x_train = (x_train - x_min) / (x_max - x_min)
x_test = (x_test - x_min) / (x_max - x_min)
from tensorflow.keras.utils import to_categorical
len_y = len(set(y_train))
y_train = to_categorical(y_train, len_y)
y_test = to_categorical(y_test, len_y)
전처리가 끝난 후에는 데이터의 형태를 보고 어떤 식으로 모델을 쌓을 지 확인합니다.
x_train.shape, x_test.shape, y_train.shape, y_test.shape
▶모델링
이제 모든 준비가 끝났으므로 모델링에 들어갑니다.
keras.backend.clear_session()
model = keras.models.Sequential()
model.add(keras.layers.Input(shape=(28,28)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(512, activation='relu'))
model.add(keras.layers.Dense(512, activation='relu'))
model.add(keras.layers.Dense(512, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
model.compile(loss = keras.losses.categorical_crossentropy, metrics=['accuracy'], optimizer='adam')
변경된 사항은 크게 없지만 전처리때 x에 대해서 정규화만 진행했고 reshape로 2차원 데이터를 1차원 데이터로 바꾸어주지 않았는데 여기서 keras.layers.Flatten()
를 사용해줌으로써 1차원으로 데이터를 바꾸어 주었습니다.
▶ES 적용 및 모델 학습
from tensorflow.keras.callbacks import EarlyStopping
es = EarlyStopping(monitor='val_loss', min_delta=0, patience=5, restore_best_weights=True, verbose=1)
model.fit(x_train, y_train, validation_split=0.2, callbacks=[es], verbose=1, epochs=50)
model.summary()
EarlyStopping()
를 사용하여 과적합을 방지했습니다.
▶모델평가
model.evaluate(x_test, y_test)
마지막으로 모델 평가를 진행했습니다.
※딥러닝을 진행할 때 틀린 값이나 맞는 값을 확인하는 과정이 꼭 필요하다고 하는데 아직 코드리딩이 약한 것 같아서 조금 더 이해를 한 후에 포스팅에 추가하도록 하겠습니다.
지금까지는 흑백 데이터를 다뤘지만 CIFAR-10는 컬러 데이터입니다. 컬러데이터는 지금까지 흑백데이터와 비슷하지만 인풋레이어 부분이 다릅니다. 전처리와 결과 확인부분은 같기 때문에 모델링부분을 보겠습니다.
keras.backend.clear_session()
model = keras.models.Sequential()
model.add(keras.layers.Input(shape=(32,32,3)) )
model.add(keras.layers.Flatten() )
model.add(keras.layers.Dense(512, activation='swish') )
model.add(keras.layers.Dense(512, activation='swish') )
model.add(keras.layers.Dense(256, activation='swish') )
model.add(keras.layers.Dense(128, activation='swish') )
model.add(keras.layers.Dense(10, activation='softmax') )
model.compile(loss='categorical_crossentropy', metrics=['accuracy'],
optimizer='adam')
model.summary()
keras.layers.Input(shape=(32,32,3))
를 보시게 되면 흑백 데이터와 다르게 인자를 3개를 가지는 것을 볼 수 있습니다. 나머지는 크게 다른게 없습니다.
지금까지는 순차적으로 레이어를 쌓아서 학습하는 Sequential()과는 다른 모델링 방법으로 사슬로 엮는 방식입니다. 실습으로 자세히 보겠습니다. 데이터는 전에 사용한 사이킷런에서 제공하는 캘리포니아 집값 데이터로 진행하겠습니다.
▶필요 패키지 불러오기
먼저 필요패키지를 불러옵니다.
import numpy as np
import pandas as pd
from sklearn.datasets import fetch_california_housing
import tensorflow as tf
from tensorflow import keras
▶데이터 불러오기
데이터를 불러온 다음 train과 test 셋으로 나누어줍니다.
california = fetch_california_housing()
x = california.data
y = california.target
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
x_train.shape, y_train.shape
항상 필요 패키지를 위에 써야지 해도 막상 사용하는 코드내에서 선언하는 것 같습니다...
▶모델링
회귀 모델 딥러닝이므로 따로 전처리할 것이 없어서 바로 모델링으로 들어가겠습니다.
keras.backend.clear_session()
input_layer = keras.layers.Input(shape=(8,))
h1 = keras.layers.Dense(512, activation='relu')(input_layer)
h2 = keras.layers.Dense(256, activation='relu')(h1)
h3 = keras.layers.Dense(128, activation='relu')(h2)
output_layer = keras.layers.Dense(1)(h3)
model = keras.models.Model(inputs=input_layer, outputs=output_layer)
model.compile(loss='mse', optimizer='adam')
여기서 보게 되면 Sequential()이 아니라 model = keras.models.Model(inputs=input_layer, outputs=output_layer)
를 작성해서 모델 선언을 진행했습니다. Functional API는 시작 레이어와 끝 레이어를 매개변수로 넣어주어야 합니다. 또 각 레이어에 변수를 지정해서 각 각 전에 있는 레이어를 ( )안에 써주어서 연결을 시켜주어야 합니다.
▶모델학습
과적합을 위해 EarlyStopping을 사용해서 모델학습을 진행합니다.
from tensorflow.keras.callbacks import EarlyStopping
es = EarlyStopping(monitor='val_loss', min_delta=0, patience=4, restore_best_weights=True, verbose=1)
model.fit(x_train, y_train, callbacks=[es], validation_split=0.2, epochs=1000, verbose=1)
▶모델평가
model.evaluate(x_test, y_test)
딥러닝의 3일차로 1~2일차 복습후 진도를 더 나갔는데 개인 스스로 아쉬운점은 아직 코드 리딩 능력이 부족한 것 같다고 느꼈습니다. 모델링은 따라하겠지만 마지막 모델이 어떤 문제를 틀렸는지 시각화 하는 부분을 아직 잘 모르는 것 같아서 아쉬움이 남았습니다. 이 아쉬움을 발판 삼아 해석에 더 힘써야겠습니다
※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.