Per-tensor QAT model Conv2d+BN+relu folding issue
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- keras, python
- Ambito
- machine-learning
Direzione di ricerca
Inizia eseguendo la riproduzione Python fornita con per_tensor=True e per_tensor=False, quindi esamina la funzione _replace a cui si fa riferimento nell’issue e confronta i modelli Keras H5 generati. La correzione è completa quando il layer ripiegato Conv2D+BatchNormalization+ReLU rimane quantizzato in modalità per-tensor e la conversione TFLite ha esito positivo senza suddividere il grafo in sezioni Quantize-Dequantize.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
I need to train QAT (per-tensor) model and then convert it tflite. But I get "folding issue" described here.
System information
TensorFlow version (installed from source or binary): 2.15.0
TensorFlow Model Optimization version (installed from source or binary): 0.8.0
Python version: 3.10.12
Describe the expected behavior
A 1-layer CNN (conv2d+bn+relu) is folded and converted to tflite after QAT in per-tensor mode without splitting computation graph on multiply "Quantize-Dequatize" parts.
Describe the current behavior
After folding a 1-layer CNN (conv2d+bn+relu) the folded layer is unquantized.
Code to reproduce the issue
import tensorflow as tf
from tensorflow_model_optimization.python.core.keras.compat import keras
from tensorflow_model_optimization.python.core.quantization.keras.default_8bit import \
default_8bit_quantize_scheme
import tensorflow_model_optimization as tfmot
quantize_apply = tfmot.quantization.keras.quantize_apply
quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model
def train_qat_convert_tflite(per_tensor):
model = keras.Sequential([
keras.layers.InputLayer(input_shape=(128, 128, 3)),
keras.layers.Conv2D(3, 3, padding='same', use_bias=False),
keras.layers.BatchNormalization(),
keras.layers.Activation('relu'),
keras.layers.Softmax(),
])
annotated_model = quantize_annotate_model(model)
q_aware_model = quantize_apply(annotated_model,
scheme=default_8bit_quantize_scheme.Default8BitQuantizeScheme(disable_per_axis=per_tensor))
q_aware_model.compile(
# optimizer=Adam(learning_rate=learning_rate, epsilon=1e-8, weight_decay=1e-4),
optimizer='Adam',
loss=keras.losses.MeanAbsoluteError(),
metrics=['accuracy'],
)
q_aware_model.fit(
x=tf.random.normal((128, 128, 128, 3)),
y=tf.random.normal((128, 128, 128, 3)),
batch_size=16,
epochs=1,
)
q_aware_model.save(f'{per_tensor=}.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(q_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
quantized_tflite_model = converter.convert()
open(f'{per_tensor=}.tflite', "wb").write(quantized_tflite_model)
train_qat_convert_tflite(per_tensor=True)
train_qat_convert_tflite(per_tensor=False)
Screenshots
Additional context
I tested #552 but in case of a simple 1-layer CNN (see code) there are no custom layers so if statement in _replace function is False and I get the next line.
I see that in keras h5 model BN layer is quantized as per-channel because quantization parameters in both cases are tensors not scalar as it is expected for per-tensor mode.
- Lingua principale
- Python
- Stelle
- 1.6k
- Fork
- 349
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di tensorflow/model-optimization
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
tensorflow/model-optimization#1301 · 1 commento ·
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
tensorflow/model-optimization#1272 ·
-
bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 50/100
tensorflow/model-optimization#1270 · 2 commenti ·
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 48/100
tensorflow/model-optimization#1241 ·
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
tensorflow/model-optimization#1182 · 1 commento ·
Tutte le issue di tensorflow/model-optimization
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-2 giorni Idoneità per principianti 70/100
-
FingerprintSplitter raises ZeroDivisionError when int(frac_train * len(dataset)) floors to zeroAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 7 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
lmstudio-ai/mlx-engine#376 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
pyiron/bagofholding#166 ·