我尝试编写一个自定义的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编写分配并仍然允许反向传播?
答案 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。该地区可能会陷入培训。