【发布时间】:2021-04-08 07:25:55
【问题描述】:
如何定义 Keras 自定义层以将随机值添加到大小为 (None, 100) 的 Flatten 层(CNN)的输出?
【问题讨论】:
标签: python tensorflow keras keras-layer
如何定义 Keras 自定义层以将随机值添加到大小为 (None, 100) 的 Flatten 层(CNN)的输出?
【问题讨论】:
标签: python tensorflow keras keras-layer
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.
)
还有一个内置的keras.layers.GaussianNoise 层与我上面的Noise 完全相同。
实现上述代码时要记住的几个注意事项:
如有任何澄清,请随时发表评论! 干杯。
【讨论】:
keras.layers.GaussianNoise 做同样的事情。如果作者想要一个自定义层,这是一种方法。
training=True,则应加上噪声的平均值:inputs + tf.fill(inputs.shape, value=self.mean)
training=False,你应该添加......”,我说得对吗?您能否引用任何论文或深入解释为什么我应该在推理过程中添加噪声平均值?
training=False。与批量标准化类似,您在测试期间需要一个代表值。如果您的噪声在训练期间的平均值为 M,而在推理期间的平均值为 0,则一切都会被 M 关闭。这也可以通过 self.mean = 0 来解决。
试试这个:
class add_random(tf.keras.layers.Layer):
def call(self, input):
return input + tf.random.uniform((1,))
【讨论】: