tensorflow - 使用 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_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
,正如预期的那样。
解决方案
使用条件范围是最好的,因为它可以正确识别活动参数。如果不使用条件作用域,至少目前无法让调谐器知道实际使用了哪些参数。
但是,当使用 RandomSearch 更简单的方法(允许存在非活动参数)时,结果应该完全相同。当开始一个新的试验时,调谐器将经历所有的可能性,但在实际开始试验之前会拒绝无效的。
对于现有的调谐器,我认为只有贝叶斯会受此强烈影响。我不是 100% 确定 Hyperband 的情况;但是对于 RandomSearch 来说,这两种方法是完全一样的(除了显示不活跃的参数会让人感到困惑)。
推荐阅读
- sql - 使用 xp_cmdshell 将一个文件复制到另一个具有相同文件名的文件夹
- python - 提取强文本并跟随 p
- django - 如何修改 django 中具有多对多关系的现有字段?
- java - 在构造函数中引用类实例如何工作?
- python - Django IntegerField 在使用 MySQL 时检索 0 作为 None 值
- python-2.7 - 如何从python中的文件名中获取完整的文件路径?
- java - 选择第一个可用的服务块
- wordpress - 使用 wp_insert_post() 的自定义分类问题
- java - 如何编写具有多个源的 JGiven 参数化场景(JUnit5)?
- php - 无法从 woocommerce 产品循环挂钩/操作中删除 sale_flash 徽章