Tensorflow SGDW优化器中的学习率和体重减轻计划

时间:2020-07-16 18:07:27

标签: python tensorflow machine-learning keras hyperparameters

我正在尝试使用TensorFlow复制this paper的一部分,问题是作者使用SGD进行了权重衰减,将学习率每30个时代降低到1/10。

TensorFlow documentation

在对学习率进行衰减时,请确保也对weight_decay手动进行衰减

所以我尝试了

schedule = keras.optimizers.schedules.ExponentialDecay(initial_learning_rate = 0.003,
                                                   decay_rate = 0.1,
                                                   decay_steps = steps_per_epoch*30,
                                                   staircase = True
)
optimizer = tfa.optimizers.SGDW(learning_rate = schedule,
                            weight_decay = schedule,
                            momentum = 0.9
)

(steps_per_epoch先前已初始化)
就像我对Keras SGD所做的那样,它无法正常工作,并为衰减_权重参数引发了“ TypeError:Expected float32”。实现目标行为的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

由于在tensorflow附加优化器ExponentialDecay中使用了keras SGDW,因此出现错误。

根据纸张超参数是

  1. 重量衰减0.001
  2. 动量为0.9
  3. 起始学习率为0.003,在30个周期后降低了10倍

所以为什么不使用LearningRateScheduler来将其减少到10个30历元

示例代码

model = tf.keras.Sequential([
    tf.keras.layers.Dense(8, input_shape=(10,)),
    tf.keras.layers.Dense(4, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax'),
])

X = np.random.randn(10,10)
y = np.random.randint(0,4,(10,3))

model.compile(
    optimizer=tfa.optimizers.SGDW(
        weight_decay=0.001,
        momentum=0.9,
        learning_rate=0.003),
      loss=tf.keras.losses.categorical_crossentropy)

def scheduler(epoch, lr):
  if epoch  % 30 == 0:
    lr = lr*0.1  
  return lr

callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
model.fit(X, y, callbacks=[callback], epochs=100)