arrow_back

TensorFlow를 사용한 컴퓨터 비전 소개

로그인 가입
지식을 테스트하고 커뮤니티와 공유하기
done
700개 이상의 실무형 실습, 기술 배지, 과정에 액세스

TensorFlow를 사용한 컴퓨터 비전 소개

실습 1시간 universal_currency_alt 크레딧 5개 show_chart 중급
info 이 실습에는 학습을 지원하는 AI 도구가 통합되어 있을 수 있습니다.
지식을 테스트하고 커뮤니티와 공유하기
done
700개 이상의 실무형 실습, 기술 배지, 과정에 액세스

GSP631

Google Cloud 사용자 주도형 실습

개요

Google에서 개발한 TensorFlow는 이식성을 갖춘 강력한 오픈소스 머신러닝(ML) 라이브러리로, 방대한 규모의 데이터 세트를 처리할 수 있습니다. 이 실습에서는 TensorFlow Vertex AI Workbench를 사용해 다양한 의류 항목을 인식할 수 있는 컴퓨터 비전 모델을 만들고 학습시켜 봅니다.

TensorFlow 소개

TensorFlow는 ML 모델 빌드에 필요한 컴퓨팅 프레임워크를 제공합니다. 또한 원하는 추상화 수준으로 모델을 구축하는 데 사용할 수 있는 여러 툴킷을 제공합니다. 이 실습에서는 TensorFlow에서 고수준 API인 tf.keras를 사용하여 이미지를 분류하는 신경망을 빌드하고 학습시켜 봅니다.

신경망

신경망이란 인간의 뇌에서 아이디어를 얻어 만들어진 모델입니다. 신경망은 하나 이상의 히든 레이어를 포함해 여러 레이어로 구성되어 있으며, 레이어는 비선형성의 단순한 단위 또는 뉴런이 연결되어 구성됩니다.

신경망 내의 노드는 보통 여러 입력값을 취하여 하나의 출력값을 생성합니다. 뉴런은 가중치가 적용된 입력값의 합계에 활성화 함수를 적용(비선형 변환)하여 출력값을 산출합니다.

신경망에 대한 자세한 내용은 신경망: 구조를 참조하세요.

목표

이 실습에서는 다음 작업을 수행하는 방법을 배웁니다.

  • TensorFlow 모델을 설계, 컴파일, 학습, 평가하기
  • 모델을 저장하고 로드하기
  • 자체 콜백을 작성하여 학습 중 동작을 맞춤설정하기
  • 안내에 따라 네트워크의 다양한 레이어로 실험하는 방법에 관한 일련의 연습을 완료하기

설정 및 요건

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머에는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지 표시됩니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 직접 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간---실습을 시작하고 나면 일시중지할 수 없습니다.
참고: 계정에 추가 요금이 발생하지 않도록 하려면 개인용 Google Cloud 계정이나 프로젝트가 이미 있어도 이 실습에서는 사용하지 마세요.

작업 1. Vertex AI Workbench에서 노트북 열기

  1. Google Cloud 콘솔의 탐색 메뉴에서 Vertex AI > Workbench를 클릭합니다.

  2. 인스턴스를 찾아 JupyterLab 열기 버튼을 클릭합니다.

Workbench 인스턴스의 JupyterLab 인터페이스가 새 브라우저 탭에서 열립니다.

TensorFlow 및 추가 패키지 설치

  1. 런처 메뉴의 Other(기타)에서 Terminal(터미널)을 선택합니다.

  2. Python 환경이 이미 구성되어 있는지 확인합니다. 아래 명령어를 복사하여 터미널에 붙여넣습니다.

python --version

출력 예시:

Python 3.10.14
  1. 아래 명령어를 실행하여 TensorFlow 패키지를 설치합니다.
pip3 install tensorflow
  1. pip3을 업그레이드하려면 터미널에서 아래 명령어를 실행합니다.
pip3 install --upgrade pip

