Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

QSeparableConv2D: 'Keyword argument not understood:', 'depthwise_activation' #76

Open
EnriqueNueve opened this issue Jul 10, 2021 · 1 comment

Comments

@EnriqueNueve
Copy link

For the QSeparableConv2D layer, a error is being prompted saying that the keyword argument for depthwise_activation is not understood. Following the sample code from the readme, this error is prompted. Below is the code that prompted this error.

tensorflow==2.5.0
Qkeras==0.9.0
from tensorflow.keras.layers import *
from qkeras import *

def getQModel(INPUT_SHAPE,N_CLASSES):
    inputs = Input(INPUT_SHAPE)

    x = QConv2D(18, (3, 3),
            kernel_quantizer="stochastic_ternary",
            bias_quantizer="ternary", name="first_conv2d")(inputs)
    x = QActivation("quantized_relu(3)")(x)
    x = QSeparableConv2D(32, (3, 3),
            depthwise_quantizer=quantized_bits(4, 0, 1),
            pointwise_quantizer=quantized_bits(3, 0, 1),
            bias_quantizer=quantized_bits(3),
            depthwise_activation=quantized_tanh(6, 2, 1))(x)
    x = QActivation("quantized_relu(3)")(x)
    x = Flatten()(x)
    x = QDense(NB_CLASSES,
            kernel_quantizer=quantized_bits(3),
            bias_quantizer=quantized_bits(3))(x)
    x = QActivation("quantized_bits(20, 5)")(x)
    yh = Activation("softmax")(x)
    
    model = tf.keras.Model(inputs, yh)
    print(model.summary())
    return model

qmodel = getQModel(INPUT_SHAPE,N_CLASSES)

The error itself.

TypeError                                 Traceback (most recent call last)
/var/folders/1l/1j39gqlj2373rny0fddzmbgw0000gn/T/ipykernel_35211/3806686309.py in <module>
     26     return model
     27 
---> 28 qmodel = getQModel(INPUT_SHAPE,N_CLASSES)

/var/folders/1l/1j39gqlj2373rny0fddzmbgw0000gn/T/ipykernel_35211/3806686309.py in getQModel(INPUT_SHAPE, N_CLASSES)
      9             bias_quantizer="ternary", name="first_conv2d")(inputs)
     10     x = QActivation("quantized_relu(3)")(x)
---> 11     x = QSeparableConv2D(32, (3, 3),
     12             depthwise_quantizer=quantized_bits(4, 0, 1),
     13             pointwise_quantizer=quantized_bits(3, 0, 1),

~/opt/anaconda3/envs/golden/lib/python3.8/site-packages/qkeras/qconvolutional.py in __init__(self, filters, kernel_size, strides, padding, data_format, dilation_rate, depth_multiplier, activation, use_bias, depthwise_initializer, pointwise_initializer, bias_initializer, depthwise_regularizer, pointwise_regularizer, bias_regularizer, activity_regularizer, depthwise_constraint, pointwise_constraint, bias_constraint, depthwise_quantizer, pointwise_quantizer, bias_quantizer, **kwargs)
    766       activation = get_quantizer(activation)
    767 
--> 768     super(QSeparableConv2D, self).__init__(
    769         filters=filters,
    770         kernel_size=kernel_size,

~/opt/anaconda3/envs/golden/lib/python3.8/site-packages/tensorflow/python/keras/layers/convolutional.py in __init__(self, filters, kernel_size, strides, padding, data_format, dilation_rate, depth_multiplier, activation, use_bias, depthwise_initializer, pointwise_initializer, bias_initializer, depthwise_regularizer, pointwise_regularizer, bias_regularizer, activity_regularizer, depthwise_constraint, pointwise_constraint, bias_constraint, **kwargs)
   2205                bias_constraint=None,
   2206                **kwargs):
-> 2207     super(SeparableConv2D, self).__init__(
   2208         rank=2,
   2209         filters=filters,

~/opt/anaconda3/envs/golden/lib/python3.8/site-packages/tensorflow/python/keras/layers/convolutional.py in __init__(self, rank, filters, kernel_size, strides, padding, data_format, dilation_rate, depth_multiplier, activation, use_bias, depthwise_initializer, pointwise_initializer, bias_initializer, depthwise_regularizer, pointwise_regularizer, bias_regularizer, activity_regularizer, depthwise_constraint, pointwise_constraint, bias_constraint, trainable, name, **kwargs)
   1784                name=None,
   1785                **kwargs):
-> 1786     super(SeparableConv, self).__init__(
   1787         rank=rank,
   1788         filters=filters,

~/opt/anaconda3/envs/golden/lib/python3.8/site-packages/tensorflow/python/keras/layers/convolutional.py in __init__(self, rank, filters, kernel_size, strides, padding, data_format, dilation_rate, groups, activation, use_bias, kernel_initializer, bias_initializer, kernel_regularizer, bias_regularizer, activity_regularizer, kernel_constraint, bias_constraint, trainable, name, conv_op, **kwargs)
    127                conv_op=None,
    128                **kwargs):
--> 129     super(Conv, self).__init__(
    130         trainable=trainable,
    131         name=name,

~/opt/anaconda3/envs/golden/lib/python3.8/site-packages/tensorflow/python/training/tracking/base.py in _method_wrapper(self, *args, **kwargs)
    520     self._self_setattr_tracking = False  # pylint: disable=protected-access
    521     try:
--> 522       result = method(self, *args, **kwargs)
    523     finally:
    524       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

~/opt/anaconda3/envs/golden/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py in __init__(self, trainable, name, dtype, dynamic, **kwargs)
    345     }
    346     # Validate optional keyword arguments.
--> 347     generic_utils.validate_kwargs(kwargs, allowed_kwargs)
    348 
    349     # Mutable properties

~/opt/anaconda3/envs/golden/lib/python3.8/site-packages/tensorflow/python/keras/utils/generic_utils.py in validate_kwargs(kwargs, allowed_kwargs, error_message)
   1135   for kwarg in kwargs:
   1136     if kwarg not in allowed_kwargs:
-> 1137       raise TypeError(error_message, kwarg)
   1138 
   1139 

TypeError: ('Keyword argument not understood:', 'depthwise_activation')
@vloncar
Copy link
Contributor

vloncar commented Jul 13, 2021

Current QSeparableConv2D layer follows Keras implementation and doesn't apply activation after the depthwise step. The readme refers to the old implementation based on MobileNet that does this. That implementation is still available as QMobileNetSeparableConv2D. We'll fix the readme, thanks for reporting!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants