Что такое TF Lite?

Модели TF Lite - это легкие модели, готовые к производству и кроссплатформенная структура для развертывания моделей машинного обучения, которые используются для получения выводов на периферийных устройствах, таких как мобильные телефоны и микроконтроллеры.

Идеальная аудитория

Инженеры машинного обучения, которые ищут способы оптимизации моделей для целей развертывания.

Давайте рассмотрим пример модели, которую вы создали и обучили, и теперь вы хотите сделать вывод о своей модели на периферийных устройствах, таких как смартфоны, raspberry pi и jetson nano.

Чтобы получить хороший прогноз, ваша модель должна соответствовать следующим критериям, например

  • Модель должна быть легковесной, чтобы загружать модель, а периферийные устройства также имеют ограниченный объем памяти.
  • Доступность памяти меньше на периферийных устройствах, чтобы работать действительно хорошо. Энергопотребление также увеличивается в периферийных устройствах, которые работают от батареи, поэтому потребление энергии является большим фактором.
  • Вывод должен иметь низкую задержку, т.е. прогноз должен быть меньше. Если ваша архитектура модели обширна, например VGG16 или YOLO v4, чтобы получить вывод, вам необходимо иметь хорошее высокопроизводительное устройство для прогнозирования.
  • Если ваша модель развернута на сервере, то потребуется много времени, чтобы сделать вывод, а также общее энергопотребление также увеличится.

Поэтому развертывание моделей машинного обучения - большая проблема.

Преимущества в TF Lite

  • Меньшая задержка - время предсказания действительно быстрое.
  • Tensorflow Hub предоставляет отличную коллекцию предварительно обученных моделей, которые мы можем использовать в наших небольших проектах.
  • Это сохраняет конфиденциальность, потому что прогнозы делаются на устройствах, и между вашим устройством и серверами не происходит передачи данных.
  • Он может работать в автономном режиме.

Примеры приложений с использованием TF Lite

Google Translate
Функция AR на Youtube

Давайте создадим собственную нейронную сеть

Установка необходимых модулей

import os
import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from sys import getsizeof
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.losses import SparseCategoricalCrossentropy
print(tf.__version__)
2.4.1

В этой демонстрации мы будем использовать тензорный поток версии 2.4.1.
Если вы используете TF 1.x, то этот код может не подходить, поэтому лучше перейти на TF 2.x.

def get_file_size(file_path):
    size = os.path.getsize(file_path)
    return size
def convert_bytes(size, unit=None):
    if unit == "KB":
        return print('File Size: ' + str(round(size/1024, 3)) + 'Kilobytes')
    elif unit == 'MB':
        return print('File Size: ' + str(round(size/(1024*1024), 3)) + 'Megabytes')
    else:
        return print('File Size: ' + str(size) + 'bytes')

Это две вспомогательные функции, которые определяют размер файла в килобайтах (КБ) и мегабайтах (МБ).

Набор данных

Для этой демонстрации я буду использовать известный набор данных Fashion MNIST.
Этот набор данных содержит 70 000 изображений в оттенках серого в 10 категориях. На изображениях показаны отдельные предметы одежды в низком разрешении (28 на 28 пикселей), как показано здесь:

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_lables) = fashion_mnist.load_data()

Это разные классы для нашей классификации изображений.

class_name = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle Boot']

Давайте проведем исследовательский анализ данных с нашими данными обучения и тестирования.

train_images.shape
(60000, 28, 28)
test_images.shape
(10000, 28, 28)
np.unique(train_labels)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)
plt.figure()
plt.imshow(train_images[19], cmap="gray")
plt.colorbar()
plt.grid(False)
plt.show()

Теперь давайте нормализуем изображение. Значение интенсивности изображения колеблется от 0 до 255. Теперь, если нам нужно построить нейронную сеть, которая быстро сходится, мы должны снизить значение интенсивности с 0 до 1.

Наибольшее значение интенсивности равно 255, поэтому, если мы разделим все значения на 255, диапазон теперь станет от 0 до 1.

train_images = train_images/255.0
test_images = test_images/255.0

Теперь давайте настроим нашу модель для обучения.

Оптимизатор - Адам
Используемая функция потерь - SparseCategoricalCrossentropy
Показатели - Точность

Для получения дополнительной информации посетите:



