1

我将 TensorFlow 2.4.1 和 Python3.8 用于基于计算机视觉的 CNN 模型,例如 VGG-18、ResNet-18/34 等。我的问题是针对权重衰减声明的。有两种定义方式:

  1. 第一种是使用 'Conv2D' 层的 'kernel_regularizer' 参数为每​​一层声明它
  2. 第二种是在 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)

我的问题是:

  1. 这两种使用重量衰减的技术是否在做同样的事情?如果是,则应仅使用一个以避免冗余
  2. 如果不是,使用这两个权重衰减定义是否会增加两倍的权重衰减?因为过多的正则化甚至会将有用的权重推向零,因此本质上,任何模型都不会学习所需的功能。
4

1 回答 1

2

自 Keras 2.3 起,所有优化器都弃用了Decay 参数。对于学习率衰减,您应该改用LearningRateSchedule

至于你的问题:

  1. 部分同意;如果您有一个深度神经网络,则可以仅在“表面”层上应用更重要的衰减,同时使用 LearningRateSchedule 获得更平滑的整体衰减。这可能是关于实验,但总的来说,我同意降低复杂性的规则。
  2. 同样,我会说这取决于层数;如果您没有单层,我不明白为什么会添加两个权重衰减,因为它们在您的网络的不同规模上起作用。

为什么不运行不同的配置进行比较?

于 2021-04-14T16:32:00.043 回答