Batchnormalize、Dropout 和层数
Batchnormalize, Dropout and number of layers
我正在学习 batchnormalisation 和 dropout。看到这个 https://www.kaggle.com/ryanholbrook/dropout-and-batch-normalization.
模特
model = keras.Sequential([
layers.Dense(1024, activation='relu', input_shape=[11]),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1024, activation='relu'),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1024, activation='relu'),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1),
])
我的问题是我们是将 dropout 放在 batchnormalization (BN) 之前还是之后?结果相同?
我的理解是,dropout 会“停用”下一层的神经元(请原谅我的术语)。所以如果我放在 BN 之前,BN 是否会被错误地归一化,因为它不是前一层的完整输出。
所以我们应该把 dropout 放在 BN 之后?重要吗?
如果你仔细查看关于 dropout 层的 tensorflow doc,你会看到它说:
The Dropout layer randomly sets input units to 0 with a frequency of
rate at each step during training time, which helps prevent
overfitting. Inputs not set to 0 are scaled up by 1/(1 - rate) such
that the sum over all inputs is unchanged.
这意味着 dropout 不会停用下一层中的任何神经元,而是“停用”神经元的输入(= 神经元接收 0
作为输入)。请注意,实际的 Dropout 通常是这种情况,其他框架如 PyTorch 使用相同的方法。
所以 Dropout 之后的 BN 不会“错误地归一化”,而是按照它的程序进行,即执行归一化,但现在一些输入有一个 0 而不是它们的非 dropout 值。
将 Dropout 放在 BN 之前还是之后取决于您的数据,并且会产生不同的结果。大多数时候,这两种技术都用于规范化,根据我的个人经验,其中一种就足够了/它们结合起来效果不佳。
如果您将 dropout 视为噪声,那么将 Dropout 放在 BN 之前意味着您对“噪声”输入进行归一化,而将其放在之后意味着您将噪声添加到归一化数据中。
我正在学习 batchnormalisation 和 dropout。看到这个 https://www.kaggle.com/ryanholbrook/dropout-and-batch-normalization.
模特
model = keras.Sequential([
layers.Dense(1024, activation='relu', input_shape=[11]),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1024, activation='relu'),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1024, activation='relu'),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1),
])
我的问题是我们是将 dropout 放在 batchnormalization (BN) 之前还是之后?结果相同?
我的理解是,dropout 会“停用”下一层的神经元(请原谅我的术语)。所以如果我放在 BN 之前,BN 是否会被错误地归一化,因为它不是前一层的完整输出。
所以我们应该把 dropout 放在 BN 之后?重要吗?
如果你仔细查看关于 dropout 层的 tensorflow doc,你会看到它说:
The Dropout layer randomly sets input units to 0 with a frequency of rate at each step during training time, which helps prevent overfitting. Inputs not set to 0 are scaled up by 1/(1 - rate) such that the sum over all inputs is unchanged.
这意味着 dropout 不会停用下一层中的任何神经元,而是“停用”神经元的输入(= 神经元接收 0
作为输入)。请注意,实际的 Dropout 通常是这种情况,其他框架如 PyTorch 使用相同的方法。
所以 Dropout 之后的 BN 不会“错误地归一化”,而是按照它的程序进行,即执行归一化,但现在一些输入有一个 0 而不是它们的非 dropout 值。
将 Dropout 放在 BN 之前还是之后取决于您的数据,并且会产生不同的结果。大多数时候,这两种技术都用于规范化,根据我的个人经验,其中一种就足够了/它们结合起来效果不佳。
如果您将 dropout 视为噪声,那么将 Dropout 放在 BN 之前意味着您对“噪声”输入进行归一化,而将其放在之后意味着您将噪声添加到归一化数据中。