model.compile(optimizer='adam', loss=SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

Получение сводки модели

model.summary()

Пришло время обучить нашу модель с помощью обучающих изображений и обучающих меток с 10 эпохами.

h = model.fit(train_images, train_labels, epochs=10)

После подбора модели давайте сохраним нашу модель как файл Keras, то есть файл h5.

KERAS_MODEL_NAME='tf_MODEL_FASHION_MNIST.h5'
model.save(KERAS_MODEL_NAME)

Давайте проверим точность и потерю с помощью тестовых изображений

test_loss, test_acc = model.evaluate(test_images, test_lables, verbose=2)
print('Test Accuracy:', test_acc)
print('Test Loss:', test_loss)

Точность теста: 0,8855000138282776
Потеря теста: 0,3289433717727661

Теперь давайте преобразуем файл Keras в модель TF-Lite

TF_LITE_MODEL_FILE_NAME = 'tf_lite_model.tflite'
tf_lite_converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = tf_lite_converter.convert()
tflite_model_name = TF_LITE_MODEL_FILE_NAME
open(tflite_model_name, "wb").write(tflite_model)

Проверка формы входного тензора

interpreter = tf.lite.Interpreter(model_path = TF_LITE_MODEL_FILE_NAME)
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
print("Input Shape:", input_details[0]['shape'])
print("Input Type:", input_details[0]['dtype'])
print("Output Shape:", output_details[0]['shape'])
print("Output Type:", output_details[0]['dtype'])

Это конфигурация модели, которую мы получаем.

Input Shape: [ 1 28 28]
Input Type: <class 'numpy.float32'>
Output Shape: [ 1 10]
Output Type: <class 'numpy.float32'>

Изменение размера тензорной формы в соответствии с нашими потребностями. Мы тестируем 10000 изображений.

interpreter.resize_tensor_input(input_details[0]['index'], (10000, 28, 28))
interpreter.resize_tensor_input(output_details[0]['index'], (10000, 10))
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
print("Input Shape:", input_details[0]['shape'])
print("Input Type:", input_details[0]['dtype'])
print("Output Shape:", output_details[0]['shape'])
print("Output Type:", output_details[0]['dtype'])

Это конфигурация модели, которую мы получаем после изменения размера.

Input Shape: [10000 28 28]
Input Type: <class 'numpy.float32'>
Output Shape: [10000 10]
Output Type: <class 'numpy.float32'>

Давайте проверим тип тестовых изображений.

test_images.dtype
dtype('float64')

Это тип float64.

Есть много способов изменить тип, но мы будем использовать массив numpy, чтобы изменить его.

test_imgs_numpy = np.array(test_images, dtype=np.float32)

Давайте получим прогнозы на основе тестовых изображений.

interpreter.set_tensor(input_details[0]['index'], test_imgs_numpy)
interpreter.invoke()
tflite_model_predictions = interpreter.get_tensor(output_details[0]['index'])
print("Prediction results shape:", tflite_model_predictions.shape)
prediction_classes = np.argmax(tflite_model_predictions, axis=1)
acc = accuracy_score(prediction_classes, test_lables)
print('Test accuracy TFLITE model :', acc)

Точность теста Модель TFLITE: 0,8855

Получение размера файла Keras и Tensorflow File

convert_bytes(get_file_size(KERAS_MODEL_NAME), "MB")
convert_bytes(get_file_size(TF_LITE_MODEL_FILE_NAME), "KB")

Размер файла: 1,19 мегабайт
Размер файла: 398,969 килобайт

Заключение

Размер файла Keras составляет около 1,2 МБ, который имеет тенденцию увеличиваться, если мы добавляем в нашу модель больше слоев. После создания TF-Lite это около 400 КБ.

Точность модели Кераса на тестовых изображениях составляет
88,55000138282776%, а размер файла TF-Lite составляет 88,55%.

Вы можете ясно видеть, что мы все еще преобразовали нашу модель, точность остается почти такой же.

Если вы хотите узнать больше о Tensorflow Lite, перейдите по ссылке:



В следующем блоге я расскажу об оптимизации модели tflite с помощью квантования. Будьте на связи :)

Следуй за мной на Github



Социальные ручки

Instagram: https://www.instagram.com/sayannath235/

LinkedIn: https://www.linkedin.com/in/sayannath235/

Почта: [email protected]