首页 > 解决方案 > 使用 keras Tuner 设置模型时,是否需要在条件范围内定义层中的单元数?

问题描述

根据此处此处的 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_0through分配一个值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,正如预期的那样。

标签: tensorflowtf.keraskeras-tuner

解决方案


使用条件范围是最好的,因为它可以正确识别活动参数。如果不使用条件作用域,至少目前无法让调谐器知道实际使用了哪些参数。

但是,当使用 RandomSearch 更简单的方法(允许存在非活动参数)时,结果应该完全相同。当开始一个新的试验时,调谐器将经历所有的可能性,但在实际开始试验之前会拒绝无效的。

对于现有的调谐器,我认为只有贝叶斯会受此强烈影响。我不是 100% 确定 Hyperband 的情况;但是对于 RandomSearch 来说,这两种方法是完全一样的(除了显示不活跃的参数会让人感到困惑)。


推荐阅读