Pylint는 Python 코드의 오류를 확인하고 Python 소스 코드의 문법 및 스타일 문제를 강조 표시해 주는 도구입니다.

  1. 아래 명령어를 실행하여 pylint 패키지를 설치합니다.
pip install -U pylint --user
  1. 실습에 필요한 패키지를 requirements.txt 파일에 설치합니다.
pip install -r requirements.txt

이제 환경 설정이 완료되었습니다.

작업 2. 새 노트북을 만들고 라이브러리 가져오기

  1. Workbench 왼쪽에 있는 + 아이콘을 클릭하여 새 런처를 엽니다.

  2. 런처 메뉴의 Notebook(노트북)에서 Python3를 선택합니다.

새 노트북 파일

새 Jupyter 노트북이 표시됩니다. Jupyter 노트북을 사용하는 방법에 대한 자세한 내용은 Jupyter 노트북 문서를 참조하세요.

  1. Cloud Logging에 필요한 logginggoogle-cloud-logging을 가져오고 구성합니다. 첫 번째 셀에 아래 코드를 추가합니다.
# Import and configure logging import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging cloud_logger = logging.getLogger('cloudLogger') cloud_logger.setLevel(logging.INFO) cloud_logger.addHandler(CloudLoggingHandler(cloud_logging.Client())) cloud_logger.addHandler(logging.StreamHandler())
  1. 모델의 학습과 평가를 위한 tensorflow를 가져옵니다. 사용 편의성을 위해 tf라고 부릅니다. 첫 번째 셀에 아래 코드를 추가합니다.
# Import TensorFlow import tensorflow as tf
  1. 디버깅 목적으로 데이터를 파싱하기 위해 Numpy를 가져옵니다. 사용 편의성을 위해 np라고 부릅니다. 첫 번째 셀에 아래 코드를 추가합니다.
# Import numpy import numpy as np
  1. 데이터 세트를 통합할 수 있도록 아래 코드를 첫 번째 셀에 추가하여 tensorflow_datasets를 가져옵니다. TensorFlow DatasetsTensorFlow에서 즉시 사용 가능한 데이터 세트 모음입니다.
사용 방법을 자세히 알아보려면 가이드데이터 세트 목록을 참조하세요. # Import tensorflow_datasets import tensorflow_datasets as tfds
  1. 셀을 실행하기 위해 Run(실행) 버튼을 클릭하거나 Shift + Enter 키를 누릅니다.

  2. 노트북을 저장합니다. File(파일) > Save(저장)을 클릭합니다. 파일 이름을 model.ipynb로 지정하고 확인을 클릭합니다.

작업 3. 데이터 세트를 로드하고 전처리하기

데이터 세트 정보

Fashion MNIST라는 데이터 세트의 의류 이미지를 분류하도록 신경망을 학습시켜 보겠습니다.

이 데이터 세트는 10가지 의류 유형에 속하는 70,000개의 의류 항목으로 구성되어 있습니다. 각 의류 항목은 아래 이미지처럼 저해상도(28x28픽셀)로 표시됩니다.

2c4b51c68ec17b3b.png

이 실습에서는 60,000개의 이미지를 사용하여 네트워크를 학습시키고, 10,000개의 이미지를 사용하여 네트워크가 이미지를 분류하는 방법을 얼마나 정확하게 학습했는지 평가합니다.

Fashion MNIST 데이터는 tensorflow datasets(tfds)에서 제공됩니다.

데이터 세트 로드

Fashion MNIST 데이터를 로드하려면 tfds.load() 함수를 사용해야 합니다.

  1. 노트북에서 두 번째 셀에 아래 코드를 추가합니다.
# Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True)

위 코드에서 split 인수를 설정해 데이터 세트의 어떤 분할을 로드할지 지정합니다. as_supervisedTrue로 설정하여 로드된 tf.data.Dataset가 2 튜플 구조 (input, label)이 되도록 합니다.

ds_trainds_testtf.data.Dataset 유형입니다. ds_train에는 모델 학습에 사용될 60,000개의 이미지가 있습니다. ds_test에는 모델 평가에 사용될 10,000개의 이미지가 있습니다.

