【发布时间】:2018-06-06 17:11:09
【问题描述】:
与现有的 conv2d() 几乎相同,但我想为其添加一个特殊功能。
假设我们有一个形状为 5x5 的过滤器和一个形状为 100x100 的输入。
据我了解,conv2d() 内部会:
- 从整个输入中选择一个 5x5 的输入区域。
- 计算 5x5 输入区域和过滤器之间的卷积。
- 以给定的步幅移动到下一个输入区域。
相比之下,customized_conv2d() 内部想做:
- 从整个输入中选择一个 5x5 的输入区域。 (相同)
- 从 5x5 输入区域中的每个值中减去 f(5x5 输入区域) 的标量值。 (添加)
- 计算 5x5 输入区域和过滤器的减去值之间的卷积。 (相同)
- 以给定的步幅移动到下一个输入区域。 (相同)
其中 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.cc 和tensorflow/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