Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何控制Keras中的微分链规则_Python_Tensorflow_Keras - Fatal编程技术网

Python 如何控制Keras中的微分链规则

Python 如何控制Keras中的微分链规则,python,tensorflow,keras,Python,Tensorflow,Keras,我有一个在keras中有一些层的卷积神经网络。该网络中的最后一层是一个自定义层,负责对该层从上一层获得的一些数字进行排序,然后,将自定义层的输出发送到计算损耗函数 为此(排序)我在该层中使用了一些操作符,例如K.argmax和K.gather 在反向传播阶段,我从keras那里得到的错误是: 对于渐变,操作具有None。请确保所有操作都定义了梯度(即可微)。无梯度的普通操作:K.argmax、K.round、K.eval 这是合理的导致该层参与衍生过程 考虑到我的自定义层不需要符合差分链规则,我

我有一个在keras中有一些层的卷积神经网络。该网络中的最后一层是一个自定义层,负责对该层从上一层获得的一些数字进行排序,然后,将自定义层的输出发送到计算损耗函数

为此(排序)我在该层中使用了一些操作符,例如K.argmax和K.gather

在反向传播阶段,我从keras那里得到的错误是:

对于渐变,操作具有
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时,这个梯度不会在权重上更新。如果你想在这个层之前更新权重,就不可能使用这个层。