tfds.load() 및 그 인수에 대해 자세히 알아보려면 가이드를 참조하세요.

이러한 값은 어떤 형태일까요?

  1. 다음으로, print 문을 추가해 항목 0에 대한 학습 이미지의 최솟값 및 최댓값을 확인합니다. 두 번째 셀에 아래 코드를 추가합니다.
# Values before normalization image_batch, labels_batch = next(iter(ds_train)) print("Before normalization ->", np.min(image_batch[0]), np.max(image_batch[0]))

데이터 전처리

  1. 배치 크기는 머신러닝에서 사용되는 용어로, 반복 1회에 활용되는 학습 예의 수를 말합니다. 배치 크기 값을 32로 설정합니다.

아래 코드를 model.ipynb에 추가하여 배치 크기를 지정합니다.

# Define batch size BATCH_SIZE = 32
  1. 신경망을 학습시킬 때는 픽셀 값을 0~1 범위로 조정하는 것이 여러 가지 이유로 더 쉽습니다. 이 과정을 '정규화'라고 합니다. FashionMNIST 데이터 세트의 픽셀 값이 [0, 255] 범위에 있으므로, 이미지를 정규화하려면 픽셀 값을 255.0으로 나누어야 합니다.

아래 주어진 코드는 tf.data.Datasetmap() 함수를 사용해 ds_trainds_test의 이미지에 정규화를 적용합니다. 픽셀 값이 tf.uint8 유형이므로 tf.cast 함수를 사용하여 tf.float32로 변환한 다음 255.0으로 나눕니다. BATCH_SIZE를 인수로 하는 batch() 메서드를 호출하여 데이터 세트도 여러 배치로 변환합니다.

tf.data.Dataset에 대해 사용할 수 있는 모든 메서드를 자세히 알아보려면 여기를 참조하세요.

파일 끝에 아래 코드를 추가합니다.

# Normalize and batch process the dataset ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE)
  1. 학습 데이터 세트에 있는 이미지의 최솟값 및 최댓값을 다시 출력합니다.

파일 끝에 아래 코드를 추가합니다.

# Examine the min and max values of the batch after normalization image_batch, labels_batch = next(iter(ds_train)) print("After normalization ->", np.min(image_batch[0]), np.max(image_batch[0]))

작업 4. 모델을 설계하고, 컴파일하고, 학습시키기

이 섹션에서는 TensorFlow를 사용해 모델을 설계합니다.

  1. 아래 코드를 파일에 추가합니다.
# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])

모델 아키텍처에 사용되는 여러 유형의 레이어와 파라미터를 살펴보겠습니다.

  • Sequential: 신경망에 있는 레이어의 순서를 정의합니다.

  • Flatten: 현재 이미지가 (28, 28) 모양이므로 값은 정방 행렬 형태입니다. Flatten 레이어는 이 정방 행렬을 1차원 벡터로 변환합니다.

  • Dense: 뉴런 레이어를 추가합니다.

각 뉴런 레이어에는 뉴런의 활성화 여부를 결정하는 활성화 함수가 필요합니다. 수많은 옵션이 있지만, 이 실습에서는 다음과 같은 옵션을 사용합니다.

  • ReLU는 X>0이면 X를 반환하고, 그 외의 경우 0을 반환한다는 의미의 함수입니다. 이 함수는 0 이상의 값을 네트워크의 다음 레이어로 전달합니다.
  • Softmax는 여러 값을 취하여 그중 가장 큰 값을 고르기 때문에 가장 큰 값을 찾기 위해 값을 정렬할 필요가 없습니다. 예를 들어, 마지막 레이어의 출력이 [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05]였다면 이 함수는 [0,0,0,0,1,0,0,0,0]을 반환합니다.

모델을 컴파일하고 학습시키기

이 섹션에서는 먼저 옵티마이저와 손실 함수를 사용해 모델을 컴파일합니다. 그런 다음 모델에 학습 데이터와 라벨을 학습시킵니다.

