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
Tensorflow keras反向传播中的跳层_Tensorflow_Keras_Keras Layer - Fatal编程技术网

Tensorflow keras反向传播中的跳层

Tensorflow keras反向传播中的跳层,tensorflow,keras,keras-layer,Tensorflow,Keras,Keras Layer,我正在将Keras与tensorflow后端一起使用,我很好奇是否可以在反向传播过程中跳过一层,但让它在正向传递中执行。这就是我的意思 Lambda (lambda x: a(x)) 我想在向前传球时将a应用于x,但我不想在后推时将a包括在推导中 我试图找到一个解决办法,但什么也找不到。有人能帮我吗?更新2 除此之外,现在还有一个 更新 请参阅,以获取纯粹在Python中编写带有渐变的自定义op的示例,无需重建任何内容。请注意,该方法有一些限制(请参阅的文档) 这不完全是一个问题的解决方案

我正在将Keras与tensorflow后端一起使用,我很好奇是否可以在反向传播过程中跳过一层,但让它在正向传递中执行。这就是我的意思

Lambda (lambda x: a(x))
我想在向前传球时将
a
应用于
x
,但我不想在后推时将a包括在推导中

我试图找到一个解决办法,但什么也找不到。有人能帮我吗?

更新2

除此之外,现在还有一个


更新

请参阅,以获取纯粹在Python中编写带有渐变的自定义op的示例,无需重建任何内容。请注意,该方法有一些限制(请参阅的文档)


这不完全是一个问题的解决方案,但仍然是一个答案,太长的评论

这甚至不是Keras问题,而是TensorFlow问题。每个op定义其在反向传播期间使用的梯度计算。如果你真的想这样做,你需要自己将op实现到TensorFlow中(这不是一件容易的事),并定义你想要的梯度-因为你不能有“无梯度”,如果有任何东西,它将是1或0(否则你不能继续反向传播)。TensorFlow中有一个函数会导致op传播零,但我认为它并不意味着/可以在TensorFlow自身的内部使用

更新

好的,再多了解一下上下文。张量流图由ops构成,ops由内核实现;这基本上是一个1对1的映射,除了可能有一个CPU和一个GPU内核作为一个op,因此有区别。TensorFlow支持的ops集通常是静态的,我的意思是它可以随新版本而更改,但原则上您不能添加自己的ops,因为图形的ops采用Protobuf序列化格式,因此如果您创建了自己的ops,那么您将无法共享图形。OPS然后用C++宏定义为“代码< > RealStEdOP”,并且内核用“代码> RealStasKNelnBuugReule/COD> >(参见例如)。 现在,梯度在哪里发挥作用?有趣的是,OP的梯度不是在C++级别定义的;有些操作(和内核)实现了其他操作的渐变(如果您查看以前的文件,您会发现名称以
Grad
结尾的操作/内核),但是(据我所知),这些操作在这个级别上没有显式“链接”。OPS和它们的梯度之间的关联似乎在Python中定义,通常通过或前述(例如,从代码< GEnY开始的Python模块是在C++宏的帮助下自动生成的);这些注册通知反向传播算法如何计算图的梯度

那么,如何真正解决这个问题呢?那么,你需要在C++中创建至少一个OP,其中相应的内核/ S实现你想要的转发计算。然后,如果您想要使用的梯度计算可以用现有的TensorFlow ops表示(这是最有可能的),那么您只需要调用Python并在“标准”TensorFlow中进行计算。这相当复杂,但好消息是这是可能的,甚至还有一个(尽管我认为他们有点忘记了其中的梯度注册部分)!正如您将看到的,这个过程涉及到将新的操作代码编译到一个库中(顺便说一句,我不确定其中任何一个是否可以在Windows上运行),然后从Python加载该库(显然这涉及到使用的痛苦过程)。一个可能更现实的例子可以在中找到,TensorFlow的一个扩展用于结构化数据,它通过一个定义为调用
register\u OP
的宏注册(作为一个)一个自定义操作,然后在Python中,它加载库并通过自己定义的注册函数注册梯度,该注册函数只调用(英文的另一个名字)


tldr:这很难,但可以做到,甚至还有几个例子。

正如@jdehesa的评论中提到的。你可以用“替代梯度”实现你的函数。如果我的数学不正确,请原谅,但我认为导数返回“1”正确的方法是在学习过程中不影响反向传播。有关如何构造它,请参阅。我引用的示例更进一步,允许您从python函数构造激活函数。因此,代替尖头函数,替换您的函数他的派生词
d_spiky
替换为

def constant(x):
       return 1
因此,在向前传球时,
a
应用于该层,向后传球
1
应用于该层,只需通过重量调整即可


然后,您可以使用此功能在Keras中创建一个激活层。

是否要冻结它(=不更新该特定层的权重)?否。假设a(x)=1/(1+e^x).然后在前向传递中,我想推动x通过sigmoid函数,但在后向传播中,我不想包括sigmoidSorry的导数,这对你没有帮助…我真的不明白推导另一个函数的目的,而不是你想最小化的函数?后向传递失去了它的目的,你算出了吗?我需要同样的函数功能。你能展示你的解决方案吗?谢谢你的回答。如果你想用一个不可微函数计算前向传递,然后用一个非常相似但可微的函数进行反向传播,这是有意义的,我们会看到的。你能给我一个链接,他们描述了如何实现op并将其嵌入到Keras中吗图层?@DalekSupreme哦,我明白了,所以它不是“删除”梯度,而是用“替代”计算替换它,好的,是的,这是有意义的。我会