Компилятор Coral Edge TPU не может преобразовать модель tflite: модель не квантована - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь развернуть простое тестовое приложение с TensorFlow lite.Я хочу использовать Coral Edge TPU Stick на моем устройстве, поэтому мне нужно пройти обучение по квантованию.Я хочу соответствовать функции f(x) = 2 x - 1.Мой обучающий код выглядит следующим образом:

import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.contrib import lite

# Create model
model = keras.models.Sequential([keras.layers.Dense(units=1, input_shape=[1])])

# Quantization aware training
sess = keras.backend.get_session()
tf.contrib.quantize.create_training_graph(sess.graph)
sess.run(tf.global_variables_initializer())

tf.summary.FileWriter('logs/', graph=sess.graph)

model.compile(optimizer='sgd', loss='mean_squared_error')

# Training data
xs = np.array([ -1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([ -3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)

model.fit(xs, ys, epochs=500, batch_size=2)

# Test the model for plausbility
print(model.predict([10.0]))

# Display the quantization-relevant variables
for node in sess.graph.as_graph_def().node:
    if 'weights_quant/AssignMaxLast' in node.name \
        or 'weights_quant/AssignMinLast' in node.name:
        tensor = sess.graph.get_tensor_by_name(node.name + ':0')
        print('{} = {}'.format(node.name, sess.run(tensor)))


# Save the keras model
keras_file = 'quant_linear.h5'
keras.models.save_model(model, keras_file)

# Convert the keras model into a tflite model
converter = lite.TocoConverter.from_keras_model_file(keras_file)
converter.post_training_quantize = True
tflite_model = converter.convert()
open('quant_linear.tflite', 'wb').write(tflite_model)

В качестве вывода я получаю (выходные данные, специфичные для keras и CUDA, опущены):

[[18.86733]]
dense/weights_quant/AssignMinLast = 0.0
dense/weights_quant/AssignMaxLast = 1.984399676322937

Здесь необходимо отметить две вещи: модель правдоподобна, он должен вывести значение, близкое к 19. Очевидно, он также использует квантованные веса.Если я не включу обучение с учетом квантования, две переменные не будут отображаться.

Кроме того, эта модель может быть загружена и выполнена экземпляром интерпретатора tf-lite.Однако, чтобы иметь возможность использовать его с поддержкой TPU, я должен преобразовать его с tpuedge_compiler.После установки я выполняю

edgetpu_compiler quant_linear.tflite

К сожалению, кажется, что он не может распознать, что модель квантована.Он выводит

user@ubuntu:~/TensorFlow$ edgetpu_compiler quant_linear.tflite 
Edge TPU Compiler version 1.0.249710469
INFO: Initialized TensorFlow Lite runtime.
Invalid model: quant_linear.tflite
Model not quantized

Я попытался скомпилировать его в Интернете, что также не удается.Это ошибка или я что-то напутал во время обучения / конвертации?Также, может быть, есть инструмент для проверки того, что я действительно использую квантованную модель?

Спасибо!

...