model.compile('adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

2개 분류의 문제일때는, 로스 펑션을 binary_crossentropy
3개 이상의 분류의 문제일때는? 2가지 경우가 있다!
첫번째 경우, y의 값이 레이블 인코딩으로 되어있는 경우 : sparse_categorical_crossentropy
두번째 경우, y의 값이 원핫 인코딩으로 되어있는 경우 : categorical_crossentropy

from tensorflow.keras.utils import to_categorical
y_test = to_categorical(y_test, 10)

레이블링된 y_test는 10가지 값을 가지고 있다. 

to_categorical(y_test, 10) 원핫인코딩으로 바꿀 데이터 y_test와 범주 10을 대입해주면 된다.

모델의 네트워크만 to_json으로 json형태로 변환하고 파일로 쓰고 읽는 과정이다.이 때 웨이트는 빠져있어서 학습이 안된 상태이다.

모델의 웨이트만 저장하고 불러온뒤 빈 모델에다 웨이트를 불러오고 예측을 시행한다.

model.save('fashion_mnist_model')
model2 = tf.keras.models.load_model('fashion_mnist_model')

model.save('fashion_mnist_model.h5')
model3 = tf.keras.models.load_model('fashion_mnist_model.h5')

 

전체 모델과 웨이트를 통으로 저장하고 불러올려고 한다.

첫번째는 fasion_mnist_model 이라는 폴더로 저장하고 불러와서 model2에 불러오는 것이다.

두번째는 fasion_mnist_model 이라는 이름으로 확장자는 h5로 저장하고 model3에 불러오는 것이다

epoch_history = model.fit(X_train, y_train, epochs = 10, validation_data = (X_test, y_test))

fit의 파라미터 validation_data에 튜플로 테스트할 데이터를 쌍으로 대입한다.

그러면 에포크시마다 테스트를 해서 loss와 metrics를 계산한다.

def build_model():
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(128, 'relu'))
    model.add(tf.keras.layers.Dense(10, 'softmax'))
    model.compile('adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
    return model
    
class myCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs = []):
        if logs.get('val_accuracy') > 0.87:
            print('\n밸리데이션 정확도가 87% 넘으므로, 학습을 멈추게 합니다.')
            self.model.stop_training = True

my_callback = myCallback()
model = build_model()
epoch_history = model.fit(training_images, training_labels, epochs = 30, validation_split = 0.2, callbacks = [my_callback, early_stop])

먼저 모델링 함수를 만들고, 콜백클래스를 상속받는 myCallback클래스를 만든다. on_epoch_end는 epoch가 한번 끝날 때 마다 실행되는 함수 인데 val_accuracy가 0.87이 넘으면 부모 클래스의 stop_training변수를 True로 만들게 한다.

이 클래스의 객체를 생성하고 모델을 만들고, fit의 callbacks에다 배열안에 객체를 대입해준다.

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, 'relu'))
model.add(tf.keras.layers.Dense(10, 'softmax'))
model.compile('adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
epoch_history = model.fit(training_images, training_labels, epochs = 30, validation_split = 0.2)

plt.plot(epoch_history.history['accuracy'])
plt.plot(epoch_history.history['val_accuracy'])
plt.legend(['train accuracy', 'validation accuracy'])
plt.show()

train accuracy는 정답을 알려주니까 학습을 할 수록 올라가는데, validation accuracy는 올라가지 않는다 

이런 상황을 오버 피팅이라고 한다.

y_pred = model.predict(test_images)
y_pred = y_pred.argmax(axis = 1)
cm = confusion_matrix(test_labels, y_pred)

y_pred의 각행에서(axis = 1) 가장 큰 값의 인덱스를 argmax로 구하면 레이블 인코딩이 된다.

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, 'relu'))
model.add(tf.keras.layers.Dense(10, 'softmax'))
model.compile('adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
# model.compile('adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.fit(training_images, training_labels, epochs = 5)

2개 분류의 문제일때는, 로스 펑션을 binary_crossentropy
3개 이상의 분류의 문제일때는? 2가지 경우가 있다!
첫번째 경우, y의 값이 레이블 인코딩으로 되어있는 경우 : sparse_categorical_crossentropy
두번째 경우, y의 값이 원핫 인코딩으로 되어있는 경우 : categorical_crossentropy

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, 'relu'))
model.add(tf.keras.layers.Dense(10, 'softmax'))
model.compile('adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
model.fit(training_images, training_labels, epochs = 5)

Softmax(소프트맥스)는 입력받은 값을 출력으로 0~1사이의 값으로 모두 정규화하며 출력 값들의 총합은 항상 1이 되는 특성을 가진 함수이다. 출력값은 각 레이블의 확률이 된다.

 

 

+ Recent posts