TensorflowLite로 Keras 모델 압축

이 기사는 DSL Advent Calendar의 6 일째 기사입니다.
연구 테마의 인계가 있으면, Tensorflow Lite의 사용법에 대해 정리합니다.

TensorflowLite란?



TensorFlow Lite는 TensorFlow나 Keras에서 학습한 모델을 모바일·임베디드 단말상에서 움직이기 위해 압축하는 프레임워크입니다.
float32 형식으로 저장된 모델의 가중치를 int8 또는 float16 형식으로 압축 할 수 있습니다.

실시간으로 예측하고 싶은 소형 디바이스의 Stand-alone으로 예측을 하고 싶은 경우에는 꼭 이용해 보세요.

실행 환경



우분투16.04
파이썬 3.7.4
- TensorFlow 1.15.0
- Keras 2.3.1

모델 압축



압축 할 모델은 ImageNet에서 학습 한 InceptionV3을 사용합니다.
일단 InceptionV3 모델을 h5 파일에 저장 한 다음 tflite 파일로 압축합니다.
from keras.applications.inception_v3 import InceptionV3

# InceptionV3モデルをロード
model = InceptionV3(include_top = True, weights = "imagenet")
# モデルの保存
model.save("hoge.h5")

h5 파일에서 tflite 파일 만들기



import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_keras_model_file("hoge.h5")
converter.optimizations = [tf.lite.Optimize.OPTION1]
converter.target_spec.supported_types = [tf.OPTION2]
tflite_model = converter.convert()

with open("model.tflite", "wb") as f:
    f.write(tflite_model)

OPTION1
- DEFAULT : 모델 가중치, 예측시 계산 모두 양자화
- OPTIMIZE_FOR_SIZE : 모델의 가중치를 양자화, 예측시의 계산은 부동 소수점 연산
- OPTIMIZE_FOR_LATENCY : 조사 중 ...

OPTION2
- int8
- float16 etc ...

OPTION1에서는 양자화를 실시하는 부분, OPTION2에서는 양자화의 크기를 설정할 수 있습니다.
Tensorflow 1.14.0 이전 버전에서는 OPTION2를 설정할 수 없으므로주의가 필요합니다.

결과적으로 hoge.h5 파일의 용량은 96.3MB이었지만 int8 파일의 용량은 23.9MB, float16은 47.7MB였습니다.
각각, 1/4, 1/2에 모델 사이즈를 압축할 수 있었습니다!

파이썬 예측



시험에서 option1 = DEFAULT, option2 = int8의 양자화를 한 모델로 고양이의 이미지를 예측해 보겠습니다.

import numpy as np
from keras.applications.inception_v3 import preprocess_input
from keras.preprocessing.image import array_to_img, img_to_array, load_img

# 画像のロード & 正規化
img = img_to_array(load_img("cat.jpeg", target_size=(299, 299)))
input_img = preprocess_input(img)

# TFliteモデルのロード
interpreter = tf.lite.Interpreter(model_path = "hoge.tflite")
interpreter.allocate_tensors()

# モデルの入出力情報の取得
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# 入力画像のshapeを整形
input_data = np.expand_dims(img_input, axis = 0)

# 予測
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])

# 予測結果の出力
print(output_data.argmax(axis = 1))

output
[281]

ImageNet의 라벨 번호! 281번은 tabby cat(부치 고양이, 호랑이 고양이)이므로, 제대로 정답이 되어 있습니다!

또한 예측을 할 때 기본적으로 배치 크기는 1입니다.
모델을 변환 할 때 input_shape를 지정하여 배치 예측을 할 수 있습니다.
converter = tf.lite.TFLiteConverter.from_keras_model_file("hoge.h5", 
                                   input_shapes={'input_1': (10, 299, 299,  3)})

응용 예



공식 사이트에 여러 샘플 코드가 나와 있습니다.
htps //w w. 천식 rfぉw. 오 rg / ぃ 테 / 에어 mpぇ s

모델을 바꾸는 것으로, 간편하게 스스로 작성한 모델을 시험할 수 있습니다.

요약



TensorflowLite의 모델 변환과 Python의 예측 흐름을 요약했습니다.
이번은 하고 있지 않습니다만, 실제로 운용하는 경우는 압축률·각 파라미터마다의 정밀도의 검증등도 비교할 필요가 있습니다.

참고문헌


  • htps : // 네 xt 레메 r . bgs포 t. 이 m / 2019 / 10 / tf20 케라 s 포 st t 라이 닌 g - 쿠 안치 자치 온. HTML
  • htps //w w. 천식 rfぉw. rg/ぃ테
  • htps : // bg. 이민 d. jp/엔트리/2019/08/11/182853
  • 좋은 웹페이지 즐겨찾기