最近,我开始使用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)(自cca 2018年9月15日起不再提供该页面)建议使用以下代码:
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模型,或者我是否缺少基本知识? 可能想到的解决方案可能是使用低级TF API代替Keras(需要做大量工作来构建模型),或者尝试从Keras模型中提取一些较低级的方法。>
答案 0 :(得分:2)
如其他答案所述,TensorFlow Lite可以帮助您进行网络量化。
TensorFlow Lite提供了多个级别的量化支持。
Tensorflow Lite训练后量化量化权重, 激活后易于训练。量化意识训练可以 用于训练可以以最低精度量化的网络 下降;这仅适用于卷积神经的子集 网络体系结构。
因此,首先,您需要确定是否需要post-training quantization或quantization-aware training。例如,如果您已经将模型另存为* .h5文件,则可能要遵循@Mitiku的说明并进行训练后量化。
如果您希望通过模拟训练中的量化效果(使用问题中引用的方法)来获得更高的性能,并且您的模型位于受量化支持的CNN体系结构子集中,有意识的培训,this example可能会在Keras和TensorFlow之间的交互方面为您提供帮助。基本上,您只需要在模型定义及其拟合之间添加以下代码:
sess = tf.keras.backend.get_session()
tf.contrib.quantize.create_training_graph(sess.graph)
sess.run(tf.global_variables_initializer())
答案 1 :(得分:1)
由于您的网络看起来非常简单,因此您可以使用Tensorflow lite。
答案 2 :(得分:1)
Tensorflow lite可用于量化keras模型。
以下代码是为tensorflow 1.14编写的。它可能不适用于早期版本。
首先,在训练完模型后,您应该将模型保存到~
h5
要加载keras模型,请使用tf.lite.TFLiteConverter.from_keras_model_file
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)
model.save("model.h5")
保存的模型可以加载到python脚本或其他平台和语言。要使用保存的tflite模型,tensorlfow.lite提供了Interpreter。来自here的以下示例显示了如何使用python脚本从本地文件加载tflite模型。
# load the previously saved model
converter = tf.lite.TFLiteConverter.from_keras_model_file("model.h5")
tflite_model = converter.convert()
# Save the model to file
with open("tflite_model.tflite", "wb") as output_file:
output_file.write(tflite_model)