목표는 모델이 학습 데이터와 그 라벨의 관계를 알아내는 것입니다. 학습이 완료되면 모델이 학습 데이터와 유사한 새로운 의류 이미지를 보고 어떤 유형에 속하는 의류인지 예측할 수 있어야 합니다.

옵티마이저는 tf.keras 모델을 컴파일하는 데 필요한 두 개의 인수 중 하나입니다. Optimizer는 가중치와 학습률 같은 신경망의 속성을 수정하는 알고리즘입니다. 이 알고리즘을 통해 손실을 줄이고 정확성을 높일 수 있습니다.

tf.keras에서 사용할 수 있는 다양한 유형의 옵티마이저에 대해 자세히 알아보려면 여기를 참조하세요.

Loss는 모델의 성능을 숫자로 나타내는 함수입니다. 손실값이 작을수록 모델의 성능이 좋고, 값이 클수록 성능이 좋지 않다는 뜻입니다.

tf.keras에서 사용할 수 있는 다양한 유형의 손실 함수에 대해 자세히 알아보려면 여기를 참조하세요.

metrics= 파라미터에 주목하세요. 이 파라미터를 통해 TensorFlow는 예측된 결과를 알려진 답변(라벨)과 대조하여 세대가 한 번 끝날 때마다 학습의 정확성을 보고할 수 있습니다. 학습이 얼마나 효율적으로 진행되고 있는지 보고하는 파라미터라고 할 수 있습니다.

'tf.keras'에서 사용할 수 있는 다양한 유형의 측정항목을 자세히 알아보려면 여기를 클릭하세요.

Model.fit는 정해진 세대 수만큼 모델을 학습시킵니다.

  1. 아래 코드를 파일에 추가합니다.
# Compile the model model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5)

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 머신러닝 모델 만들기

코드 실행

  1. Run(실행) 버튼을 클릭하거나 Shift + Enter 키를 눌러 두 번째 셀을 실행합니다.

노트북 셀이 실행되면 학습의 각 세대(또는 전달)가 끝날 때마다 보고되는 손실과 정확성을 확인할 수 있습니다. 각 세대(또는 전달)가 끝날 때마다 정확성이 높아지는 점에 주목하세요.

출력 예시(실제 값은 약간 다를 수 있으며, 경고 메시지는 모두 무시하세요):

Before normalization -> 0 227 After normalization -> 0.0 1.0 Epoch 1/5 1875/1875 [==============================] - 12s 6ms/step - loss: 0.5264 - sparse_categorical_accuracy: 0.8175 Epoch 2/5 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3977 - sparse_categorical_accuracy: 0.8580 Epoch 3/5 1875/1875 [==============================] - 5s 3ms/step - loss: 0.3585 - sparse_categorical_accuracy: 0.8701 Epoch 4/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3329 - sparse_categorical_accuracy: 0.8784 Epoch 5/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3151 - sparse_categorical_accuracy: 0.8846

# Values before normalization 출력에서 최솟값 및 최댓값이 [0, 255] 범위 안에 있는 것을 확인할 수 있습니다. 정규화가 끝난 후에는 모든 값이 [0, 1] 범위에 속합니다.

학습이 진행됨에 따라 손실은 줄어들고 정확성은 높아집니다.

모델이 학습을 완료하면 마지막 세대가 끝난 후 정확성 값을 확인할 수 있습니다. 위의 결과처럼 0.8846에 가까운 값이 나오게 됩니다(실제 정확성은 다를 수 있습니다).

이는 신경망이 약 89%의 정확도로 학습 데이터를 분류할 수 있다는 뜻입니다. 다시 말해, 이미지와 라벨 간의 패턴 일치를 찾아내는 데 89%의 성공률을 보인다는 것입니다. 아주 뛰어난 결과는 아니지만, 소규모 신경망에서 단 5세대 학습되었다는 점을 고려하면 그렇게 나쁜 결과는 아닙니다.

작업 5. 학습에 사용하지 않은 데이터에 대해 모델 성능을 평가하기

그렇다면 학습하지 않은 데이터에 대한 모델의 성능은 어떨까요?

