【问题标题】:Defining a Keras Custom Layer that adds a random value to a flatten layer output定义将随机值添加到展平层输出的 Keras 自定义层
【发布时间】:2021-04-08 07:25:55
【问题描述】:

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

【问题讨论】:

标签: python tensorflow keras keras-layer


【解决方案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,那么使用 keras 内置的image augmentation module 会好得多。
  • 在处理 CNN 时避免使用非正态分布。例如,使用均匀分布会改变批次的平均值,从而否定 CNN 的所有图像归一化,所以desperately need
  • 如果将 flatten 的结果输入到顶部的密集分类器中,请考虑使用 dropout。 Dropout 在您可能尝试做的事情上效率更高。

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

【讨论】:

  • @MarcoCerliani 我知道,这很明显。问题是关于“自定义层”的。所以我避免只是评论有keras.layers.GaussianNoise 做同样的事情。如果作者想要一个自定义层,这是一种方法。
  • 这在推理过程中会有偏差。如果training=True,则应加上噪声的平均值:inputs + tf.fill(inputs.shape, value=self.mean)
  • 我相信你的要点超出了这个问题的范围
  • @NicolasGervais 我相信你的意思是“如果training=False,你应该添加......”,我说得对吗?您能否引用任何论文或深入解释为什么我应该在推理过程中添加噪声平均值?
  • 是的,您说的完全正确,感谢您的关注。我的意思是如果training=False。与批量标准化类似,您在测试期间需要一个代表值。如果您的噪声在训练期间的平均值为 M,而在推理期间的平均值为 0,则一切都会被 M 关闭。这也可以通过 self.mean = 0 来解决。
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 2019-08-30
    • 2017-06-28
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多