【问题标题】:How to make a customized tf.nn.conv2d() of TensorFlow?如何定制 TensorFlow 的 tf.nn.conv2d()?
【发布时间】:2018-06-06 17:11:09
【问题描述】:

与现有的 conv2d() 几乎相同,但我想为其添加一个特殊功能。

假设我们有一个形状为 5x5 的过滤器和一个形状为 100x100 的输入。

据我了解,conv2d() 内部会:

  1. 从整个输入中选择一个 5x5 的输入区域。
  2. 计算 5x5 输入区域和过滤器之间的卷积。
  3. 以给定的步幅移动到下一个输入区域。

相比之下,customized_conv2d() 内部想做:

  1. 从整个输入中选择一个 5x5 的输入区域。 (相同)
  2. 从 5x5 输入区域中的每个值中减去 f(5x5 输入区域) 的标量值。 (添加)
  3. 计算 5x5 输入区域和过滤器的减去值之间的卷积。 (相同)
  4. 以给定的步幅移动到下一个输入区域。 (相同)

其中 f(x) 是 (max(x) + min(x)) / 2

  • 制作容易吗?
  • 自定义代码能否在 GPU 上运行?

浏览了nn_ops.py、gen_nn_ops.py、nn_ops.cc的相关源码,特来请教。

提前致谢!

附加:

到目前为止我学到了什么:

1) 在 CPU 上运行的最简单方法可能是定制 TensorFlow。尽可能少地调整tensorflow/core/kernels/conv_ops.cctensorflow/core/kernels/deep_conv2d.cc。使用这种特殊的 TensorFlow,conv2d() 会以所需的方式运行,而不是原来的方式。在这种情况下,通过复制相关行并将所有函数/方法从 python 包装器重命名为 c++ 代码来添加新的操作,例如customized_conv2d() 可能是过度的努力。

2) 通过 CUDA 在 GPU 上运行没有希望。看来 TensorFlow 的 conv2d() 最终调用了 NVIDIA CUDA 深度神经网络库 (cuDNN) 中的cudnnConvolutionForward()。 conv2d() 的主要部分在这个库中完成。 Software License Agreement (SLA) for NVIDIA cuDNN 不允许逆向工程或修改。没有提供该库的源代码。

3) 不过,通过 OpenCL 在 GPU 上运行可能还有另一种希望。

【问题讨论】:

  • 所以基本上你想在进行卷积之前减去一个标量值,对吗?如果是这样,你必须编写一个新的 conv2d,我认为这很容易。你只需要做你之前描述的。但是,我不希望它会像原始卷积一样快,因为据我所知它是用 C 编码的,而 python 只是一个包装器。如果您制作此自定义卷积函数并且希望使其与原始卷积函数一样快(我想这就是您询问 GPU 的原因),则需要更多时间。
  • @kuonb,你说得对!谢谢!
  • @WendingPeng,谢谢你的链接。这会立即对整个输入值应用归一化,而我们在这里要做的是对当前小的移动 5x5 补丁区域应用归一化。下次我会关注你的cmets。再次感谢您。

标签: python tensorflow neural-network conv-neural-network convolution


【解决方案1】:

由于卷积本身是线性的,因此可以通过先通过tf.nn.conv2d 进行卷积然后再进行该操作来插入任何线性操作。

每个5x5补丁上的(max(x) + min(x)) / 2可以通过(tf.nn.max_pool(x) - tf.nn.max_pool(-x)) * 0.5实现。要在 conv 之后减去这个,您还需要将结果乘以相应的卷积核之和。之后,您可以应用非线性激活函数。

但是,一般来说,我不知道如何有效地添加非线性操作,例如在卷积乘法之前获取每个 5x5 补丁的 z 分数。也许其他答案可以提供一些见解。

【讨论】:

  • 太棒了! (a) 使用max_pool,内核大小为 5x5,步幅值为 (1, 1),填充相同产生 f(x)。 (b)avg_pool 应用于具有相同参数的过滤器乘以 5 x 5 会产生过滤器的 5x5 补丁的总和。 (c) 将 (a) 和 (b) 逐个元素相乘得出我们应该减去多少。最后,从conv2d 的输出中减去 (c)。我在正确的轨道上吗?
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 2016-04-09
  • 2019-05-01
  • 2019-09-18
  • 2017-08-04
  • 2016-11-01
  • 2018-07-20
  • 1970-01-01
相关资源
最近更新 更多