keras中反向传播的跳过层

2024-03-04

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

Lambda (lambda x: a(x))

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

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


UPDATE 2

此外tf.py_func https://www.tensorflow.org/api_docs/python/tf/py_func,现在有一个有关如何添加自定义操作的官方指南 https://www.tensorflow.org/extend/adding_an_op.


UPDATE

See 这个问题 https://stackoverflow.com/questions/39048984/tensorflow-how-to-write-op-with-gradient-in-python有关纯粹用 Python 编写带有渐变的自定义操作而不需要重建任何内容的示例。请注意,该方法有一些限制(请参阅文档tf.py_func https://www.tensorflow.org/api_docs/python/tf/py_func).


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

这甚至不是 Keras 问题,而是 TensorFlow 问题。每个操作都定义了自己的梯度计算,该计算在反向传播过程中使用。你我really想要类似的东西,你需要自己将操作实现到 TensorFlow 中(这不是一件容易的事)并定义你想要的梯度 - 因为你不能有“无梯度”,如果有的话它会是 1 或 0 (否则你不能继续反向传播)。有一个tf.NoGradient https://www.tensorflow.org/api_docs/python/tf/NoGradientTensorFlow 中的函数会导致操作传播零,但我不认为它意味着/可以在 TensorFlow 自己的内部结构之外使用。

UPDATE

好的,更多一点背景信息。 TensorFlow 图是由以下内容构建的ops,它们是由kernels;这基本上是一个 1 对 1 的映射,除了一个操作可能有一个 CPU 和一个 GPU 内核,因此存在差异。 TensorFlow支持的操作集通常是静态的,我的意思是它可以随着新版本的变化而改变,但原则上你不能添加自己的操作,因为图的操作进入Protobuf序列化格式,所以如果你制作了自己的操作那么您将无法共享您的图表。然后使用宏在 C++ 级别定义操作REGISTER_OP(例如参见here https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/ops/nn_ops.cc),以及内核REGISTER_KERNEL_BUILDER(例如参见here https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/conv_ops_fused.cc).

现在,渐变在哪里发挥作用?有趣的是,op 的梯度不是在 C++ 级别定义的;那里are实现其他操作梯度的操作(和内核)(如果您查看之前的文件,您会发现名称以结尾的操作/内核Grad),但是(据我所知)这些在这个级别上没有明确的“链接”。操作和梯度之间的关联似乎是在 Python 中定义的,通常通过tf.RegisterGradient https://www.tensorflow.org/api_docs/python/tf/RegisterGradient或前述的tf.NoGradient https://www.tensorflow.org/api_docs/python/tf/NoGradient(例如参见here https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/nn_grad.py, Python 模块开头gen_在 C++ 宏的帮助下自动生成);这些注册告知反向传播算法如何计算图的梯度。

那么,如何实际解决这个问题呢?那么,您需要在 C++ 中创建至少一个操作,并使用相应的内核来实现您的前向传递所需的计算。然后,如果您想要使用的梯度计算可以用现有的 TensorFlow 操作来表达(这是最有可能的),您只需要调用tf.RegisterGradient https://www.tensorflow.org/api_docs/python/tf/RegisterGradient在 Python 中并在“标准”TensorFlow 中进行计算。这相当复杂,但好消息是possible,甚至还有一个example https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/adding_an_op为此(尽管我认为他们有点忘记了其中的梯度注册部分)!正如您将看到的,该过程涉及将新的操作代码编译到一个库中(顺便说一句,我不确定其中是否可以在 Windows 上运行),然后从 Python 加载该库(显然这涉及到经历以下痛苦的过程)手动编译TensorFlow https://www.tensorflow.org/install/install_sources with Bazel https://bazel.build)。一个可能更现实的例子可以在TensorFlow 折叠 https://github.com/tensorflow/fold,TensorFlow 的扩展,适用于结构化数据,可注册(从一个)一个自定义操作here https://github.com/tensorflow/fold/blob/master/tensorflow_fold/loom/deserializing_weaver_op.cc通过宏定义here https://github.com/tensorflow/fold/blob/master/tensorflow_fold/loom/weaver_op_base.h那个叫REGISTER_OP,然后在 Python 中加载库并注册其梯度here https://github.com/tensorflow/fold/blob/master/tensorflow_fold/loom/deserializing_weaver_op.py通过自己定义的注册函数here https://github.com/tensorflow/fold/blob/master/tensorflow_fold/loom/weaver_op_base.py这只是调用tf.NotDifferentiable https://www.tensorflow.org/api_docs/python/tf/NoGradient(另一个名称为tf.NoGradient https://www.tensorflow.org/api_docs/python/tf/NoGradient)

tldr:这相当困难,但它can已经完成了,甚至还有几个例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

keras中反向传播的跳过层 的相关文章

