TensorFlow SGD衰减参数



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

  1. 第一种方法是使用"Conv2D"层的"kernel_regular izer"参数为每个层声明
  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. 如果不是,使用这两个权重衰减定义是否会增加两倍的权重衰减?因为过多的正则化甚至会将有用的权重推向零,因此本质上,任何模型都不会学习所需的函数
自Keras 2.3以来,所有优化器都不赞成使用Decay参数。对于学习率衰减,您应该使用LearningRateSchedule。

关于您的问题:

  1. 部分同意;如果你有一个深度神经网络,就有可能只对";"表面";层,同时使用LearningRateSchedule具有更平滑的整体衰减。这可能是关于实验的,但总的来说,我同意降低复杂性的规则
  2. 我再说一遍,这取决于层数;如果你没有一层,我不明白为什么两个权重衰减都会被添加,因为它们作用在你的网络的不同尺度上

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

最新更新