테스트 세트를 통해 이 질문에 대한 답을 얻을 수 있습니다. model.evaluate를 호출하여 두 개의 세트를 전달하면 모델이 각 세트에 대한 손실 값을 보고합니다.

테스트 세트 평가:

  1. 노트북에서 세 번째 셀에 아래 코드를 추가합니다.
cloud_logger.info(model.evaluate(ds_test))
  1. Run(실행) 버튼을 클릭하거나 Shift + Enter 키를 눌러 셀을 실행합니다.

출력을 아래로 스크롤하면 마지막 줄에서 평가의 결과를 확인할 수 있습니다.

Before normalization -> 0 227 After normalization -> 0.0 1.0 Epoch 1/5 1875/1875 [==============================] - 12s 6ms/step - loss: 0.5264 - sparse_categorical_accuracy: 0.8175 Epoch 2/5 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3977 - sparse_categorical_accuracy: 0.8580 Epoch 3/5 1875/1875 [==============================] - 5s 3ms/step - loss: 0.3585 - sparse_categorical_accuracy: 0.8701 Epoch 4/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3329 - sparse_categorical_accuracy: 0.8784 Epoch 5/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3151 - sparse_categorical_accuracy: 0.8846 313/313 [==============================] - 1s 4ms/step - loss: 0.3653 - sparse_categorical_accuracy: 0.8708 INFO:cloudLogger:[0.36530008912086487, 0.8708000183105469]

모델이 테스트 세트(ds_test)에 대해 보고한 정확성은 0.8708로, 이는 정확도가 87% 정도라는 뜻입니다. (실제 값은 약간 다를 수 있음)

예상대로, 학습하지 않은 데이터에 대한 모델의 정확도는 학습한 데이터를 처리할 때만큼 높지 않습니다.

TensorFlow를 깊이 탐구하다 보면 이 정확도를 개선하는 방법을 배울 수 있습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 모델 사용

작업 6. 모델을 저장하고 로드하기

모델 진행 상황은 학습 중이나 학습 후에도 저장이 가능합니다. 즉, 모델이 중단한 부분에서 학습을 이어 나가고 학습 시간이 길어지는 것을 피할 수 있습니다. 또한 저장이 가능하므로 모델을 공유하고 다른 사람이 모델을 변형할 수 있습니다. 이 첫 번째 연습에서 모델을 저장하고 로드하는 데 필요한 코드를 추가해 봅니다.

모델 전체를 저장할 수 있는 파일 형식으로는 2가지가 있습니다(SavedModelKeras). TensorFlow SavedModel 형식은 TF2.x의 기본 파일 형식입니다. 하지만 Keras 형식으로 저장할 수도 있습니다. 2가지 파일 형식으로 모델을 저장하는 방법을 자세히 알아보겠습니다.
  1. 노트북에서 네 번째 셀에 아래 코드를 추가합니다.
# Save the entire model as a SavedModel. model.save('saved_model') # Reload a fresh Keras model from the saved model new_model = tf.keras.models.load_model('saved_model') # Summary of loaded SavedModel new_model.summary() # Save the entire model to a keras file. model.save('my_model.keras') # Recreate the exact same model, including its weights and the optimizer new_model_keras = tf.keras.models.load_model('my_model.keras') # Summary of loaded keras model new_model_keras.summary()

위 코드는 모델을 2가지 다른 형식으로 저장하고, 저장된 모델을 다시 로드하는 방법을 보여줍니다. 사용 사례에 따라 원하는 형식을 선택하면 됩니다. TensorFlow 문서의 '모델 저장 및 로드'에서 이 기능에 대해 자세히 살펴보세요.

  1. Run(실행) 버튼을 클릭하거나 Shift + Enter 키를 눌러 셀을 실행합니다.

출력 마지막 부분에서 두 세트의 모델 요약을 확인할 수 있습니다. 첫 번째 세트는 모델이 SavedModel 형식으로 저장된 후의 요약을 보여줍니다. 두 번째 세트는 모델이 h5 형식으로 저장된 후의 요약을 보여줍니다.