随机推荐

  • Cowplot 中的plot_clone 错误

    我正在尝试使用plot grid在包owplot中制作2x2图 我不断收到错误消息 plot clone plot 中的错误 尝试应用非函数 我不知道如何纠正这个问题 起初我不确定 copplot 是否只能处理 1x2 或 2x1 布局 类
  • vscode:打开文件而不是通过快速打开预览文件

    When I open up the Command Palette Ctrl or Cmd P type in a filename and hit Enter the file will automatically be opened
  • Android 上的 OpenGL 仅使用 C++ [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在为 Android 2 1 开发 Android 应用程序 我正在尝试仅使用 C 编写 Open
  • 使用“.”文本搜索值在搜索值中

    我收集了 200 万份文档 其中包含 20 个字段 有几个字段有 和 然后是一个唯一的文件名字段 Update 我已将 转换为 问题仍然存在 看来 造成了大部分问题 我认为索引器在点上分开 因此文件名被索引 扩展名被索引 但不是整个文件名
  • 如何在材料设计中更改操作栏菜单项文本颜色

    我正在尝试更新我的记事本应用程序以使用 Material Design 即使在较旧的设备上也是如此 到目前为止我做了什么 将库 appcompat v7 添加到我的项目中 以支持旧设备上的 Material Design 修改Android
  • Plone/Zope 的外部方法

    我有两个 Plone 实例在服务器上运行 它们的位置是 usr local Plone Inst1 和 usr local Plone Inst2 我正在尝试设置外部方法 但很难确定我的 扩展 文件夹应该放置在哪里 似乎无论我把它放在哪里
  • 如何使用CSS更改滚动条颜色[重复]

    这个问题在这里已经有答案了 我的jsfiddle在这里 http jsfiddle net sureshpattu Xck2A 我试图更改滚动条的颜色 但在这里它不起作用 Css flexcroll scrollbar face color
  • 什么是“参数相关查找”(又名 ADL 或“Koenig 查找”)?

    关于什么是参数依赖查找有哪些好的解释 许多人也将其称为 Koenig Lookup 我最好想知道 为什么这是一件好事 为什么这是一件坏事 它是如何工作的 柯尼希查找 or 参数相关查找 http en wikipedia org wiki
  • 如何在视图中多次正确使用同一个 AngularJS 1.5 组件?

    我正在使用 AngularJS 1 5 的新组件创建一组小部件 问题是 当多次使用同一个小部件时 它们会以某种方式共享控制器或范围 我认为组件的一件事是它们的范围是完全隔离的 我的主要 html 模板包含小部件
  • 应用内购买错误的恢复按钮

    我在应用程序中恢复应用内购买时遇到问题 我已经在我的项目中应用了这行代码 SKPaymentQueue defaultQueue addTransactionObserver self SKPaymentQueue defaultQueue
  • Jsp中如何设置输入框的值

  • Kubernetes 集群未将外部 IP 公开为

    这是我的 service yaml 代码 kind Service apiVersion v1 metadata name login spec selector app login ports protocol TCP name http
  • 像管理电子书一样管理 Android 应用程序中的文本

    我正在开发一个application它看起来像一个电子书阅读器 但它不完全是一个电子书阅读器 我有一篇很大的文章 分为不同的章节 现在我想将该文本呈现为一本书 用户应该感受到阅读电子书的感觉 该电子书将具有各种功能 例如GoTo 搜索 目录
  • 's' 附近的语法不正确。字符串 ')' 后面的未闭合引号

    我在编程方面有点菜鸟 我想知道我在这里做错了什么 有人可以帮助我吗 我正在制作一个控制台应用程序 在其中同步两个数据库 但是当我尝试将数据插入表中时 它会抛出此异常 代码是 public static void AddInterationP
  • 获取redis中lua中的当前日期和时间

    如何获取嵌入在 Redis 中的 Lua 中的当前日期 时间 我需要采用以下格式 YYYY MM DD HH MM SS 尝试使用 os date 但它无法识别它 Redis 的 Lua 沙盒只有少数库 并且os不是其中之一 你可以调用Re
  • 没有连接的 AMQP/RabbitMQ 通道什么时候会死亡?

    我有一个简单的 RabbitMQ 测试程序 随机将消息排队 另一个读取它们 所有这些都使用 Spring AMQP 如果消费者死亡 例如 在没有机会关闭其连接或通道的情况下终止进程 则它尚未确认的任何消息似乎将永远保持未确认状态 我看过很多
  • 在 Chrome 的 URL 栏中用 Javascript 设置文本框的值只是将该值写入屏幕

    我试图通过在网址栏中输入以下内容来将网页中文本框的值设置为特定值 javascript document getElementById textboxID value Value 然而 每当我这样做时 它只会返回一个空白屏幕 并在角落里写下
  • PhantomJS 出现 Selenium 错误:消息:“phantomjs”可执行文件需要位于 PATH 中

    我正在尝试运行这个脚本 https github com Chillee coursera dl all https github com Chillee coursera dl all 但是 该脚本在该行失败session webdriv
  • 调整窗口大小时,光滑的滑块没有响应

    我使用光滑滑块在 WordPress 中创建了一个图像滑块 我正在使用中心模式 我想要一张图像居中 每一侧都有一个稍微显示 但我有一些问题 首先 当我调整窗口滑动滑块的大小时 直到我与滑块交互时才计算新的图像宽度 这个问题在演示中不存在 其
  • keras中反向传播的跳过层

    我将 Keras 与张量流后端一起使用 我很好奇是否可以在反向传播期间跳过一层 但让它在前向传递中执行 这就是我的意思 Lambda lambda x a x 我要申请a to x在前向传递中 但我不希望在反向传播发生时将 a 包含在推导中