【问题标题】:Keras custom layer: change values of tensor based on conditionsKeras 自定义层:根据条件更改张量的值
【发布时间】:2019-05-07 23:49:52
【问题描述】:

我尝试编写一个自定义 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 写作业并且仍然允许反向传播?

【问题讨论】:

标签: python tensorflow keras


【解决方案1】:

你的函数没有可训练的参数,因此,你应该使用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。该区域可能会陷入训练中。

【讨论】:

  • +1,我不知道K.switch。我正在编写一个基于创建掩码(大于 1、小于 1 等)并将它们相乘的解决方案,然后我看到了您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多