TensorFlow는 이미지를 NumPy 배열로 변환하여 예측 결과를 손쉽게 디코딩할 수 있도록 도와주는 강력한 딥러닝 프레임워크입니다. 이 글에서는 사전 학습된 이미지 분류 모델의 예측 결과를 해석하는 과정을 단계별로 살펴보겠습니다.
TensorFlow와 Keras의 관계
합성곱 계층(convolutional layer)을 하나 이상 포함하는 신경망을 합성곱 신경망(CNN, Convolutional Neural Network)이라고 부르며, 이를 활용하면 이미지 인식에 특화된 학습 모델을 효율적으로 구축할 수 있습니다. Keras는 TensorFlow와 함께 사용되는 고수준 API로, 복잡한 신경망 구조를 간결한 코드로 작성할 수 있게 해줍니다.
Google Colaboratory 환경
이 글의 코드는 Google Colaboratory에서 실행됩니다. Google Colab은 브라우저에서 바로 Python 코드를 실행할 수 있는 클라우드 기반 환경으로, 별도의 설정 없이 GPU(그래픽 처리 장치)를 무료로 사용할 수 있다는 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 만들어져 있어 기존 노트북 워크플로우와도 자연스럽게 연동됩니다.
전이 학습(Transfer Learning)의 핵심 개념
이미지 분류에서 전이 학습의 직관적인 아이디어는 다음과 같습니다. 대규모 범용 데이터셋으로 학습된 모델은 시각적 세계를 위한 일반화된 모델로 효과적으로 재활용될 수 있습니다. 이러한 모델은 이미 특징 맵(feature map)을 학습한 상태이므로, 사용자가 대규모 데이터셋으로 처음부터 모델을 학습시킬 필요가 없습니다.
TensorFlow Hub란?
TensorFlow Hub는 사전 학습된(pre-trained) TensorFlow 모델들이 모여 있는 공개 저장소입니다. 이곳에서 제공하는 모델을 불러와 미세 조정(fine-tuning)하면, 적은 데이터와 연산 자원으로도 높은 성능의 모델을 만들 수 있습니다.
이번 튜토리얼에서는 TensorFlow Hub의 모델을 tf.keras와 함께 사용하는 방법과, TensorFlow Hub에서 제공하는 이미지 분류 모델을 활용하는 방법을 다룹니다. 먼저 사전 학습된 분류기 모델에 이미지를 입력해 해당 이미지가 무엇인지 예측하고, 이후에는 전이 학습을 통해 사용자 지정 이미지 클래스에 맞게 모델을 미세 조정할 수 있습니다. 특히 초기 예측 단계는 별도의 학습 과정 없이도 수행할 수 있습니다.
코드 예제
print("Decoding the predictions")
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
plt.imshow(grace_hopper)
plt.axis('off')
predicted_class_name = imagenet_labels[predicted_class]
_ = plt.title("Prediction is: " + predicted_class_name.title())코드 출처 − https://www.tensorflow.org/tutorials/images/transfer_learning_with_hub
실행 결과
Decoding the predictions
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt
16384/10484 [==============================================] - 0s 0us/step

코드 설명
레이블 파일 다운로드:
tf.keras.utils.get_file()함수를 사용해 ImageNet의 1,001개 클래스 이름이 담긴 'ImageNetLabels.txt' 파일을 다운로드합니다.레이블 배열 생성: 파일 내용을 줄 단위로 읽어 NumPy 배열로 변환합니다. 이 배열의 인덱스는 모델이 출력하는 클래스 ID와 일치합니다.
예측 결과 디코딩: 예측된 클래스 ID를 인덱스로 사용해 ImageNet 레이블 배열에서 해당 클래스 이름을 가져오면, 숫자 형태의 예측값을 사람이 이해할 수 있는 텍스트로 변환(디코딩)할 수 있습니다.
시각화:
plt.imshow()로 입력 이미지를 화면에 출력하고, 축 정보를 제거한 뒤 예측된 클래스 이름을 그래프 제목으로 표시합니다.
이처럼 TensorFlow를 활용하면 모델의 원시 예측값을 의미 있는 레이블로 변환하여, 이미지 분류 결과를 직관적으로 확인할 수 있습니다.