Sequential API로 분류 모델 만들기
다음은 fashion MNIST dataset을 이용해서 두 개의 은닉 층으로 이루어진 MLP을 구현한 것이다.
model = tf.keras.Sequential() # 1
model.add(tf.keras.layers.Input(shape=[28, 28])) # 2
model.add(tf.keras.layers.Flatten()) # 3
model.add(tf.keras.layers.Dense(300, activation='relu')) # 4
model.add(tf.keras.layers.Dense(100, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax')) # 5
- 가장 간단한 keras 신경망 모델인
Sequential
모델을 만든다.Sequential
모델은 순서대로 연결된 층을 쌓아서 구성된다. - 첫 번째
Input
층이다. 입력의 크기를 알려주어야 keras가 가중치 행렬의 크기를 정할 수 있다. Flatten
층으로, 이미지를 1D 배열로 변환한다. 간단한 전처리만 담당하는 층이다.- 뉴런 300개를 가진
Dense
층이다. 활성화 함수는 ReLU를 사용하였다. - 출력층으로, 배타적인 클래스이므로 softmax 함수를 사용하였다.
층을 하나씩 추가하는 대신 리스트로 만들어서 전달할 수도 있다.
model.summary()
를 이용하면 모델의 층, 출력 크기, 파라미터 수 등을 확인할 수 있다.
층의 모든 파라미터는 get_weights()
를 사용해 접근할 수 있다.
분류 모델 컴파일
모델을 만들고 나서는 compile()
을 호출하여 다음을 정해주어야 한다.
- 사용할 손실 함수
- 옵티마이예측 만들기
예측은
predict()
매서드를 이용한다.
>>> X_new = X_test[:3]
>>> y_proba = model.predict(X_new)
>>> y_proba.round(2)
array([[0. , 0. , 0. , 0. , 0. , 0.13, 0. , 0.01, 0. , 0.86],
[0. , 0. , 1. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 1. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ]],
dtype=float32)
위 결과에서 확인할 수 있듯이 predict_proba()
처럼 각 클래스의 확률을 반환한다. 따라서 argmax()
를 이용해 가장 높은 확률을 가지는 클래스를 반환할 수 있다.
>>> import numpy as np
>>> y_pred = y_proba.argmax(axis=1)
>>> y_pred
array([9, 2, 1])
>>> np.array(class_names)[y_pred]
array(['Ankle boot', 'Pullover', 'Trouser'], dtype='<U11')
Sequential API로 회귀 모델 만들기
회귀 모델은 전반적으로 분류 모델과 비슷한 구조를 가지고 있으나, 몇 가지 차이점이 있다.
- 출력 층에 하나의 뉴런만이 있다. 또한 활성화 함수를 사용하지 않는다.
- 손실 함수는 MSE, 측정 지표는 RMSE이다.
Normalization
층이 있다. 다만,Normalization
층을 사용하면fit()
을 호출하기 전에adapt()
매서드를 먼저 호출하여 훈련 데이터에 적응시켜야 한다.
norm_layer = tf.keras.layers.Normalization(input_shape=X_train.shape[1:])
model = tf.keras.Sequential([
norm_layer,
tf.keras.layers.Dense(50, activation='relu'),
tf.keras.layers.Dense(50, activation='relu'),
tf.keras.layers.Dense(50, activation='relu'),
tf.keras.layers.Dense(1)
])
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
model.compile(loss='mse', optimizer=optimizer, metrics=['RootMeanSquaredError'])
norm_layer.adapt(X_train)
history = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))
mse_test, rmse_test = model.evaluate(X_test, y_test)
X_new = X_test[:3]
y_pred = model.predict(X_new)
별도의 출처 표시가 있는 이미지를 제외한 모든 이미지는 강의자료에서 발췌하였음을 밝힙니다.
댓글남기기