我将 TensorFlow 2.4.1 和 Python3.8 用于基于计算机视觉的 CNN 模型,例如 VGG-18、ResNet-18/34 等。我的问题是针对权重衰减声明的。有两种定义方式:
- 第一种是使用 'Conv2D' 层的 'kernel_regularizer' 参数为每一层声明它
- 第二种是在 TF SGD 优化器中使用“decay”参数
示例代码是:
weight_decay = 0.0005
Conv2D(
filters = 64, kernel_size = (3, 3),
activation='relu', kernel_initializer = tf.initializers.he_normal(),
strides = (1, 1), padding = 'same',
kernel_regularizer = regularizers.l2(weight_decay),
)
# NOTE: this 'kernel_regularizer' parameter is used for all of the conv layers in ResNet-18/34 and VGG-18 models
optimizer = tf.keras.optimizers.SGD(learning_rate = 0.01, decay = lr_decay, momentum = 0.9)
我的问题是:
- 这两种使用重量衰减的技术是否在做同样的事情?如果是,则应仅使用一个以避免冗余
- 如果不是,使用这两个权重衰减定义是否会增加两倍的权重衰减?因为过多的正则化甚至会将有用的权重推向零,因此本质上,任何模型都不会学习所需的功能。