[AIVLE] 딥러닝 2일차

    은닉층 추가

    어제 만들었던 모델에 은닉층을 추가해보자. = Hidden Layer

     

    라이브러리를 먼저 불러와준다.

    from sklearn.datasets import fetch_california_housing
    california = fetch_california_housing()
    x = california.data
    y = california.target
    
    x.shape, y.shape	# (20640,8) (20640,)
    import tensorflow as tf
    import pandas as pd
    import numpy as np
    from tensorflow import keras

    어제 배운대로 모델 구조를 하나씩 쌓아가자.

    keras.backend.clear_session()
    
    model = keras.models.Sequential()
    model.add(keras.layers.Input(shape = (8,)))
    model.add(keras.layers.Dense(1))
    
    model.compile(loss = 'mse', optimizer = 'adam')

    여기서, 이제 add로 레이어 사이에 히든 레이어를 추가해줄 것이다.

    수정된 코드는 다음과 같다.

    keras.backend.clear_session()
    
    model = keras.models.Sequential()
    model.add(keras.layers.Input(shape = (8,)))
    model.add(keras.layers.Dense(32, activation = 'relu'))
    model.add(keras.layers.Dense(32, activation = 'relu'))
    model.add(keras.layers.Dense(1))
    
    model.compile(loss = 'mse', optimizer = 'adam')

    파이토치에서는 전 레이어 노드 수랑 맞춰서 적어줘야 했는데, 케라스에서는 그냥 현재 레이어의 노드 수만 적으면 알아서 맞춰주는 것 같다. 편한데 뭔가 어색한 느낌이긴 하다.

     

     

    MNIST 데이터셋 다루기

    sklearn에서 유명한 mnist dataset도 불러와서 사용할 수 있다.

    라이브러리와 데이터들을 불러와주자.

    import tensorflow as tf
    from tensorflow import keras
    
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    import random as rd
    
    from sklearn.metrics import accuracy_score
    
    (train_x, train_y), (test_x, test_y) = keras.datasets.mnist.load_data()

    알아서 train test도 분리해놓은 갓 데이터다.

    train_x.shape, train_y.shape, test_x.shape, test_y.shape
    # ((60000, 28, 28), (60000,), (10000, 28, 28), (10000,))

    데이터를 한번 확인해보자. MNIST는 손글씨 분류 데이터로, 0~9까지의 손글씨를 알맞게 분류하는 태스크다.

    plt.imshow(train_x[2], cmap = 'gray')
    plt.show()

     

    데이터 전처리

    이미지를 그대로 집어넣고 컴퓨터가 알아서 분류해주면 참 좋겠지만, 전처리는 정말 어디서든 필수다.

    (28 x 28)의 6만장 데이터를 어떻게 전처리를 해야할까?

    reshape를 통해 28x28의 2차원 데이터를 1차원으로 쫙 펴준다.

    train_x = train_x.reshape([train_x.shape[0],-1])
    test_x = test_x.reshape([test_x.shape[0],-1])
    train_x.shape	# (60000, 784)

    그리고 min-max scaling을 해준다.

    print(f'max : {train_x.max()} / min : {train_x.min()}')
    max_n, min_n = train_x.max(), train_x.min()
    train_x = (train_x - min_n) / (max_n - min_n)
    test_x = (test_x - min_n) / (max_n - min_n)

    그다음 y값 형식을 바꿔주자.

    from tensorflow.keras.utils import to_categorical
    
    train_y = to_categorical(train_y, len_y)
    test_y = to_categorical(test_y, len_y)

    이러면 전처리가 끝났다.

     

     

    모델링

    모델링 과정은 뭐 어제 하던거랑 똑같다.

    keras.backend.clear_session()
    
    model = keras.models.Sequential()
    
    model.add(keras.layers.Input(shape = train_x.shape[1]))
    model.add(keras.layers.Dense(10, activation = 'softmax'))
    
    model.compile(loss = keras.losses.categorical_crossentropy, metrics = ['accuracy'],
    optimizer = 'adam')
    
    model.summary()

    그리고 이제 중요한 개념 하나가 나오는데, Early Stopping이라 한다.

    간단히 설명하면 모델이 최적의 성능일때 학습을 멈추는거다.

    텐서플로우에는 이런걸 제공도 해준다. 파이토치도 있는데 내가 못 찾은 거겠지...

     

    from tensorflow.keras.callbacks import EarlyStopping
    es = EarlyStopping(monitor='val_loss',	# 기준이 되는 값
                       min_delta=0,	# 최소한의 변화량
                       patience=5,	# 개선 없을 경우 몇번 더 참을거냐(진행할거냐)
                       verbose=1,	# ES 적용되면 적용되었다고 화면에 표시
                       restore_best_weights=True)	# 트레이닝 끝난 후 웨이트를 ES의 웨이트로 변경, False면 그냥 마지막 트레인 웨이트 그대로
    model.fit(train_x, train_y, validation_split=0.2, callbacks=[es],
              verbose=1, epochs=50)

    이렇게 학습을 시켜주면

    50번 하다가 중간에 지혼자 멈추고, 베스트 에포크까지 뽑아준다. 아니 진짜 파이토치에 이거 왜 없었지 진짜 못찾은건가...

    ㅠㅡㅠ...

    그리고 이제 모델 확인해주면 된다.

    pred_train = model.predict(train_x)
    pred_test = model.predict(test_x)
    
    single_pred_train = pred_train.argmax(axis=1)
    single_pred_test = pred_test.argmax(axis=1)
    
    logi_train_accuracy = accuracy_score(train_y.argmax(axis=1), single_pred_train)
    logi_test_accuracy = accuracy_score(test_y.argmax(axis=1), single_pred_test)
    
    print('트레이닝 정확도 : {:.2f}%'.format(logi_train_accuracy*100))
    print('테스트 정확도 : {:.2f}%'.format(logi_test_accuracy*100))

    argmax는 max 인덱스 반환하는 함수

     

     

    2일차는 이만큼 배웠다.

    'AIVLE' 카테고리의 다른 글

    [AIVLE] 딥러닝 4일차 - multi input  (0) 2023.03.03
    [AIVLE] 딥러닝 3일차(CIFAR) + Functional API  (1) 2023.03.02
    [AIVLE] 딥러닝 - keras 기초  (0) 2023.02.27
    [AIVLE] 머신러닝  (0) 2023.02.24
    [KT AIVLE 3기] 이변량분석  (0) 2023.02.10
    Posted by 저본