- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
最近,我开始使用 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 模型中提取一些较低级的方法。
最佳答案
在其他答案中提到,TensorFlow Lite 可以帮助您进行网络量化。
TensorFlow Lite provides several levels of support for quantization.
Tensorflow Lite post-training quantization quantizes weights and activations post training easily. Quantization-aware training allows for training of networks that can be quantized with minimal accuracy drop; this is only available for a subset of convolutional neural network architectures.
所以首先,你需要决定是否需要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())
关于python - 量化 Keras 神经网络模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52259343/
我是一名优秀的程序员,十分优秀!