두 가지 모델 요약이 동일한 것을 확인할 수 있는데, 이는 실제로 동일한 모델을 두 가지 형식으로 저장했기 때문입니다.

Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 dense (Dense) (None, 64) 50240 dense_1 (Dense) (None, 10) 650 ================================================================= Total params: 50,890 Trainable params: 50,890 Non-trainable params: 0 _________________________________________________________________ Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 dense (Dense) (None, 64) 50240 dense_1 (Dense) (None, 10) 650 ================================================================= Total params: 50,890 Trainable params: 50,890 Non-trainable params: 0 _________________________________________________________________

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 모델을 저장하고 로드하기

작업 7. 콜백 살펴보기

앞서 모델을 학습시키는 과정에서 학습이 진행됨에 따라 모델의 손실이 줄어들고 정확성이 높아짐을 확인할 수 있었습니다. 원하는 수준의 학습 정확성과 손실을 달성한 이후에도, 학습이 완료되기까지 어느 정도 기다려야 할 수도 있습니다.

"모델이 원하는 정확도에 도달했을 때 학습을 멈출 수 있다면 좋지 않을까?"라고 생각했을 수도 있습니다.

예를 들어 95% 정도의 정확도가 필요하고 모델이 3세대의 학습으로 이를 달성했다면 남아 있는 세대가 끝날 때까지 기다려야 할 필요가 있을까요?

이때 사용할 수 있는 도구가 바로 콜백입니다.

콜백은 학습이나 평가, 추론 중에 Keras 모델의 동작을 맞춤설정할 수 있는 강력한 도구입니다. 모델이 학습 세트에 대해 원하는 수준의 정확성에 도달하면 학습을 멈추도록 콜백을 정의할 수 있습니다.

아래 코드를 사용해 84%의 정확성에 도달했을 때 학습을 멈추도록 하는 콜백을 설정하면 어떻게 되는지 알아보겠습니다.

  1. 런처를 열고 Python3를 선택하여 새 Jupyter 노트북을 만듭니다.

  2. 파일을 callback_model.ipynb라는 이름으로 저장합니다.

  3. 아래 코드를 복사하여 callback_model.ipynb의 첫 번째 셀에 붙여넣습니다.

# Import and configure logging import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging exp_logger = logging.getLogger('expLogger') exp_logger.setLevel(logging.INFO) exp_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="callback")) # Import tensorflow_datasets import tensorflow_datasets as tfds # Import numpy import numpy as np # Import TensorFlow import tensorflow as tf # Define Callback class myCallback(tf.keras.callbacks.Callback): def on_epoch_end(self, epoch, logs={}): if(logs.get('sparse_categorical_accuracy')>0.84): exp_logger.info("\nReached 84% accuracy so cancelling training!") self.model.stop_training = True callbacks = myCallback() # Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # Define batch size BATCH_SIZE = 32 # Normalizing and batch processing of data ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) # Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # Compile data model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5, callbacks=[callbacks])
  1. Ctrl + S 키를 누르거나 File(파일) > Save Notebook(노트북 저장)으로 이동하여 변경사항을 저장합니다.

  2. Run(실행) 버튼을 클릭하거나 Shift + Enter 키를 눌러 코드를 실행합니다.

몇 세대 후 학습이 취소되었는지 확인해 보세요.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 콜백 살펴보기

작업 8. 모델을 사용해 실험하기

이 섹션에서는 네트워크의 다양한 레이어를 사용하는 실험을 진행해 봅니다.

연습 1

이 연습에서는 모델의 레이어를 살펴봅니다. 뉴런의 수를 변경하면 어떻게 될까요?

  1. 런처를 열고 Python3를 선택하여 새 Jupyter 노트북을 만듭니다.

  2. 파일을 updated_model.ipynb라는 이름으로 저장합니다.

  3. 아래 코드를 복사하여 updated_model.ipynb의 첫 번째 셀에 붙여넣습니다.

