我正在为TF Keras应用程序编写自定义层。该层应该能够执行带有附加遮罩信息的2D卷积。
该层非常简单(省略了init和compute_output_shape函数):
def build(self, input_shape):
ks = self.kernel_size + (int(input_shape[0][-1]),self.filters)
self.kernel = self.add_weight(name = 'kernel',shape = ks)
self.ones = self.add_weight(name='ones',shape=ks,
trainable=False, initializer= initializers.get('ones'))
self.bias = self.add_weight(name='bias',shape=(self.filters,))
def call(self,x):
img,msk = x
#img = tf.multiply(img,msk)
img = tf.nn.convolution(img,self.kernel)
msk = tf.nn.convolution(msk,self.ones)
#img = tf.divide(img,msk)
img = bias_add(img,self.bias)
return [img,msk]
问题出在这两行注释之内。它们应该只提供简单的,按元素的乘法和除法。如果将其注释掉,则一切正常。如果我只评论其中一个,则我模型的精度会下降2-3倍左右。
为了测试,我只是使用了一个面具。这对于该层的输出或性能(以准确性而言)应该没有影响。
我使用当前版本的TF(r 1.12),当前的夜间版本(r 1.13)和2.0预览版进行了尝试。我也试图用例如替换麻烦的行keras Lambda图层和keras Multiply图层。
这可能会或可能不会与以下问题相关: Custom TF-Keras Layer performs worse than built-in layer
从数学上讲,逐个元素的操作不应产生影响(只要掩码仅与一个掩码一致)。
elemtwise操作也不应影响该层的性能,因为它们不会影响权重,也不会影响数据。
我不知道为什么会这样,希望你们中的一些有想法。
编辑:添加了内核初始化程序,直到我之前忘记了