TensorFlow를 사용하면 이미지를 NumPy 배열로 변환한 후 배치 차원(batch dimension)을 추가하여 모델에 손쉽게 전달할 수 있습니다.
핵심 개념 이해하기
합성곱 계층(convolutional layer)이 하나 이상 포함된 신경망을 합성곱 신경망(CNN, Convolutional Neural Network)이라고 하며, 이를 활용해 학습 모델을 구축할 수 있습니다.
이 글의 코드는 Google Colaboratory(이하 Colab) 환경에서 실행됩니다. Colab은 브라우저에서 바로 Python 코드를 실행할 수 있도록 지원하며, 별도의 설정 없이 GPU(그래픽 처리 장치)를 무료로 사용할 수 있다는 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 만들어졌습니다.
전이 학습(Transfer Learning)의 직관
이미지 분류에서 전이 학습의 핵심 아이디어는 다음과 같습니다. 대규모의 일반적인 데이터셋으로 학습된 모델은 시각적 세계를 위한 범용 모델로 효과적으로 활용될 수 있습니다. 즉, 해당 모델은 이미 특징 맵(feature map)을 학습한 상태이므로, 사용자가 대규모 데이터셋으로 대형 모델을 처음부터 다시 학습시킬 필요가 없습니다.
TensorFlow Hub는 사전 학습된(pre-trained) TensorFlow 모델들을 모아둔 저장소입니다. 이 저장소의 모델을 활용하면 학습 모델을 세밀하게 조정(fine-tuning)할 수 있습니다.
이번 튜토리얼에서는 tf.keras와 함께 TensorFlow Hub의 모델을 사용하는 방법, 그리고 TensorFlow Hub에서 제공하는 이미지 분류 모델을 활용하는 방법을 살펴봅니다. 이후에는 전이 학습을 통해 사용자 정의 이미지 클래스에 맞게 모델을 미세 조정할 수 있습니다. 사전 학습된 분류기 모델에 이미지를 입력하면 해당 이미지가 무엇인지 예측할 수 있으며, 이 과정에는 별도의 학습이 필요하지 않습니다.
예제 코드
grace_hopper = np.array(grace_hopper)/255.0
print("The dimensions of the image are")
print(grace_hopper.shape)
result = classifier.predict(grace_hopper[np.newaxis, ...])
print("The dimensions of the resultant image are")
print(result.shape)
predicted_class = np.argmax(result[0], axis=-1)
print("The predicted class is")
print(predicted_class)코드 출처 − https://www.tensorflow.org/tutorials/images/transfer_learning_with_hub
실행 결과
The dimensions of the image are (224, 224, 3) The dimensions of the resultant image are (1, 1001) The predicted class is 819
코드 설명
- 배치 차원 추가:
np.newaxis를 사용해 이미지 배열의 맨 앞에 배치 차원을 추가합니다. 모델은 기본적으로 여러 개의 샘플로 구성된 배치 형태의 입력을 기대하기 때문에, 단일 이미지라도 배치 차원을 넣어주어야 합니다. 원래 이미지 크기는 (224, 224, 3)이지만, 배치 차원이 추가되면 (1, 224, 224, 3) 형태가 됩니다. - 모델에 이미지 전달: 배치 차원이 추가된 이미지를
classifier.predict()메서드에 전달하여 예측을 수행합니다. - 결과 해석: 출력 결과는 1001개의 요소를 가진 로짓(logits) 벡터입니다. ImageNet 데이터셋은 1001개의 클래스(배경 클래스 포함)로 구성되어 있기 때문입니다.
- 클래스 확률 평가: 이 벡터는 입력 이미지가 각 클래스에 속할 확률을 점수화합니다.
np.argmax()함수를 사용해 가장 높은 점수를 받은 클래스 인덱스(819)를 추출하여 최종 예측 결과를 얻습니다.