본문 바로가기
Study/머신러닝

[Tensorflow] 텐서플로우를 사용한 CNN 모델 학습&평가하기

by 투말치 2021. 1. 17.

목차

    반응형

    모델을 학습시키기 전에 설정할 것

    1. Loss Function

    - crossentropy 사용

    - 그 중 sparse_categorical_crossentropy 사용

     

    2. Metrics : 모델 평가 방법

    - accuracy 사용

    - accuracy가 가장 흔히 사용됨

    #accuracy 설정하는 방법 1
    metrics = ['accuracy']
    
    #accuracy 설정하는 방법 2
    tf.keras.metrics.Accuracy()

     

    3. compile : Optimizer 적용

    - 여러 optimizer 중 Adam으로 적용해준다.

     

     

    모델 학습

    1. 학습에 사용할 데이터셋 준비

    - 사용한 데이터셋 : MNIST

    - 데이터 셋의 차원을 확인하고 gray scale이라면 차원을 하나 늘려주는 과정이 필요하다

    - rgb라면 따로 차원 추가 작업이 필요하지 않다

     

    import numpy as np
    np.expand_dims(train_x,-1).shape  #차원 추가하는 방법

     

    2. Rescaling

    - 리스케일링 작업을 하면 학습이 너무 튀지 않고 골고루 잘됨

    - 데이터의 최소값과 최대값을 확인하면 최소값이 0, 최대값이 255다.

    - 값이 0~1사이가 되게하기 위해 test 데이터와 train 데이터 모두 255로 나눠준다. 

     

    3. 학습용 하이퍼 파라미터 설정

    - num_epochs : 전체 데이터를 한번 쭉 보는 게 epoch. 
    - batch_size : 한 에폭을 가기 위해 batch_size만큼 데이터가 들어감

     

    4. model.fit으로 학습진행

    - shuffle : train할때는 shuffle을 해줘야 한다. shuffle을 하지 않으면 overfitting 발생 확률이 높아진다.

     

    model.fit(train_x,train_y,batch_size=batch_size, shuffle=True, epochs=num_epochs)

     

    모델을 훈련하는 다른 방법

    www.tensorflow.org/tutorials/quickstart/advanced?hl=ko

     

    텐서플로 2.0 시작하기: 전문가용  |  TensorFlow Core

    Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의 내용과 일치하지 않을 수

    www.tensorflow.org

    tensorflow 공식문서에 나오는 방식으로 모델을 만들고 훈련하고 테스트해보자.

     

    1. 데이터셋 만들기

    - tf.data를 활용해서 데이터 셋을 만들고 섞고 배치를 만든다.

    train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train))  #튜플로 담음
    train_ds = train_ds.shuffle(1000)  #버퍼 사이즈, 1000정도가 적당한 값
    train_ds = train_ds.batch(32) #iteration할때마다 batch size만큼의 데이터가 나옴
    
    test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)) #테스트용 데이터
    test_ds = test_ds.batch(32) #test할때는 shuffle 굳이 할 필요 없음

     

    2. Training

    - 훈련하기 전에 loss function과 optimizer를 설정해준다.

    - 훈련을 위와 다르게 compile을 사용하지 않고 직접 loss를 계산해서 구현한다

    - tf.GradientTape을 사용해 모델을 훈련한다.

    - 훈련하기 전에 설정한 loss function을 사용해 loss를 계산한다.

     

    @tf.function
    def train_step(images, labels):
      with tf.GradientTape() as tape:
        predictions = model(images) #이미지를 받아서 모델에 넣으면 예측 진행
        loss = loss_object(labels, predictions) #loss 계산
        
        #loss를 통해 기울기를 얻어서 optimizer에 적용 시킬 것임
      gradients = tape.gradient(loss, model.trainable_variables) 
      optimizer.apply_gradients(zip(gradients, model.trainable_variables)) #받은 기울기를 Adam에 적용
    
      train_loss(loss) #loss의 평균값을 내는 함수
      train_accuracy(labels, predictions) #accuracy 계산하는 함수

     

    3. 모델 테스트

     

    @tf.function
    def test_step(images, labels):
        predictions=model(images)
        t_loss=loss_object(labels, predictions)
        
        test_loss(t_loss)
        test_accuracy(labels,predictions)

     

     

    모델 평가하기

    1. 학습을 진행한 모델에 evaluate 함수를 사용해서 loss와 accuracy를 확인할 수 있다.

     

    model.evaluate(test_x, test_y, batch_size=batch_size)

     

    2. 모델에 test 데이터를 넣고 predict 함수를 사용해서 결과를 확인한다.

    - 모델이 evaluation 모드로 전환되고 이 문제에 대한 결과만 출력됨

     

    pred = model.predict(test_image.reshape(1,28,28,1)) 

     

    3. 결과 값 중 pred 값이 가장 높은 것이 정답이다.

    - 마지막에 가장 높은 값을 얻은 노드가 정답
    - 그래서 pred값 중 가장 높은 값을 찾으면 그게 정답

    - 아래 코드를 입력하면 가장 높은 값의 인덱스가 나오고 해당 인덱스의 값이 모델이 정답이라고 생각하는 값이다.

     

    np.argmax(pred)

     

    반응형