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
  1. 가장 간단한 keras 신경망 모델인 Sequential 모델을 만든다. Sequential 모델은 순서대로 연결된 층을 쌓아서 구성된다.
  2. 첫 번째 Input층이다. 입력의 크기를 알려주어야 keras가 가중치 행렬의 크기를 정할 수 있다.
  3. Flatten 층으로, 이미지를 1D 배열로 변환한다. 간단한 전처리만 담당하는 층이다.
  4. 뉴런 300개를 가진 Dense층이다. 활성화 함수는 ReLU를 사용하였다.
  5. 출력층으로, 배타적인 클래스이므로 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)

코드 보러가기



별도의 출처 표시가 있는 이미지를 제외한 모든 이미지는 강의자료에서 발췌하였음을 밝힙니다.

댓글남기기