Joe*_*Joe 7 tensorflow tf.keras 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)))
Run Code Online (Sandbox Code Playgroud)
然而,正如其他人在这里和这里指出的那样,在预言机看到一个模型之后,num_layers = 10它总是会为unit_0through分配一个值unit_9,即使num_layers小于 10 也是如此。
num_layers = 1例如,在这种情况下,仅unit_0将用于构建模型。但是,unit_1通过unit_9将在超参数中定义并激活。
预言机是否“知道” unit_1throughunit_9实际上并未用于构建模型(因此忽略它们与影响试验结果的相关性)?
或者,它是否假设正在使用unit_1through ,因为它们已被定义(并且调用例如将返回一个值)?unit_9hp.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)))
Run Code Online (Sandbox Code Playgroud)
当像这样定义模型时, if num_layers < 10,调用hp.get('unit_9')将返回 a ValueError: Conditional parameter unit_10 is not currently active,如预期的那样。
小智 5
使用条件范围是最好的,因为它可以正确识别活动参数。如果不使用条件范围,至少目前不可能让调优器知道实际使用了哪些参数。
然而,当使用 RandomSearch 更简单的方法(允许存在非活动参数)时,结果应该完全相同。当开始新的试验时,调谐器将检查所有可能性,但在实际开始试验之前会拒绝无效的可能性。
对于现有的调优器,我认为只有贝叶斯受此影响很大。我对 Hyperband 的情况不是 100% 确定;但对于 RandomSearch 来说,这两种方法完全相同(除了显示令人困惑的非活动参数)。
| 归档时间: |
|
| 查看次数: |
1254 次 |
| 最近记录: |