如何制作TensorFlow的自定义tf.nn.conv2d()?

问题描述 投票:2回答:1

几乎与现有的conv2d()相同,但我想为它添加一个特殊的函数。

假设我们的形状为5x5滤镜,形状为100x100输入。

根据我的理解,conv2d()内部会:

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

相比之下,custom_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 ++代码来添加新的op(例如customized_conv2d())在这种情况下可能会过度努力。

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

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

python tensorflow neural-network conv-neural-network convolution
1个回答
3
投票

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

每个(max(x) + min(x)) / 2补丁上的5x5可以通过(tf.nn.max_pool(x) - tf.nn.max_pool(-x)) * 0.5实现。要在conv之后减去此值,您还需要通过卷积内核的相应总和对结果进行多次处理。之后,您可以应用非线性激活功能。

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

© www.soinside.com 2019 - 2024. All rights reserved.