我正在尝试使用一个可以表示PDE解决方案的隐层实现神经网络(比方说拉普拉斯方程式)。因此,目标函数取决于神经网络及其输入的梯度。
现在,我已经使用Lambda层实现了二阶导数的计算。但是,当我尝试计算相对于模型参数的输出梯度时,会出现错误。
def grad(y, x, nameit):
return Lambda(lambda z: K.gradients(z[0], z[1]), output_shape = [1], name = nameit)([y,x])
def network(i):
m = Dense(100, activation='sigmoid')(i)
j = Dense(1, name="networkout")(m)
return j
x1 = Input(shape=(1,))
a = network(x1)
b = grad(a, x1, "dudx1")
c = grad(b, x1, "dudx11")
model = Model(inputs = [x1], outputs=[c])
model.compile(optimizer='rmsprop',
loss='mean_squared_error',
metrics=['accuracy'])
x1_data = np.random.random((20, 1))
labels = np.zeros((20,1))
model.fit(x1_data,labels)
这是错误:
ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
为什么Keras无法使用可训练的参数来计算梯度?
问题出在networkout
层上。它保持线性激活,防止梯度穿过它,因此返回“无”梯度错误。在这种情况下,您需要向networkout
图层添加除线性以外的任何激活函数。
def network(i):
m = layers.Dense(100)(i)
j = layers.Dense(1, name="networkout", activation='relu')(m)
return j
但是,上一层可以具有线性激活。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句