在 keras 调谐器中得到了 nan 但它在我训练时有效

got nan in keras tuner but it works when I train it

我训练了我的网络几次,我已经得到了一些结果。然后我发现了 Keras 调谐器,并想用它找到最好的超参数。但是 tuner 的损失总是变成 nan(如果你定期训练它就不会得到 nan)。我使用 MobileNetv3Small 作为 backbone 并希望找到最佳层数和单位。 这是我的模型构建:

def build_model(hp):
model = keras.Sequential()
model.add(base)
# Tune the number of layers.
if hp.Boolean('globalMax'):
  model.add(layers.GlobalMaxPool2D())
model.add(layers.Flatten())
for i in range(hp.Int("num_layers", 1, 3)):
    model.add(
        layers.Dense(
            # Tune number of units separately.
            units=hp.Int(f"units_{i}", min_value=3, max_value=12, step=1),
        )
    )
if hp.Boolean("dropout"):
    model.add(layers.Dropout(rate=0.1))
model.add(layers.Dense(3))
model.compile(loss=mae, optimizer='sgd',metrics=[mae])
return model

我正在使用

 `tuner = kt.RandomSearch(
    hypermodel=build_model,
    objective="val_loss",
    executions_per_trial=2,
    overwrite=True
)`

这是输出: 迄今为止最好的 val_loss:nan 总耗时:00h 02m 28s INFO:tensorflow:Oracle 触发退出

有什么问题?我已经检查了任何其他优化器(但它与 .fit 完美配合),尝试删除丢失甚至规范化

所以我终于找到了问题所在。发生这种情况是因为 keras_tuner 只是试图用小批量找到一些验证,在我的情况下,它将是 nan,因为数量几乎是无限的。在尝试更大的批次并更改损失函数后,它可以摆脱一直为 Nan 并找到一些结果。