딥러닝 기초 | 인공신경망 모델 만들기 | 텐서플로(Tensorflow) / 케라스(Keras) | 로지스틱 회귀로 패션 아이템 분류하기(SGDClassifier 클래스_확률적 경사 하강법) | 패션 MNIST 데이터셋

    728x90

     

    1. 패션 MNIST 데이터 가져오기

     

    ▶ 패션 MNIST 데이터 

    : 10종류의 패션 아이템으로 구성

    : MNIST 데이터는 워낙 유명하기 때문에 많은 딥러닝 라이브러리에서 이 데이터를 가져옴

    : 텐서플로를 사용해 이 데이터를 읽어옴

    : 텐서플로의 케라스(Keras) 패키지를 임포트하고 패션 MNIST 데이터를 사용

     

    ▶ 텐서플로 케라스(Keras) 패키지 가져오기

    from tensorflow import keras
    
    (train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

    : 실행마다 동일한 결과를 얻기 위해 케라스 랜덤 시드를 사용, 텐서플로 연산을 결정적으로 만듦

    : Keras.datasets.fashion.mnist 모듈 아래 load_data() 함수는 친절하게 훈련 데이터와 테스트 데이터를 나누어 반환

    : 데이터는 각각 입력과 타깃의 쌍으로 구성

     

    ▶ 전달받은 데이터의 크기 확인

     

    * 훈련 데이터 크기

    print(train_input.shape, train_target.shape)

    >> 훈련 데이터는 60,000개의 이미지로 이루어짐

    >> 각 이미지는 28x28 크기, 타깃도 60,000개의 원소가 1차원 배열

     

    * 테스트 데이터 크기

    print(test_input.shape, test_target.shape)

    >> 테스트 데이터는 10,000개의 이미지로 이루어짐

    >> 각 이미지는 28x28 크기, 타깃도 10,000개의 원소가 1차원 배열

     

    ▶ 훈련데이터에서 몇 개의 샘플을 그림으로 출력해보기

    import matplotlib.pyplot as plt
    
    fig, axs = plt.subplots(1, 10, figsize=(10,10))
    for i in range(10):
        axs[i].imshow(train_input[i], cmap='gray_r')
        axs[i].axis('off')
    plt.show()

    >> 신발과 다양한 종류의 옷이 보임

    >> 이미지인지는 직접 보는 것이 문제를 이해하는 데 도움이 됨

    >> 크기가 28x28이다 보니 꽤 작고 흐릿함. 흑백 이미지

     

    ▶ 파이썬 리스트로 처음 10개의 샘플 타깃값 출력하기

    : 처음 10개의 샘플의 타깃값을 리스트로 만든 후 출력

    print([train_target[i] for i in range(10)])

     

    ▶ 중복 제거하고 타깃값 출력하기  

    import numpy as np
    
    print(np.unique(train_target, return_counts=True))

     


    2. 로지스틱 회귀로 패션 아이템 분류하기

     

    ▶ 2차원 배열을 1차원 배열로 바꾸기

    train_scaled = train_input / 255.0
    train_scaled = train_scaled.reshape(-1, 28*28)

    : reshape() 메서드의 두 번째 매개변수를 이미지 크기에 맞게 지정하면(28x28)

    첫 번째 차원(샘플 개수)은 변하지 않고, 원본 데이터의 두 번째, 세 번째 차원이 1차원으로 합쳐짐

     

    ▶ 변환된 train_scaled 크기 확인

    print(train_scaled.shape)

    >> 784 픽셀로 이루어진 60,000개의 샘플이 준비됨

     

    ▶ SGDClassifier 클래스, cross_validate 함수 

    : 훈련 샘플이 60,000개나 되는데 전체 데이터를 한 번에 사용하여 모델을 훈련하기는 어려움

    확률적 경사 하강법(SGDClassifier)은 샘플을 하나씩 꺼내어 모델을 훈련하는 방법에 효과적임

    :  SGDClassifier 클래스, cross_validate 함수로 데이터를 교차 검증 해서 모델을 평가함

    from sklearn.model_selection import cross_validate
    from sklearn.linear_model import SGDClassifier
    
    sc = SGDClassifier(loss='log', max_iter=5, random_state=42)
    
    scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
    print(np.mean(scores['test_score']))

     


    3. 인공신경망 활용

     

    3-1) 인공신경망_텐서플로와 케라스

     

    ▶ 인공신경망

    : 인공신경망은 확률적 경사 하강법을 사용하는 로지스틱 회귀와 같음

    : 패션아이템 분류 문제를 인공신경망으로 표현

     

    ▶ 텐서플로와 케라스 가져오기

    import tensorflow as tf
    from tensorflow import keras

    : 텐서플로는 구글의 딥러닝 라이브러리(코랩에는 텐서플로가 설치되어 있기 때문에 임포트하여 사용 가능)

    : 텐서플로에는 저수준 API와 고수준 API가 있는데 케라스는 고수준 API임

    : 딥러닝 라이브러리가 달든 머신러닝 라이브러리와 다른 점 중 하나는 그래픽 처리 장치인 GPU를 사용해 인공신경망을 훈련한다는 점

    : GPU는 벡터와 행렬 연산에 매우 최적화되어 있어 곱셈과 덧셈이 많이 수행되는 인공신경망에 큰 도움이 됨

     

    3-2) 인공신경망으로 모델 만들기

     

    ▶ 훈련세트와 검증세트 만들기

    : 로지스틱 회귀에서는 교차 검증을 사용해 모델을 평가하지만 인공신경망에서는 교차검증을 잘 사용하지 않고, 검증세트를 별도로 구성하여 사용

    : 딥러닝 분야의 데이터셋은 충분히 커서 검증 점수가 안정적이지만 교차 검증을 수행하기에는 훈련 시간이 오래 걸림

    : 딥러닝 모델은 훈련하는 데에 몇 시간, 며칠이 걸리기도 함

    from sklearn.model_selection import train_test_split
    
    train_scaled, val_scaled, train_target, val_target = train_test_split(
        train_scaled, train_target, test_size=0.2, random_state=42)

    : 패션 MNIST 데이터셋은 그만큼 많지는 않지만 관례를 따라 검증세트로 나누어 진행

     

    ▶ 훈련세트와 검증세트 크기 확인

     

    * 훈련세트 크기

    print(train_scaled.shape, train_target.shape)

    >> 훈련세트의 20%를 검증세트로 나눔

     

    * 검증세트 크기

    print(val_scaled.shape, val_target.shape)

    >> 60,000개 중에 12,000개가 검증세트로 분리

     

    dense 클래스로 밀집층 만들기

    dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))

    : 필요한 매개변수는 뉴런 개수(10개), 뉴런의 출력에 적용할 수 있는 함수(softmax), 입력의 크기(784)

     

    밀집층을 가진 신경망 모델 만들기

    : 케라스의 Sequential 클래스 사용

    model = keras.Sequential(dense)

     


    4. 인공신경망으로 패션 아이템 분류하기

     

    ▶ 케라스 모델 훈련하기 전 설정 단계

    : 이런 설정을 model 객체compile() 메서드에서 수행

    model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

     

    ▶ train_target 10개 출력해보기

    print(train_target[:10])

     

    ▶ 모델 훈련_fit() 메서드 사용

    : 훈련하는 fit() 메서드는 사이킷런과 매우 비슷

    : 두 매개변수에 입력(train_scaled), 타깃(train_target) 입력

    : epochs = 매개변수로 반복할 에포크 횟수를 지정 

    model.fit(train_scaled, train_target, epochs=5)

     

    ▶ 모델 훈련_evaluate() 메서드 사용

    : evaluate() 메서드도 fit() 메서드와 비슷한 출력을 보여줌

    model.evaluate(val_scaled, val_target)

    >> 검증세트의 점수는 훈련세트의 점수보다 조금 낮은 것이 일반적

    >> 예상대로 평가 결과는 훈련세트의 점수보다 조금 낮은 85% 정도의 정확도를 반환

    >> 패션 아이템을 분류하는 모델을 잘 훈련함

    728x90

    댓글