根据此处和此处的 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)))
但是,正如其他人在此处和此处指出的那样,在 oracle 看到带有它的模型后,num_layers = 10
它总是会为unit_0
through分配一个值unit_9
,即使num_layers
小于 10 也是如此。
num_layers = 1
例如,仅unit_0
用于构建模型的情况。但是,unit_1
通过unit_9
将在超参数中定义和激活。
预言机是否“知道”unit_1
通过unit_9
实际上并未用于构建模型(因此忽略它们与影响该试验结果的相关性)?
或者,它是否假设unit_1
因为unit_9
它们已被定义而被使用(hp.get('unit_9')
例如调用将返回一个值)?
在后一种情况下,预言机使用错误信息来驱动调整过程。因此,由于将相关性分配给未使用的超参数(在最坏的情况下),收敛(最好情况下)和错误地收敛到解决方案将需要更长的时间。
模型是否应该像这样使用条件范围来定义?
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')
将返回 a ValueError: Conditional parameter unit_10 is not currently active
,正如预期的那样。