【发布时间】:2018-04-26 09:56:55
【问题描述】:
假设我有一个二元函数,例如:z = x^2 + y^2。 I learned 在 Keras 上我可以使用 Lambda 层计算 n 阶导数:
def bivariate_function(x, y):
x2 = Lambda(lambda u: K.pow(u,2))(x)
y3 = Lambda(lambda u: K.pow(u,2))(y)
return Add()([x2,y3])
def derivative(y,x):
return Lambda(lambda u: K.gradients(u[0],u[1]))([y,x])
f = bivariate_function(x,y)
df_dx = grad(f,x) # 1st derivative wrt to x
df_dy = grad(f,y) # 1st derivative wrt to y
df_dx2 = grad(df_dx,x) # 2nd derivative wrt to x
df_dy2 = grad(df_dy,y) # 2nd derivative wrt to y
但是,如何将这种方法应用于损失函数中输入的 NN 输出导数?我不能(?)只是简单地将两个输入输入到密集层(如上面创建的那些)。
例如,尝试使用 Input(shape=(2,)) 将第一个变量的一阶导数和第二个变量的二阶导数的总和用作损失(即 d/dx+d²/dy²),我设法到达这里:
import tensorflow as tf
from keras.models import *
from keras.layers import *
from keras import backend as K
def grad(f, x):
return Lambda(lambda u: K.gradients(u[0], u[1]), output_shape=[2])([f, x])
def custom_loss(input_tensor,output_tensor):
def loss(y_true, y_pred):
df1 = grad(output_tensor,input_tensor)
df2 = grad(df1,input_tensor)
df = tf.add(df1[0,0],df2[0,1])
return df
return loss
input_tensor = Input(shape=(2,))
hidden_layer = Dense(100, activation='relu')(input_tensor)
output_tensor = Dense(1, activation='softplus')(hidden_layer)
model = Model(input_tensor, output_tensor)
model.compile(loss=custom_loss(input_tensor,output_tensor), optimizer='sgd')
xy = np.mgrid[-3.0:3.0:0.1, -3.0:3.0:0.1].reshape(2,-1).T
model.fit(x=xy,y=xy, batch_size=10, epochs=100, verbose=2)
但感觉就像我没有以正确的方式做这件事。更糟糕的是,在第一个时代之后,我得到的只是nan's。
【问题讨论】:
-
无法运行您的代码。您将
grad()函数重命名为derivative(),但调用仍为grad()。另外,您如何从input_tensor获得x。能否请您发布一个可运行的一体式代码,我只需复制粘贴即可查看发生了什么? -
@PeterSzoldan 刚刚用一个有效的 sn-p 进行了编辑!感谢您的帮助!
标签: python tensorflow neural-network keras