gpt4 book ai didi

tensorflow - 在keras的反向传播中跳过层

转载 作者:行者123 更新时间:2023-12-04 20:32:25 26 4
gpt4 key购买 nike

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

Lambda (lambda x: a(x))

我要申请 ax在前向传递中,但我不希望在反向传播发生时将 a 包含在推导中。

我试图找到一个解决方案,但我找不到任何东西。有人可以帮我吗?

最佳答案

更新 2

除了 tf.py_func 之外,现在还有一个 official guide on how to add a custom op

更新

请参阅 this question 以获取纯粹在 Python 中编写具有渐变的自定义操作的示例,而无需重新构建任何内容。请注意,该方法有一些限制(请参阅 tf.py_func 的文档)。

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

这甚至不是 Keras 的问题,而是 TensorFlow 的问题。每个操作都定义了在反向传播期间使用的自己的梯度计算。我你真的想要这样的东西,你需要自己实现 TensorFlow 中的操作(不容易的壮举)并定义你想要的渐变 - 因为你不能有“没有渐变”,如果有的话,它会是 1 或0(否则你不能继续反向传播)。 TensorFlow 中有一个 tf.NoGradient 函数,它会导致操作传播零,但我不认为它意味着/可以在 TensorFlow 自己的内部结构之外使用。

更新

好的,更多的上下文。 TensorFlow 图由 ops 构建,由内核实现;这基本上是一个 1 对 1 的映射,除了一个操作可能有一个 CPU 和一个 GPU 内核,因此有区别。 TensorFlow 支持的操作集通常是静态的,我的意思是它可以随着更新的版本而改变,但原则上你不能添加自己的操作,因为图形的操作进入 Protobuf 序列化格式,所以如果你自己制作操作那么您将无法共享您的图表。然后在 C++ 级别使用宏 REGISTER_OP 定义操作(例如参见 here ),使用 REGISTER_KERNEL_BUILDER 定义内核(例如参见 here )。

现在,渐变在哪里发挥作用?好吧,有趣的是操作的梯度不是在 C++ 级别定义的;有些操作(和内核)实现了其他操作的渐变(如果您查看以前的文件,您会发现名称以 Grad 结尾的操作/内核),但是(据我所知)这些不是在此级别上明确“链接”。似乎操作与其梯度之间的关联是在 Python 中定义的,通常通过 tf.RegisterGradient 或前面提到的 tf.NoGradient (参见例如 here ,以 gen_ 开头的 Python 模块是在 C++ 宏的帮助下自动生成的);这些注册告知反向传播算法如何计算图的梯度。

那么,如何实际解决这个问题呢?好吧,您需要在 C++ 中创建至少一个操作,并使用相应的内核实现您想要用于前向传递的计算。然后,如果您想要使用的梯度计算可以用现有的 TensorFlow 操作(最有可能)表示,您只需要在 Python 中调用 tf.RegisterGradient 并在“标准”TensorFlow 中进行计算。这很复杂,但好消息是它是可能的,甚至还有一个 example (尽管我认为他们有点忘记了梯度注册部分)!正如您将看到的,该过程涉及将新的操作代码编译到一个库中(顺便说一句,我不确定这是否可以在 Windows 上运行),然后从 Python 加载(显然这涉及经历 manual compilation of TensorFlow 的痛苦过程) Bazel)。一个可能更现实的例子可以在 TensorFlow Fold 中找到,它是结构化数据的 TensorFlow 扩展,它通过调用 REGISTER_OP 的宏定义的 here 注册(作为一个)一个自定义操作 here ,然后在 Python 中加载库并注册其梯度here 通过自己定义的注册函数 here 简单地调用 tf.NotDifferentiable ( tf.NoGradient 的另一个名字)

tldr:这相当困难,但可以做到,甚至有几个例子。

关于tensorflow - 在keras的反向传播中跳过层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43277461/

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