user1691278
user1691278

Reputation: 1885

Keras: using the sum of the first and second derivatives of a model as final output

Suppose that I created this model using Keras:

model = Sequential()
model.add(Dense(32, activation='tanh', input_dim=1))
model.add(Dense(10, activation='tanh'))
model.add(Dense(1, activation='linear'))

The input and output dimensions of this model are both 1. Now, suppose I want to add one more layer, which is the sum of the first derivative and second derivative (with respect to the input) of the model above, and use it as my new output layer. Is that possible in Keras? I did quite a lot of Googling but couldn't find anything.

Upvotes: 3

Views: 514

Answers (1)

Amir
Amir

Reputation: 16587

You can calculate gradient in Tensorflow with tf.gradients and in Keras with K.gradients:

first = K.gradients(model.outputs, model.inputs)
second = K.gradients(first, model.inputs)

Here is the code that calculates the gradient in your model:

from tensorflow.python.keras import Model, Input
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.layers import Dense, Lambda

def deriative(inps):
    i, o = inps[0], inps[1]
    grad1 = K.gradients(o, i)[0]
    grad2 = K.gradients(grad1, i)[0]
    return K.concatenate([grad1, grad2])


inps = Input(shape=(1,))
dense1 = Dense(32, activation='tanh')(inps)
dense2 = Dense(10, activation='tanh')(dense1)
dense3 = Dense(1, activation='linear')(dense2)

output = Lambda(deriative)([inps, dense3])

new_model = Model(inputs=inps, outputs=output)
new_model.compile('adam', 'mse')
print(new_model.summary())

Upvotes: 4

Related Questions