Квантовать модель нейронной сети Keras - PullRequest
0 голосов
/ 10 сентября 2018

Недавно я начал создавать нейронные сети с Tensorflow + Keras и хотел бы попробовать функцию квантования, доступную в Tensorflow.До сих пор эксперименты с примерами из учебных пособий по TF работали просто отлично, и у меня есть этот базовый рабочий пример (из https://www.tensorflow.org/tutorials/keras/basic_classification):

import tensorflow as tf
from tensorflow import keras

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

# fashion mnist data labels (indexes related to their respective labelling in the data set)
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

# preprocess the train and test images
train_images = train_images / 255.0
test_images = test_images / 255.0

# settings variables
input_shape = (train_images.shape[1], train_images.shape[2])

# create the model layers
model = keras.Sequential([
keras.layers.Flatten(input_shape=input_shape),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])

# compile the model with added settings
model.compile(optimizer=tf.train.AdamOptimizer(),
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])

# train the model
epochs = 3
model.fit(train_images, train_labels, epochs=epochs)

# evaluate the accuracy of model on test data
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)

Теперь я хотел бы использовать квантование в процессе обучения и классификации. КвантованиеДокументация (https://www.tensorflow.org/performance/quantization) (страница более не доступна с 15 сентября 2018 г.) предлагает использовать этот фрагмент кода:

loss = tf.losses.get_total_loss()
tf.contrib.quantize.create_training_graph(quant_delay=2000000)
optimizer = tf.train.GradientDescentOptimizer(0.00001)
optimizer.minimize(loss)

Однако, он не содержит никакой информации о том, где этокод должен использоваться или как он должен быть связан с кодом TF (даже не упоминая модель высокого уровня, созданную с помощью Keras). Я понятия не имею, как эта часть квантования связана с ранее созданной моделью нейронной сети. Просто вставляю ее после нейронной сети.В сетевом коде возникает следующая ошибка:

Traceback (most recent call last):
  File "so.py", line 41, in <module>
    loss = tf.losses.get_total_loss()
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/losses/util.py", line 112, in get_total_loss
    return math_ops.add_n(losses, name=name)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/math_ops.py", line 2119, in add_n
    raise ValueError("inputs must be a list of at least one Tensor with the "
ValueError: inputs must be a list of at least one Tensor with the same dtype and shape

Можно ли таким образом квантовать модель Keras NN или я упускаю что-то простое? Возможное решение, которое приходило мне в голову, - это использование низкоуровневого API TFвместо кераса (нужно проделать немало работы чтобы минусыили попытаться извлечь некоторые методы более низкого уровня из моделей Keras.

1 Ответ

0 голосов
/ 12 августа 2019

Поскольку ваша сеть выглядит довольно просто, вы можете использовать Tensorflow lite .

...