# TF.js: how to impose constraints on weights without a Keras model?

**URL:** <https://discuss.ai.google.dev/t/tf-js-how-to-impose-constraints-on-weights-without-a-keras-model/31907>\
**Category:** General Discussion\
**Tags:** keras, tfjs\
**Created:** [September 27, 2022, 10:39am UTC](https://discuss.ai.google.dev/t/tf-js-how-to-impose-constraints-on-weights-without-a-keras-model/31907 "2022-09-27T10:39:36Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![LongBear](https://d1dlmcr85iqnpo.cloudfront.net/user_avatar/discuss.ai.google.dev/longbear/32/11873_2.png) [@LongBear](https://discuss.ai.google.dev/u/LongBear)\
**Post date:** [September 27, 2022, 10:39am UTC](https://discuss.ai.google.dev/t/tf-js-how-to-impose-constraints-on-weights-without-a-keras-model/31907/1 "2022-09-27T10:39:37Z")

</div>

Hi TF-fans!

I am getting more and more into TensorFlow but still trying to figure some things out.

I was about to write my own constraint and boundary condition function but then noticed there is a `tf.constraints` class, which got me curious. Are there such helper methods that can be applied to the weight variables themselves without needing a Keras model and layers? At the moment I am just using the `tf.optimize.minimize`.

If I need to constrain my variables manually:  
Where do I place my constraints in the training loop?  
What type of constraints should I use?

Here are a few alternatives I have tried:

- `w.assign(tf.div(w, tf.sum(w)))`
- `w.assign(tf.div(tf.exp(w), tf.sum(tf.exp(w))))`
- `w.assign(tf.softmax(w))`

Neither seems to work. Individual weights are not in [0, 1] and do not sum to 1. Training stalls immediately with all of them, but that may be due to some unrelated issue.

In general, my question is what the recommended way is to manage constraints and boundary conditions in TF and also looking for your personal experience with the above constraints.

* * *

Copying you @Dennis seeing as you helped me out a lot a few days ago when I started working with TF.

---

<div class="post-metadata">

**Author:** ![Rahul\_Gaikwad](https://d1dlmcr85iqnpo.cloudfront.net/user_avatar/discuss.ai.google.dev/rahul_gaikwad/32/8151_2.png) [@Rahul\_Gaikwad](https://discuss.ai.google.dev/u/Rahul_Gaikwad)\
**Post date:** [February 14, 2024, 3:58pm UTC](https://discuss.ai.google.dev/t/tf-js-how-to-impose-constraints-on-weights-without-a-keras-model/31907/3 "2024-02-14T15:58:36Z")

</div>

Hi, @LongBear

I apologize for the delayed response and You’re right, the methods you tried won’t achieve the desired results for several reasons:

- **`tf.div(w, tf.sum(w))`:** This divides each weight by the sum of all weights, leading to individual weights not necessarily being between 0 and 1. It also requires the sum to be non-zero, which might not always be the case.
- **`tf.div(tf.exp(w), tf.sum(tf.exp(w)))`:** Similar to the above, this method doesn’t guarantee individual values within the [0, 1] range due to possible exponentials becoming very large.
- **`tf.softmax(w)`:** While softmax ensures weights sum to 1, it doesn’t enforce individual bounds between 0 and 1.

As per my current understanding approaches for Constraint Enforcement:

**1. `tf.keras.constraints`:**

- Ideal for enforcing constraints **during training** within a Keras model.
- Use built-in constraints like `tf.keras.constraints.MinMaxNorm` or define custom constraints please refer this official [documentation](https://keras.io/api/layers/constraints/)

```auto
import tensorflow as tf

class MyCustomConstraint(tf.keras.constraints.Constraint):
    def __init__ (self, min_value, max_value):
        self.min_value = min_value
        self.max_value = max_value

    def call(self, weights):
        return tf.clip_by_value(weights, self.min_value, self.max_value)

model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, use_bias=False, kernel_constraint=MyCustomConstraint(0, 1))
])

# ... (rest of your Keras training code)

```

**2. Manual Gradients with Custom Losses:**

- Suitable for complex constraints not readily available in `tf.keras.constraints`.
- Define a custom loss function that incorporates the constraint violation penalty please refer this official [documentation](https://www.tensorflow.org/api_docs/python/tf/keras/constraints/Constraint)

```auto
def custom_loss(logits, labels):
    # Original loss calculation
    loss = tf.reduce_mean(tf.losses.binary_crossentropy(labels, logits))

    # Constraint violation penalty (example for L1-norm constraint)
    constraint_penalty = tf.reduce_mean(tf.abs(weights - 0.5)) # Replace with your constraint logic
    loss += constraint_penalty * 0.1 # Adjust weight according to importance

    return loss

# ... (optimize using the custom loss function)

```

- Choose the approach that aligns with your project’s specific needs and complexity.
- Experiment and compare different techniques to find the most effective solution.

I hope this will help you effectively manage constraints and boundary conditions in TensorFlow.

If I have missed something here please let me know. Thank you for your understanding and patience.

---

<div class="post-metadata">

**Author:** ![Sensei](https://d1dlmcr85iqnpo.cloudfront.net/user_avatar/discuss.ai.google.dev/sensei/32/9647_2.png) [@Sensei](https://discuss.ai.google.dev/u/Sensei)\
**Post date:** [February 15, 2024, 3:35am UTC](https://discuss.ai.google.dev/t/tf-js-how-to-impose-constraints-on-weights-without-a-keras-model/31907/4 "2024-02-15T03:35:24Z")

</div>

const model = tf.sequential();

// Add layers to the model  
model.add(tf.layers.dense({inputShape: [inputSize], units: 64}));  
model.add(tf.layers.dense({units: 32}));

// Retrieve the weights of the layers  
const weights = model.getWeights();

// Define a custom constraint function  
function customConstraint(weight) {  
// Apply your constraints here, for example:  
// You can clip the values between a certain range  
return tf.clipByValue(weight, -0.5, 0.5);  
}

// Apply constraints to the weights  
const constrainedWeights = weights.map(weight =\> customConstraint(weight));

// Set the constrained weights back to the model  
model.setWeights(constrainedWeights);

// Now you can proceed with model compilation, training, etc.