# Import and configure logging import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging up_logger = logging.getLogger('upLogger') up_logger.setLevel(logging.INFO) up_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="updated")) # Import tensorflow_datasets import tensorflow_datasets as tfds # Import numpy import numpy as np # Import TensorFlow import tensorflow as tf # Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # Define batch size BATCH_SIZE = 32 # Normalizing and batch processing of data ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) # Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # Compile data model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5) # Logs model summary model.summary(print_fn=up_logger.info)
  1. 밀집 레이어에 여러 값을 적용하여 실험해 봅니다.

# Define the model 섹션에서 뉴런 수를 64에서 128로 바꿉니다.

# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. Ctrl + S 키를 누르거나 File(파일) > Save Notebook(노트북 저장)으로 이동하여 변경사항을 저장합니다.

  2. Run(실행) 버튼을 클릭하거나 Shift + Enter 키를 눌러 코드를 실행합니다.

손실, 학습 시간 등의 결과가 어떻게 달라졌나요? 달라진 이유가 뭐라고 생각하시나요?

뉴런 수가 128로 늘어나면 계산을 더 많이 해야 합니다. 이에 따라 학습 프로세스의 속도가 저하됩니다. 이 경우 뉴런 수를 늘림으로써 모델이 더 정확해졌기 때문에 긍정적인 영향을 미쳤다고 평가할 수 있습니다. 하지만 '다다익선'이 항상 좋은 것은 아닙니다. 머지않아 수확 체감의 법칙을 체감할 수 있기 때문입니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 연습 1

연습 2

네트워크에 레이어를 추가하면 어떻게 될지 생각해 보세요. 두 개의 밀집 레이어 사이에 또 다른 레이어를 추가하면 어떻게 될까요?

  1. updated_model.ipynb에서 # Define the model 섹션에 레이어를 추가합니다.

모델 정의를 아래 코드로 대체합니다.

# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. Ctrl + S 키를 누르거나 File(파일) > Save Notebook(노트북 저장)으로 이동하여 변경사항을 저장합니다.

  2. Run(실행) 버튼을 클릭하거나 Shift + Enter 키를 눌러 코드를 실행합니다.

결과: 상대적으로 단순한 데이터를 사용하고 있기 때문에 그다지 큰 영향을 받지 않습니다. 데이터가 훨씬 더 복잡하다면 추가 레이어가 필요한 경우가 많습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 연습 2

연습 3

모델을 학습시키기 전에 먼저 픽셀 값을 [0, 1] 범위로 정규화했습니다. 만약 정규화 없이 원래 데이터 세트에서처럼 픽셀 값의 범위가 [0, 255]였다면 어땠을까요?

  1. 직접 해 보겠습니다. # Define, load and configure data에서 학습 데이터 세트와 테스트 데이터 세트에 적용되어 있던 매핑 함수를 삭제합니다.
# Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # Define batch size BATCH_SIZE = 32 # Normalizing and batch processing of data ds_train = ds_train.batch(BATCH_SIZE) ds_test = ds_test.batch(BATCH_SIZE) # Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 이 코드를 셀의 마지막 부분에 추가하여 배치 0에 대한 첫 번째 이미지의 최댓값을 출력하도록 합니다. 정규화하지 않으면 최댓값이 [0, 255] 범위에 속하게 됩니다.
# Print out max value to see the changes image_batch, labels_batch = next(iter(ds_train)) t_image_batch, t_labels_batch = next(iter(ds_test)) up_logger.info("training images max " + str(np.max(image_batch[0]))) up_logger.info("test images max " + str(np.max(t_image_batch[0])))
  1. updated_model.ipynb 파일의 최종 결과는 다음과 같습니다.
