我正在keras-tuner
使用 Hyperband 来执行神经网络的超参数优化:
import keras_tuner as kt
tuner = kt.Hyperband(ann_model,
objective=Objective('val_loss', direction="min"),
max_epochs=100, factor=2,
directory=/path/to/folder,
project_name="project_name", seed=0)
tuner.search(training_gen(), epochs=50, validation_data=valid_gen(),
callbacks=[stop_early], steps_per_epoch=1000,
validation_freq=1, validation_steps=100)
我将EarlyStopping
回调定义为:
stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0.1,
mode='min', patience=15)
通过设置max_epochs=100
,我注意到(在 Hyperband 算法期间)特定模型的训练不是一次性执行的,而是通过步骤(“ Runnning trials
”)执行的。
- 首先,模型从 epoch
1
到 epoch进行训练3
; - 其次,从一个时代
4
到另一个时代7
; - 然后,从
8
到13
; - 然后,从
14
到25
; - 然后,从
26
到50
; - 最后,从
51
到100
。
因此,在每次“Running trial”结束时,Keras 都会保存训练状态,以便在下一次“Running trial”时继续该状态的训练。
通过设置patience=15
:
我注意到 EarlyStopping 回调在 "Running trial" 期间停止了训练5)
,特别是在 epoch 41
(EarlyStopping 能够运行的第一个 epoch,因为:)start_epoch + patience = 26 + 15 = 41
。
然后,训练在 "Running trial" 中继续6)
,EarlyStopping 在 epoch 停止训练66
(因此,在 epoch: start_epoch + patience = 51 + 15 = 66
)。
因此:
- 即使 EarlyStopping 在试跑过程中停止训练
5)
,训练在试跑过程中继续6)
; - 耐心计数,在每次“运行试验”开始时自行重置(我认为它应该在 epoch 开始
1
并且永远不应该自行重置)。
使用 Keras Hyperband 进行调整时,耐心计数会在每次“运行试验”开始时自动重置,这是正常/预期的行为吗?