gpt4 book ai didi

python-3.x - 使用 Lambda 层作为输出时如何获得关于参数的梯度

转载 作者:行者123 更新时间:2023-12-02 04:24:56 24 4
gpt4 key购买 nike

我正在尝试实现一个具有一个隐藏层的神经网络,它可以表示 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 不能根据可训练参数计算梯度?<​​/p>

最佳答案

问题出在 networkout 层。它保持线性激活,防止梯度通过它,因此返回“无”梯度错误。在这种情况下,您需要将除线性之外的任何激活函数添加到 networkout 层。

def network(i):
m = layers.Dense(100)(i)
j = layers.Dense(1, name="networkout", activation='relu')(m)
return j

然而,前一层可以有一个线性激活。

关于python-3.x - 使用 Lambda 层作为输出时如何获得关于参数的梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com