# Import and configure logging import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging up_logger = logging.getLogger('upLogger') up_logger.setLevel(logging.INFO) up_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="updated")) # Import tensorflow_datasets import tensorflow_datasets as tfds # Import numpy import numpy as np # Import TensorFlow import tensorflow as tf # Define, load and configure data (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # Define batch size BATCH_SIZE = 32 # Normalizing and batch processing of data ds_train = ds_train.batch(BATCH_SIZE) ds_test = ds_test.batch(BATCH_SIZE) # Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # Compile data model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5) # Logs model summary model.summary(print_fn=up_logger.info) # Print out max value to see the changes image_batch, labels_batch = next(iter(ds_train)) t_image_batch, t_labels_batch = next(iter(ds_test)) up_logger.info("training images max " + str(np.max(image_batch[0]))) up_logger.info("test images max " + str(np.max(t_image_batch[0])))
  1. Ctrl + S 키를 누르거나 File(파일) > Save Notebook(노트북 저장)으로 이동하여 변경사항을 저장합니다.

  2. Run(실행) 버튼을 클릭하거나 Shift + Enter 키를 눌러 코드를 실행합니다.

# Print out max value to see the changes의 예상 출력

INFO:upLogger:training images max 255 INFO:upLogger:test images max 255

세대가 끝나면 정규화하지 않은 경우 정확성에 어떤 차이가 생기는지 확인할 수 있습니다.

정확성에 변화가 생긴 이유는 뭘까요?

Stack Overflow에서 훌륭한 답변을 살펴보실 수 있습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 연습 3

연습 4

Flatten() 레이어를 삭제하면 어떻게 달라질까요? 그리고 그 이유는 무엇일까요?

직접 해 보겠습니다.

  1. # Define the model 섹션에서 tf.keras.layers.Flatten() 레이어를 삭제합니다.
# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 저장하고 updated_model.ipynb에서 셀을 실행합니다.

데이터의 형태에 대한 오류가 표시됩니다. 이는 정상적인 동작입니다.

오류의 세부적인 내용이 지금은 모호해 보일 수 있지만, 이를 통해 네트워크의 첫 번째 레이어가 데이터와 동일한 형태여야 한다는 경험에 따른 원칙을 다시금 확인할 수 있습니다. 지금은 입력 이미지가 28x28 형태이고, 레이어 28개에 뉴런 28개가 있는 구조는 불가능합니다. 따라서 이 28, 28 값을 784x1로 바꾸는 것이 타당해 보입니다.

모든 코드를 직접 작성하는 대신, 앞부분에 Flatten() 레이어를 추가하세요. 나중에 모델에 배열이 로드되면 자동으로 평면화됩니다.

연습 5

최종(출력) 레이어에 주목하세요. 최종 레이어에 뉴런이 10개인 이유는 무엇일까요? 10이 아닌 다른 숫자라면 어떻게 될까요?

5로 네트워크를 학습시켜 직접 알아보겠습니다.

  1. # Define the model 섹션을 아래 코드로 대체하여 이전 섹션에서 적용한 변경사항을 되돌립니다.
# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 마지막 레이어의 뉴런 수를 10에서 5로 변경합니다.
# Define the model model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(5, activation=tf.nn.softmax)])
  1. 저장하고 updated_model.ipynb에서 셀을 실행합니다.

결과: 예상치 못한 값이 발견된 즉시 오류가 표시됩니다.

여기에서 또 다른 경험에 따른 원칙을 알 수 있습니다. 즉, 마지막 레이어의 뉴런 수는 분류하려는 클래스 수와 일치해야 합니다. 이 경우 0에서 9까지 숫자가 총 10개이므로 최종 레이어에 뉴런이 10개여야 합니다.

수고하셨습니다

수고하셨습니다. 이 실습에서는 TensorFlow 모델을 설계하고, 컴파일하고, 학습시키고, 평가하는 방법을 배웠습니다. 모델을 저장 및 로드하고, 자체 콜백을 작성하여 학습 중 동작을 맞춤설정하는 방법도 알아보았습니다. 안내에 따라 네트워크의 다양한 레이어를 실험하는 일련의 연습도 완료해 보았습니다.

다음 단계/더 학습하기

Google Cloud 교육 및 자격증

Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.

설명서 최종 업데이트: 2024년 9월 12일

실습 최종 테스트: 2024년 9월 12일

Copyright 2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.

현재 이 콘텐츠를 이용할 수 없습니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

감사합니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.