Open DuJiahao1996 opened 1 year ago
Only separable 1D conv is supported by QAT api now. I think it is a missing part in Conv support, you can manually update your default quantization registry to quantize (or not quantize) the Conv1D layer https://github.com/tensorflow/model-optimization/blob/master/tensorflow_model_optimization/python/core/quantization/keras/default_8bit/default_8bit_quantize_registry.py#L88
This issue seems very similar to #362. There may be more help available in that thread, but it is 3 years old.
Describe the bug When quantizing the keras model after pruning, an error is reported as follows.
RuntimeError: Layer conv1d:<class 'tensorflow.python.keras.layers.convolutional.Conv1D'> is not supported. You can quantize this layer by passing a
tfmot.quantization.keras.QuantizeConfig
instance to thequantize_annotate_layer
API.Dose fmot.quantization.keras.quantize_model not support 1DCNN?
System information
TensorFlow version (installed from source or binary): tf=2.4.1
TensorFlow Model Optimization version (installed from source or binary): tensorflow_model_optimization==0.5.0
Python version: python==3.6.9
Code to reproduce the issue LOGGER.info(f"starting") prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude pruning_params = {'pruning_schedule': tfmot.sparsity.keras.ConstantSparsity(target_sparsity=0.30,begin_step=0,end_step=-1)} LOGGER.info(f"pruning") self._model = prune_low_magnitude(self._model, **pruning_params) LOGGER.info(f"compiling") self._model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=["accuracy"]) LOGGER.info(f"fitting") history=self._model.fit(x=data, epochs=8, verbose=1, shuffle=True, callbacks=callbacks) LOGGER.info(f"striping") self._model = tfmot.sparsity.keras.strip_pruning(self._model) LOGGER.info(f"quantizing") quantize_model = tfmot.quantization.keras.quantize_model self._model = quantize_model(self._model) LOGGER.info(f"compiling") self._model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=["accuracy"]) LOGGER.info(f"fitting") history = self._model.fit(x=data, epochs=2, verbose=1, shuffle=True, callbacks=callbacks)
tf. keras model import tensorflow as tf
inputs = tf.keras.Input(shape=(58,)) x=tf.keras.layers.Reshape((58,1))(inputs)
x = tf.keras.layers.Conv1D(8, 1,strides=1,padding='same')(x) x=tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Activation('relu')(x)
x1 = tf.keras.layers.Conv1D(16, 1,strides=1,padding='same',dilation_rate=3)(x) x2 = tf.keras.layers.Conv1D(16, 3,strides=1,padding='same',dilation_rate=3)(x)
x1=tf.keras.layers.BatchNormalization()(x1) x2=tf.keras.layers.BatchNormalization()(x2)
x1 = tf.keras.layers.Activation('relu')(x1) x2 = tf.keras.layers.Activation('relu')(x2)
x=tf.keras.layers.Concatenate(-1)([x1,x2])
x = tf.keras.layers.Conv1D(16, 1,strides=1,padding='same')(x) x=tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Activation('relu')(x)
x1 = tf.keras.layers.Conv1D(32, 1,strides=1,padding='same',dilation_rate=3)(x) x2 = tf.keras.layers.Conv1D(32, 3,strides=1,padding='same',dilation_rate=3)(x)
x1=tf.keras.layers.BatchNormalization()(x1) x2=tf.keras.layers.BatchNormalization()(x2)
x1 = tf.keras.layers.Activation('relu')(x1) x2 = tf.keras.layers.Activation('relu')(x2)
x=tf.keras.layers.Concatenate(-1)([x1,x2])
x = tf.keras.layers.Conv1D(32, 1,strides=1,padding='same')(x) x=tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Activation('relu')(x)
x1 = tf.keras.layers.Conv1D(64, 1,strides=1,padding='same',dilation_rate=3)(x) x2 = tf.keras.layers.Conv1D(64, 3,strides=1,padding='same',dilation_rate=3)(x)
x1=tf.keras.layers.BatchNormalization()(x1) x2=tf.keras.layers.BatchNormalization()(x2)
x1 = tf.keras.layers.Activation('relu')(x1) x2 = tf.keras.layers.Activation('relu')(x2)
x=tf.keras.layers.Concatenate(-1)([x1,x2])
x=tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.Conv1D(128, 4,strides=1,padding='same')(x) x=tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Activation('relu')(x)
x_shortcut=x
x = tf.keras.layers.Conv1D(128, 1,strides=1,padding='same')(x) x=tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Activation('relu')(x)
x=tf.keras.layers.SeparableConv1D(128,2,strides=1,padding='same')(x) x=tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Activation('relu')(x)
se_x = x se_x=tf.keras.layers.GlobalAveragePooling1D()(se_x) se_x =tf.keras.layers.Dense(128)(se_x) se_x= tf.keras.layers.Activation('relu')(se_x) se_x= tf.keras.layers.Multiply()([x,se_x]) x = tf.keras.layers.add([x,se_x]) x = tf.keras.layers.Activation('relu')(x)
x = tf.keras.layers.add([x,x_shortcut]) x = tf.keras.layers.Activation('relu')(x)
x=tf.keras.layers.GlobalAveragePooling1D()(x) x=tf.keras.layers.Dropout(0.5)(x) x =tf.keras.layers.Dense(7)(x) pred = tf.keras.layers.Activation('softmax')(x) model = tf.keras.Model(inputs=inputs, outputs=pred) model.summary() print(model.to_json())