几乎与现有的VAR2D()相同,但是我想给它添加一个特殊的函数。
假设我们有一个5x5过滤器和一个100x100输入的形状。
据我所知,conv2d()在内部会:
从整个输入中选择5x5输入区域。
计算5x5输入区域和滤波器之间的卷积。
以给定的速度移动到下一个输入区域。
相反,定制的_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++代码来添加一个新的op(如customized悻conv2d())可能会过于费力。
2)不希望通过CUDA在GPU上运行tensorflow的conv2d()似乎最终调用了nvidia-cuda-deep神经网络库(cudnn)中的cudnnConvolutionForward()。conv2d()的主要部分在此库中完成。Software License Agreement (SLA) for NVIDIA cuDNN不允许逆向工程或修改。未提供库的源代码。
3)不过,通过opencl在gpu上运行可能还有希望。
最佳答案
由于卷积本身是线性的,插入任何线性操作都可以通过先通过tf.nn.conv2d
卷积,然后通过该操作来完成。
每个(max(x) + min(x)) / 2
补丁上的5x5
可以通过(tf.nn.max_pool(x) - tf.nn.max_pool(-x)) * 0.5
实现。要在conv之后减去这个值,还需要将结果乘以相应的卷积核和。之后,你可以应用非线性激活函数。
但是,一般来说,我不知道如何有效地添加非线性运算,例如在卷积乘法之前获得每个5x5
块的z分数。或许其他的答案可以提供一些见解。