tensorflow - 修复 Keras/TensorFlow 卷积滤波器中的权重总和
问题描述
我在神经网络中有一个 2D 卷积过滤层(称为 7x7)。我想限制过滤器使其权重加起来为 0。(这是图像处理中卷积过滤器的常见要求 - 想法是过滤器对亮度的局部变化敏感,但对亮度的绝对水平不敏感亮度。)这或多或少相当于拥有一个 48 权重的层,其输入为 x[-3,-3]-x[0,0], x[-3,-2]-x[0,0] , ... x[3,3]-x[0,0]。
出于某种原因,我看不到任何本机功能可以施加此约束。
到目前为止我尝试过的事情:
不要强加约束。对收敛非常不利(不同的整体亮度水平会成为阻止网络收敛的巨大噪声源。)
为该层编写一个自定义正则化器:
例如
class FixSum(Regularizer):
def call(self, x):
reg=0.01*math_ops.reduce_sum(math_ops.abs(math_ops.reduce_sum(x,axis=(0,1))))
return reg
不利于收敛,特别是在正则化强度方面,它实际上可以有效地将权重之和驱动到零附近。
- 为图层编写自定义约束:
例如
class TestConstraint(Constraint):
def __init__(self, N, target_sum):
self.target_sum = tf.keras.backend.variable(target_sum,dtype="float32")
self.N = N
def __call__(self, w):
t = math_ops.reduce_sum(x,axis=(0,1),keepdims=True) - self.target_sum
t /= self.N
return w - tf.keras.backend.repeat_elements(tf.keras.backend.repeat_elements(t, w.shape[0], 0), w.shape[1], 1)
有点作品,但收敛速度有待改进
手动构建所有差异。而不是一个简单的
Conv2D(n, (7,7),...)
我会做
Conv2D(48, (7,7), trainable=False, ...)
Conv2D(n, (1,1), ...)
其中第一个 Conv2D 的权重在一开始就设置为产生 x[-3,-3]-x[0,0] 等。
收敛速度不错,但性能不太好。而且它的扩展性不太好(如果我将内核从 7x7 增加到 15x15,这会使这个“假层”的计算复杂度增加约 20 倍。)
还有什么我应该尝试的吗?
解决方案
推荐阅读
- javascript - 如何从 JSON 文件中提取某些属性
- windows - 文件大小和编码
- javascript - 获取事件回调函数中的最新道具
- c++ - 是否可以使用 cuda 内核内部的预训练张量流模型进行推理?
- javascript - 将具有多个小数位的长负数格式化为小数点后 3 位时,它显示为 0.00 而不是 -0.00
- sql-server - 更新兼容性级别 - Azure SSAS
- hazelcast-jet - 使用 Hazelcast-jet 将大型 Kafka 主题读入地图
- python - 为什么我的面部检测脚本突然停止工作?
- javascript - 如何在 Wordpress 后端插入简码
- node.js - 为什么猫鼬不更新?