Как получить доступ к частным производным продукции по отношению к входам в модели глубокого обучения? - PullRequest
0 голосов
/ 14 марта 2019

Я хочу создать свою собственную функцию потерь в кератах, которая содержит производные.Например,

def my_loss(x):
    def y_loss(y_true,y_pred):
        res = K.gradients(y_pred,x)
        return res
    return y_loss

определено, а

model = Sequential()
model.add(Dense(10, input_dim=2, activation='sigmoid'))
model.add(Dense(1, activation='linear'))
model_loss = my_loss(x=model.input)
model.compile(loss=model_loss, optimizer='adam')

Теперь, поскольку вход двумерный,

K.gradients(y_pred,x)

должен быть двумернымвектор.Тем не менее, я не знаю, как получить каждый скаляр в градиентах.В конечном итоге я хочу получить все вторые производные y_pred по x.Есть ли удобный способ получить это?


Это похоже на этот пост, но этот пост разделил двумерные переменные на две одномерные переменные.Есть ли другой способ получить градиенты без разделения входных данных?

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Если вы хотите лапласиан, почему бы не использовать tf.hessians, у которого есть все вторые производные?Лапласиан должен равняться следу гессенской матрицы (по тождеству)

https://www.tensorflow.org/api_docs/python/tf/hessians

0 голосов
/ 23 марта 2019

К сожалению, у Кераса нет удобного способа получить каждый компонент градиента.Поэтому я использовал тензор потока для решения этой проблемы.

если f, если функция объекта с переменной x = (x1, x2)

X=tf.placeholder(tf.float32,shape=(None,2))
f=f(X)#assume it is defined'

, то df / dx_1 равно

tf.gradients(f,x)[0][:,0]

df / dx_2 равно

tf.gradients(f,x)[0][:,1]

d ^ 2f / dx_1 ^ 2 равно

tf.gradietns(tf.gradients(f,x))[0][:,0]

d ^ 2f / dx_2 ^ 2 равно

tf.gradietns(tf.gradients(f,x))[0][:,1]

d ^ 2f / dx_1dx_2 - это

tf.gradietns(tf.gradients(f,x)[0][:,0])[0][:,1]

Я верю, что есть лучший способ, но я не могу найти.

...