定义将随机值添加到展平层输出的 Keras 自定义层

Defining a Keras Custom Layer that adds a random value to a flatten layer output

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

试试这个:

class add_random(tf.keras.layers.Layer):
  def call(self, input):
    return input + tf.random.uniform((1,))

TL;DR:

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.
) 

Full example.

还有一个内置的 keras.layers.GaussianNoise 层,其功能与上面的 Noise 完全相同。

实现上述代码时需要注意的几点:

  • 如果你打算使用随机噪声作为正则化来对抗overfitting, it is much, much better to use keras' built-in image augmentation module
  • 在处理 CNN 时避免使用非正态分布。例如,使用均匀分布将改变批次的平均值,从而否定 CNN 的所有图像归一化,因此 desperately need.
  • 如果将 flatten 的结果送入顶部的密集分类器,请考虑使用 dropout。 Dropout 在您可能尝试做的事情上效率更高。

如有任何疑问,请随时发表评论! 干杯。