TF Keras自定义图层的精确度随着元素操作而降低

时间:2019-02-19 18:08:47

标签: python-3.x tensorflow keras

我正在为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操作也不应影响该层的性能,因为它们不会影响权重,也不会影响数据。

我不知道为什么会这样,希望你们中的一些有想法。

编辑:添加了内核初始化程序,直到我之前忘记了

0 个答案:

没有答案