随机应用Keras"预处理层"



Imgaug有一个p参数,该参数定义了应用某个增强的频率的概率,例如在50%的输入中。KerasPreprocessingLayer有类似的东西吗?这种层的一个例子是CCD_ 3。在imgaug中,我们可以说这个函数应该以p的概率被激活,但我猜Keras实现假设50%的图像要被翻转。

用于增强的PreprocessingLayer的当前实现具有以下结构:

如果training==True应用function。否则将输入向前传递。

def call(self,inputs, training=None, **kwargs):
if training is None:
training = K.learning_phase()
def function():
return do_something(input)
# comparable to K.switch(condition,true_function,else_function)
output = control_flow_util.smart_cond(training,function,lambda: inputs)
return output

我可以通过更改来实现随机应用行为

if training is None:
training = K.learning_phase()

类似

if training is None:
training = K.learning_phase()
# most likely 'K.switch' or 'tf.cond' must be used instead of 'if' (but 'if' is more readable) 
if training:
training = uniform(0,1)<self.p

但我认为这应该是每个RandomFunction层的一部分。所以我在这里问,预处理层是否已经存在参数p?或者我应该在GitHub上打开一个问题?

关于KerasCV的另一个注意事项——它还提供keras_cv.layers.MaybeApply,这正是@Innat的答案所暗示的。

目前,没有这样的概率参数来控制keras内置增强层的出现。我们可以做的是创建一个自定义层来包裹内置的增强层,并使其成为行动中的随机选择。

class RandomChance(layers.Layer):
def __init__(self, layer, probability, **kwargs):
super(RandomChance, self).__init__(**kwargs)
self.layer = layer
self.probability = probability
def call(self, inputs, training=True):
apply_layer = tf.random.uniform([]) < self.probability
outputs = tf.cond(
pred=tf.logical_and(apply_layer, training),
true_fn=lambda: self.layer(inputs),
false_fn=lambda: inputs,
)
return outputs
def get_config(self):
config = super().get_config()
config.update(
{
"layer": tf.keras.layers.serialize(self.layer),
"probability": self.probability,
}
)
return config

现在,你可以做

random_aug = keras.Sequential(
[
RandomChance(layers.RandomFlip(), 0.75),
RandomChance(layers.RandomBrightness(factor=0.2), 0.5),
]
)

仅供参考,您将来可能不需要使用上述方法。从tensorflow 2.9,您可以使用KerasCV,它提供了许多扩充,并且每个扩充都包含一个rate参数来控制扩充层的出现。值得注意的是,大多数扩充都是批量矢量化的,并且应该比现有的扩充库运行得更快。

最新更新