首页 > 解决方案 > 定义将随机值添加到展平层输出的 Keras 自定义层

问题描述

如何定义 Keras 自定义层以向大小为(无,100)的 Flatten 层(CNN)的输出添加随机值?

标签: pythontensorflowkeraskeras-layer

解决方案


TL;博士:

class Noise(keras.layers.Layer):
    def __init__(self, mean=0, stddev=1.0, *args, **kwargs):
        super(Noise, self).__init__(*args, **kwargs)
        self.mean = mean
        self.stddev = stddev

    def call(self, inputs, 
             training=False # Only add noise in training!
             ):
        if training:
            return inputs + tf.random.normal(
                inputs.shape, 
                mean=self.mean,
                stddev=self.stddev
            ) # Add random noise during training
        else:
            return inputs + tf.fill(
                inputs.shape, 
                self.mean
            ) # Add mean of random noise during inference

model = keras.Sequential([
    layers.Flatten(input_shape=(10,10,1)),
    Noise(stddev=.1)
])

model(input_batch,
      training=True # Defaults to False. 
                    # Noise is added only in training mode.
) 

完整的例子

还有一个内置层可以做与我上面keras.layers.GaussianNoise完全相同的事情。Noise

实现上述代码时要记住的几个注意事项:

  • 如果您打算使用随机噪声作为正则化器来对抗过度拟合,那么使用 keras 的内置图像增强模块要好得多。
  • 在处理 CNN 时避免使用非正态分布。例如,使用均匀分布将改变批次的平均值,否定 CNN迫切需要的所有图像归一化。
  • 如果将 flatten 的结果输入到顶部的密集分类器中,请考虑使用 dropout。Dropout 在您可能尝试做的事情上效率更高。

对于任何澄清,请不要犹豫发表评论!干杯。


推荐阅读