ref : https://www.tensorflow.org/model_optimization

ref : https://www.tensorflow.org/lite/performance/post_training_quantization

1.quantization

1.1 post-train quantization

1.1.1 Dynamic range quantization

  - 용량만 줄이고 실제 동작 할때는 weight 를 다시 floating point 방식으로 변환하여 

  - 속도는 full integer quantization 에 비해 저하됨

1.1.2 full integer quantization

   - model weight , input, activation 등 모두 quantization 작업을 통해 진행됨

   - weight, bias 등은 constant 이기 때문에, 알아서 변한됨

   - input, activation (output of activation layer) 의 경우  일종의 sample dataset 을 넣어주면 모델이 변환하는 과정에서 tensor 를 흘려보내면서 변환시키는 구조

   - 그러므로 tflite 파일에는 모델의 sample input 을 통해 float32→int8 등으로 변환하는 관계식을 포함시킴 
def representative_dataset():
  yield [get_example_input() ]
def get_example_input():

    my_data = np.genfromtxt('Arrhythmia.csv', delimiter=',')
    # my_data = my_data[:,:]
    ratio_konkuk = 500/5000
    my_data = cv2.resize(my_data, None, fx=ratio_konkuk, fy=1, interpolation=cv2.INTER_AREA)
    my_data = preprocessing.minmax_scale(my_data, axis=1)
    my_data = my_data[:, :, np.newaxis]
    my_data = np.array(my_data, dtype=np.float32)
    return my_data

converter = tf.lite.TFLiteConverter.from_keras_model(loaded)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8

2.Weight clustering

:model 의 weight 등을 비슷한 값 끼리 clustering 한형태로 저장함

cons : 정확도 감소

pros : weight 파일 용량 감소

3.Pruning method

: 필요없는 wegiht 또는 layer 등을 제거하는 방법

ref: https://arxiv.org/abs/1710.01878

+ Recent posts