使用Lambda层作为输出时如何获得关于参数的渐变

弗里克·德·哈斯

我正在尝试使用一个可以表示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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Keras Lambda 层,如何使用多个参数

如何获得作为数组工作的存储过程输出参数?

关于Softmax函数作为预测中的输出层

如何使用lambda作为默认参数?

如何使用 mongodb 在 lambda 函数中获得组合输出?

使用 lambda 作为参数时无法转换模板

如何使用... spread获得作为函数中参数的函数的“返回”?

Google关于将输入/输出参数作为指针的样式指南

如何使用 powershell 命令的输出作为 Azure 管道中的参数?

如何使用外部命令的输出作为tabnew的参数?

如何获取使用lambda作为参数发送的属性的名称

如何在Python中使用Lambda作为日期时间参数

如何在argargse中使用lambda作为参数?

在使用forEach作为对象时如何获得对象?

已经使用 FLOOR 获得结果时如何输出为小数?

如何获得0作为计数输出?

如何获得matplotlib图的输出作为SVG?

如何获得参数对象的子集?(关于大小可变的参数)

RNN的输出层的渐变是否应该削减?

如何在Tensorflow中获得LSTM的密集层输出?

Keras,如何获得每一层的输出?

使用 copyIndex 时如何获取 ResourceId 作为 VM 的输出

Lambda层没有要传播的渐变

如何使用 Keras 创建侧输出层?

如何使用BOTO 3将AWS lambda 1输出作为lambda 2的输入传递

如何在Keras中使用Lambda层?

swift如何在构造struct时使用enum作为参数?

在Java中使用命令行参数时无法获得正确的输出

For循环使用递归调用的输出作为参数