Hello, I would like to add an L2 regularization to the weights of a KerasLayer and was wondering if you could give me some tips about how to implement this. For context, I’m training a KerasLayer in Tensorflow that represents a quantum kernel of the form K(x,w) and need to regularize a Hinge loss for a classification problem with the L2 norm of w. I was hoping to have something similar to a “kernel_regularizer” option for Dense and Conv layers in Tensorflow but it seems that this feature is currently unavailable for KerasLayers and would be very useful to have.
Hi @Roberto, welcome to the forum!
You could try adding an L2 term on the weights to the optimized loss. e.g. let ws be the gate parameters and L the original loss, the new loss with weight regularization would be L_reg = L + reg_coef*np.mean(ws**2) .
Would this be what you were looking for?
Please let me know if this helps!
Thank you for your prompt response.
Sure, I could do what you suggest but I was hoping to take advantage of the high-level functionality of Tensorflow with model.compile and model.fit, where you don’t need to explicitly enter the loss or the regularization formulae.
At any rate, I did find a way of enabling regularization for the Keras Layer. Here is how:
-
I copied your code for the class definition of
KerasLayerto create a new class,KerasLayerRegularized. -
At the top of the code I added:
from tensorflow.keras import regularizers -
At the end of the
def _init_section, I added the following line of code:
self.kernel_regularizer = regularizers.get(kernel_regularizer) -
In the
def builtsection, I replaced:
self.qnode_weights[weight] = self.add_weight(name=weight, shape=size, **spec)
with
self.qnode_weights[weight] = self.add_weight(name=weight, shape=size, regularizer=self.kernel_regularizer, **spec) -
Finally, in my own code, in the line where I create the Keras Layer I have:
qlayer = KerasLayerRegularized(circuit,weight_shapes, weight_specs={"weights": {"initializer":"random_normal"}}, kernel_regularizer=tf.keras.regularizers.L2(1e-1), output_dim=outdim)
It worked nicely. Perhaps other people will find it useful to enable the kernel_regularizer option for the KerasLayer as I did here, or even better, if possible, it could be an added feature in future versions.
Glad you got it working @Roberto!
If you would like to open an issue on our GitHub page, that will gelp inform the developers on any feature requests, and also make the request visible to potential contributors ![]()
Thank you for posting the solution here @Roberto! Would you like to open the issue on GitHub for requesting this feature? If not it’s ok, just let us know.
Thank you both. I submitted a feature request and provided the link to this conversation: https://github.com/PennyLaneAI/pennylane/issues/1777
Awesome, thanks @Roberto!