Adam Optimizer Not Working on cost function

Issue

I wanted to make own neural network for MNIST data set and for that using tensorflow i am writing the code
imported library and dataset
then done one hot encoding
and after all done the weights and baises assignment and then done the forward propagation with the random values and for back propagation and cost minimization used a loss function to do so
but unable to use the optimizer dont know why

import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.datasets.mnist import load_data

(x_train, y_train), (x_test, y_test) = load_data()

y_train_onehot = tf.one_hot(y_train,10)
y_test_onehot = tf.one_hot(y_test,10)


n_input = 784
n_hidden_1 = 256
n_hidden_2 = 256
n_classes = 10

weights = {
    "h1" : tf.Variable(tf.random.normal([n_input,n_hidden_1]),trainable=True),
            #here we require 784x256 random values
    "h2" : tf.Variable(tf.random.normal([n_hidden_1,n_hidden_2]),trainable = True),
            #here we require 256x256 random values
    
    'out' : tf.Variable(tf.random.normal([n_hidden_2,n_classes]),trainable = True)
            #here we require 256x10 random values
}

#similarly for biases

biases = {
    "h1" : tf.Variable(tf.random.normal([n_hidden_1]),trainable = True),
    "h2" : tf.Variable(tf.random.normal([n_hidden_2]),trainable = True),
    'out' : tf.Variable(tf.random.normal([n_classes]),trainable = True)
}

def ForwardPropagation(x, weights, biases):
    
    #giving net input to hidden layer1
    in_layer1 = tf.add( tf.matmul(x, weights['h1']), biases['h1'])
    #giving net output of hidden layer1
    out_layer1 = tf.nn.relu(in_layer1)
    
    in_layer2 = tf.add( tf.matmul(out_layer1, weights['h2']), biases['h2'])
    out_layer2 = tf.nn.relu(in_layer2)
    
    output = tf.add( tf.matmul(out_layer2, weights['out']), biases['out'])
    return output

x_train_modified = tf.reshape(x_train , shape=[60000,784])
x_train_modified = tf.cast(x_train_modified, dtype=tf.float32)
x_train_modified

pred = ForwardPropagation(x_train_modified,weights,biases)
predictions = tf.argmax(pred,1)

y = y_train_onehot
actualvalues = tf.argmax(y,1)
actualvalues

loss = lambda : tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits= pred , labels = y))

optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
optimize = optimizer.minimize(loss,var_list=[weights['h1'],weights['h2'],weights['out'],biases['h1'],biases['h2'],biases['out']])

after running this giives a error like

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [30], in <cell line: 2>()
      1 optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
----> 2 optimize = optimizer.minimize(loss,var_list=[weights['h1'],weights['h2'],weights['out'],biases['h1'],biases['h2'],biases['out']])

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\optimizers\optimizer_v2\optimizer_v2.py:539, in OptimizerV2.minimize(self, loss, var_list, grad_loss, name, tape)
    507 """Minimize `loss` by updating `var_list`.
    508 
    509 This method simply computes gradient using `tf.GradientTape` and calls
   (...)
    535 
    536 """
    537 grads_and_vars = self._compute_gradients(
    538     loss, var_list=var_list, grad_loss=grad_loss, tape=tape)
--> 539 return self.apply_gradients(grads_and_vars, name=name)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\optimizers\optimizer_v2\optimizer_v2.py:640, in OptimizerV2.apply_gradients(self, grads_and_vars, name, experimental_aggregate_gradients)
    599 def apply_gradients(self,
    600                     grads_and_vars,
    601                     name=None,
    602                     experimental_aggregate_gradients=True):
    603   """Apply gradients to variables.
    604 
    605   This is the second part of `minimize()`. It returns an `Operation` that
   (...)
    638     RuntimeError: If called in a cross-replica context.
    639   """
--> 640   grads_and_vars = optimizer_utils.filter_empty_gradients(grads_and_vars)
    641   var_list = [v for (_, v) in grads_and_vars]
    643   with tf.name_scope(self._name):
    644     # Create iteration if necessary.

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\optimizers\optimizer_v2\utils.py:73, in filter_empty_gradients(grads_and_vars)
     71 if not filtered:
     72   variable = ([v.name for _, v in grads_and_vars],)
---> 73   raise ValueError(f"No gradients provided for any variable: {variable}. "
     74                    f"Provided `grads_and_vars` is {grads_and_vars}.")
     75 if vars_with_empty_grads:
     76   logging.warning(
     77       ("Gradients do not exist for variables %s when minimizing the loss. "
     78        "If you're using `model.compile()`, did you forget to provide a `loss`"
     79        "argument?"),
     80       ([v.name for v in vars_with_empty_grads]))

ValueError: No gradients provided for any variable: (['Variable:0', 'Variable:0', 'Variable:0', 'Variable:0', 'Variable:0', 'Variable:0'],). Provided `grads_and_vars` is ((None, <tf.Variable 'Variable:0' shape=(784, 256) dtype=float32, numpy=
array([[-0.2042245 ,  1.0065362 ,  0.79206324, ..., -0.889144  ,
        -0.6301114 , -0.9690762 ],
       [ 0.19671327,  0.89678144, -0.0324002 , ...,  2.0764246 ,
        -0.02647609, -0.8672084 ],
       [ 0.07031541,  0.4843207 ,  0.08144156, ..., -0.3354637 ,
         1.2510766 , -0.6774577 ],
       ...,
       [-0.63975966,  0.19986708, -0.9221592 , ...,  1.3540815 ,
        -0.9916273 ,  0.7312357 ],
       [ 0.41351947,  0.43665868,  0.1957417 , ..., -1.7249284 ,
         0.14709948,  1.1250186 ],
       [ 0.48159713,  0.04631708, -0.1402344 , ..., -0.370907  ,
         0.19523837,  0.8853921 ]], dtype=float32)>), (None, <tf.Variable 'Variable:0' shape=(256, 256) dtype=float32, numpy=
array([[-0.32486504,  0.8220085 , -0.23714782, ..., -0.62537277,
         1.0147599 ,  0.5973364 ],
       [ 1.308589  , -0.27249494,  0.65963596, ..., -0.4579711 ,
        ...............................

after running this just simply provide variable 0 for all and not minimizes the cost and returns the randomly assigned values to the weights and variables

How to fix it?

Solution

You are not recording gradient, since you are calculating the prediction "before hand", instead you want to allow the optimizer to "record" the operations, in other words, you want to compute the prediction inside the "loss" lambda that you are passing to the optimizer:

loss = lambda : tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(
        logits= ForwardPropagation(x_train_modified,weights,biases) , 
        labels = y_train_onehot))

also, consider that in your code you are referring to a y variable that you have never defined, you probably meant y_train_onehot (which I’ve used in the above snipped)

the reason why this happens, is clearly explained in the minimize doc: https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Optimizer#minimize

Answered By – Alberto Sinigaglia

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published