根据Keras Tuner示例这里和这里,如果你想使用超参数定义深度学习模型中的层数和每一层的单元数,你可以像这样操作:
然而,正如其他人在这里和这里所指出的那样,在使用
for i in range(hp.Int('num_layers', 1, 10)):
model.add(layers.Dense(units=hp.Int('unit_' + str(i), 32, 512, 32)))
然而,正如其他人在这里和这里所指出的那样,在使用
num_layers = 10
的模型后,即使num_layers
小于10,oracle仍然会为unit_0
到unit_9
分配值。
例如,当num_layers = 1
时,只有unit_0
用于构建模型。但是,unit_1
到unit_9
将被定义并且处于活动状态。
oracle是否“知道”没有实际使用unit_1
到unit_9
来构建模型(因此忽略了它们对影响试验结果的相关性)?
还是它假设unit_1
到unit_9
正在使用,因为它们已经被定义(例如调用hp.get('unit_9')
将返回一个值)?
在后一种情况下,oracle使用错误信息推动调整过程。结果是收敛时间更长(在最好的情况下),以及由于分配了未使用的超参数的相关性而错误地收敛到解决方案(在最坏的情况下)。
是否应该实际使用条件作用域来定义模型,就像这样?
num_layers = hp.Int('num_layers', 1, 10)
for i in range(num_layers):
with hp.conditional_scope('num_layers', list(range(i + 1, 10 + 1))):
model.add(layers.Dense(units=hp.Int('unit_' + str(i), 32, 512, 32)))
在这种定义模型的方式中,如果num_layers < 10
,调用hp.get('unit_9')
将返回ValueError: Conditional parameter unit_10 is not currently active
,这是预期的结果。
.search()
进行贝叶斯/Hyperband搜索,带/不带条件范围,然后比较运行时间、最终参数选择和测试集性能。 - Ian Zurutuza