Согласно примерам 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)))
Однако, как уже отмечали другие, здесь и здесь после того, как оракул увидит модель с num_layers = 10
он всегда будет присваивать значение от unit_0
до 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')
вернет ValueError: Conditional parameter unit_10 is not currently active
, как и ожидалось.