Keras自定义层:根据条件更改张量的值

时间:2018-12-06 09:59:10

标签: python tensorflow keras

我尝试编写一个自定义的keras层,该层会更改张量的值。但是,numpy语法不起作用。我认为代码是不言自明的:

class myLayer(Layer):
    def __init__(self, **kwargs):
        super(myLayer, self).__init__(**kwargs)

    def build(self, input_shapes):
        super(myLayer, self).build(input_shapes)

    def call(self, inputs, mask=None):
        inputs[(inputs>0) & (inputs<1)] = 1
        inputs[inputs<=0] = K.exp(inputs)
        inputs[inputs>1] = K.exp(1-inputs)
        return inputs

    def compute_output_shape(self, input_shapes):
        return input_shapes

如何使用tensorflow编写分配并仍然允许反向传播?

1 个答案:

答案 0 :(得分:2)

您的函数没有可训练的参数,因此,您应该使用Lambda层,这样可以避免编写太多代码的麻烦(但您所做的也不是问题)。

def customCall(inputs):

    ones = K.ones_like(inputs)
    lower = K.exp(inputs)
    higher = K.exp(1-inputs)

    outputs = K.switch(K.greater(inputs,1), higher, ones)
    outputs = K.switch(K.less_equal(inputs,0), lower, outputs)

    return outputs

图层:

Lambda(customCall)

警告:

输出等于1的部分的坡度等于0。该地区可能会陷入培训。