How to modify cost functions by weight gradient variance in keras?

Viewed 26

I am writing a neural network in keras. I want to modify the loss function so that I can use the array (in the shape of a gradient array) of parameters as additional tool to modify the cost function.

To be precise, I'd like to use the variance of the gradients from past training. Parameters that have a high gradient variance - let's call it h, are assumed to be parameters that hold the features.

I would like the cost function to use parameters whose h value is as small as possible when training new features - for this I have to modify the cost functions for the parameter like this:

Loss (parameter) = Standard_loss (y, y_pred) + h * (parameter - old parameter) ** 2

I would very much like to ask for an answer. Here is an excerpt from my code:

from keras import models 
from keras.datasets import mnist 
import tensorflow as tf 
import matplotlib.pyplot as plt 
from keras import backend as K

#I import CIFAR 10 dataset  
from tensorflow.keras.datasets import cifar10
from keras.utils.np_utils import to_categorical   

train_y = to_categorical(train_y, num_classes=10, dtype='float32')
test_y = to_categorical(test_y, num_classes=10, dtype='float32')
train_X = K.cast(train_X, dtype='float32')
test_X = K.cast(test_X, dtype='float32')

def get_model():
    model = models.Sequential()

    model.add(layers.Conv2D(1, 5, (1,1), input_shape=(32,32,3,), padding='same'))
    model.add(layers.MaxPooling2D())
    model.add(layers.ReLU())

    model.add(layers.Conv2D(4, 5, (2,2), padding='same'))
    model.add(layers.MaxPooling2D())
    model.add(layers.ReLU())
    model.add(layers.Flatten())
    model.add(layers.Dense(128, activation='sigmoid'))
    model.add(layers.Dense(10, activation='linear'))
    model.add(layers.Softmax())
    print(model.summary())
    return model

model = get_model()
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(train_X, train_y, epochs=50, validation_split=0.2)

weights = model.get_weights()

Unfortunately, I don't know how to take the gradient from the weights :/

I want get a gradient table for each parameter for a single training example. I do not mean the total gradient of the cost function as mentioned elsewhere on the internet.

From what I can see, the cost function is modifiable, but it only takes y_pred and y_true. How could I input something that corresponds to the weights (but it is not a weight)?

Thanks in advance!

0 Answers
Related