首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用keras调谐器建立模型时,是否需要在条件范围内定义层中的单元数?

当使用keras调谐器建立模型时,是否需要在条件范围内定义层中的单元数?
EN

Stack Overflow用户
提问于 2020-07-26 13:19:59
回答 1查看 1K关注 0票数 6

根据Keras示例这里这里,如果要使用超参数在深度学习模型中定义层数和每个层的单元,则执行如下操作:

代码语言:javascript
复制
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的模型之后,它总是通过unit_9将一个值分配给unit_0,即使num_layers小于10。

例如,在num_layers = 1的情况下,将只使用unit_0来构建模型。但是,unit_1通过unit_9将被定义为active中的超参数。

甲骨文“知道”unit_1通过unit_9并没有真正用于构建模型(因此忽略了它们与影响试验结果的相关性)吗?

或者,它是否假设使用unit_1通过unit_9是因为已经定义了它们(例如,调用hp.get('unit_9')将返回一个值)?

在后一种情况下,使用错误信息来驱动调优过程。因此,将需要更长的时间来收敛(最好),而错误地收敛到解决方案,这是因为将关联分配给未使用的超参数(最坏的情况)。

是否应该像这样使用条件范围来定义模型呢?

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-27 14:42:17

使用条件作用域是最好的,因为它正确地识别活动参数。如果不使用条件作用域,至少目前不可能让调谐器知道实际使用的参数。

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

对于现有的调谐器,我认为只有贝叶斯受此影响很大。对于Hyperband的情况,我不是百分之百肯定;但是对于RandomSearch,这两种方法是完全相同的(除了显示令人困惑的非活动参数)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63100699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档