В настоящее время я пытаюсь понять обучение с учетом квантования в TensorFlow. Я понимаю, что поддельные узлы квантования требуются для сбора динамической c информации о диапазоне в качестве калибровки для операции квантования. Когда я сравниваю одну и ту же модель один раз в качестве «простой» модели Кераса и один раз в качестве модели с учетом квантования, последняя имеет больше параметров, что имеет смысл, поскольку нам нужно сохранять минимальные и максимальные значения для активации во время обучения с учетом квантования.
Рассмотрим следующий пример:
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.models import Model
def get_model(in_shape):
inpt = layers.Input(shape=in_shape)
dense1 = layers.Dense(256, activation="relu")(inpt)
dense2 = layers.Dense(128, activation="relu")(dense1)
out = layers.Dense(10, activation="softmax")(dense2)
model = Model(inpt, out)
return model
Модель имеет следующую сводку:
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 784)] 0
_________________________________________________________________
dense_3 (Dense) (None, 256) 200960
_________________________________________________________________
dense_4 (Dense) (None, 128) 32896
_________________________________________________________________
dense_5 (Dense) (None, 10) 1290
=================================================================
Total params: 235,146
Trainable params: 235,146
Non-trainable params: 0
_________________________________________________________________
Однако, если я сделаю оптимизацию моей модели, она напечатает следующее Резюме:
import tensorflow_model_optimization as tfmot
quantize_model = tfmot.quantization.keras.quantize_model
# q_aware stands for for quantization aware.
q_aware_model = quantize_model(standard)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 784)] 0
_________________________________________________________________
quantize_layer (QuantizeLaye (None, 784) 3
_________________________________________________________________
quant_dense_3 (QuantizeWrapp (None, 256) 200965
_________________________________________________________________
quant_dense_4 (QuantizeWrapp (None, 128) 32901
_________________________________________________________________
quant_dense_5 (QuantizeWrapp (None, 10) 1295
=================================================================
Total params: 235,164
Trainable params: 235,146
Non-trainable params: 18
_________________________________________________________________
У меня есть два вопроса, в частности:
- Какова цель
quantize_layer
с 3 параметрами после входного слоя? - Почему у нас есть 5 дополнительных необучаемых параметров на каждый слой и для чего они используются?
Я ценю любые подсказки или дополнительные материалы, которые помогают мне (и другим, кто сталкивается с этим вопросом) понять квантование осознанное обучение.