Python 如何控制Keras中的微分链规则
我有一个在keras中有一些层的卷积神经网络。该网络中的最后一层是一个自定义层,负责对该层从上一层获得的一些数字进行排序,然后,将自定义层的输出发送到计算损耗函数 为此(排序)我在该层中使用了一些操作符,例如K.argmax和K.gather 在反向传播阶段,我从keras那里得到的错误是: 对于渐变,操作具有Python 如何控制Keras中的微分链规则,python,tensorflow,keras,Python,Tensorflow,Keras,我有一个在keras中有一些层的卷积神经网络。该网络中的最后一层是一个自定义层,负责对该层从上一层获得的一些数字进行排序,然后,将自定义层的输出发送到计算损耗函数 为此(排序)我在该层中使用了一些操作符,例如K.argmax和K.gather 在反向传播阶段,我从keras那里得到的错误是: 对于渐变,操作具有None。请确保所有操作都定义了梯度(即可微)。无梯度的普通操作:K.argmax、K.round、K.eval 这是合理的导致该层参与衍生过程 考虑到我的自定义层不需要符合差分链规则,我
None
。请确保所有操作都定义了梯度(即可微)。无梯度的普通操作:K.argmax、K.round、K.eval
这是合理的导致该层参与衍生过程
考虑到我的自定义层不需要符合差分链规则,我如何控制keras中的差分链?我可以在自定义层中禁用此过程吗
我在代码中使用的重新排序层如下所示:
def Reorder(args):
z = args[0]
l = args[1]
index = K.tf.argmax(l, axis=1)
return K.tf.gather(z, index)
Reorder_Layer = Lambda(Reorder, name='out_x')
pred_x = Reorder_Layer([z, op])
有几件事:
- 没有导数是不可能训练的,所以,如果你想训练这个模型,就没有解决方案
- 如果您只打算进行预测,则无需“编译”,因此不需要自定义派生规则
l
是由模型使用前面的可训练层计算的
如果你真的想试试这个,这似乎不是个好主意,你可以试试
l=keras.backend.stop\u gradient(args[1])
。但这意味着从l
到模型开始,绝对不会进行任何训练。如果这不起作用,那么在编译模型之前,您必须使生成l
的所有层都具有trainable=False
谢谢你的回答。我想跳过这一层,以便在衍生过程中合并,因为这一层在反向传播中没有更新的权重。该层作为包装器进行操作,执行一些不需要学习如何执行该过程的操作(例如排序)。我将其定义为模型中的一个层,或者我必须做其他事情,这是个好主意吗?有什么想法吗?关于trainable=false,我认为这不能解决我的问题,因为不管trainable=false与否,梯度都会被计算出来,但是当trainable=false时,这个梯度不会在权重上更新。如果你想在这个层之前更新权重,就不可能使用这个层。