SqueezeNet으로 하는 Transfer Learning

  • 이번에는 SqueezeNet으로 Transfer Learning을 해보겠다.
  • 당연히 Jupyter Notebook에서 진행할것인데
  • 이번 글부터는 Local이 아닌 구글의 Colab에서 진행하겠다.

SqueezeNet으로 하는 Transfer Learning

  • Colab에서 Shell 명령어를 실행하기 위해서는 맨 앞에 !를 붙이면 된다.
  • turicreate을 설치한다.
!pip install -U turicreate==5.8
  • 필요한 패키지를 import 한다.
import turicreate as tc
import matplotlib.pyplot as plt
  • Colab의 좌측 바에서 구글 드라이브를 연결할 수 있다.
  • Train에 필요한 데이터를 구글 드라이브에서 Load 해온다.
train_data = tc.image_analysis.load_images("/content/drive/My Drive/snacks/train", with_path=True)
len(train_data)
  • Test에 필요한 데이터를 구글 드라이브에서 Load 해온다.
test_data = tc.image_analysis.load_images("/content/drive/My Drive/snacks/test", with_path=True)
len(test_data)
  • 지난 글에서도 했듯이, 각 데이터에 레이블을 추가한다.
import os
train_data["label"] = train_data["path"].apply(lambda path: os.path.basename(os.path.split(path)[0]))
test_data["label"] = test_data["path"].apply(lambda path: os.path.basename(os.path.split(path)[0]))
  • train data와 squeezenet model을 사용해서 모델을 생성한다.
model = tc.image_classifier.create(train_data, target="label", model="squeezenet_v1.1", verbose=True, max_iterations=100)
  • model을 검증해서 mectrics에 저장하고, 일부는 표시해본다.
metrics = model.evaluate(test_data)
print("Accuracy: ", metrics["accuracy"])
print("Precision: ", metrics["precision"])
print("Recall: ", metrics["recall"])

개별 예상값 얻기

  • 다음과 같이 predict 함수를 사용해서 각각의 예상값을 얻을 수 있다.
model.predict(test_data)
  • 첫 번째 예상값은 test_data[0]에 대한 것이고,
  • 두 번째 예상값은 test_data[1]에 대한 것이다.
  • 차례대로, 예상값을 보여준다.
['apple', 'grape', 'orange', 'orange', 'orange', 'apple', ...]
  • 해당 데이터가 실제로는 어떤 사진인지 확인하기 위해서는 다음과 같이 할 수 있다.
plt.imshow(test_data[1]["image"].pixel_data)
  • 다음과 같이 classify를 사용해 예상값이 얼마나 확실한지를 알아 볼 수도 있다.
output = model.classify(test_data)
output
  • 테스트 데이터에 확실성 값을 하나의 column으로 추가한다.
imgs_with_pred = test_data.add_columns(output)
  • 그리고 확실성이 90%를 넘어가지만, 예상값이 틀린 이미지를 골라낸다.
imgs_filtered = imgs_with_pred[(imgs_with_pred["probability"] > 0.9) & (imgs_with_pred["label"] != imgs_with_pred["class"] )]

관련 글