定义将随机值添加到展平层输出的 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.
)
还有一个内置的 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 在您可能尝试做的事情上效率更高。
如有任何疑问,请随时发表评论!
干杯。
如何定义 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.
)
还有一个内置的 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 在您可能尝试做的事情上效率更高。
如有任何疑问,请随时发表评论! 干杯。