在 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 并找到一些结果。
我训练了我的网络几次,我已经得到了一些结果。然后我发现了 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 并找到一些结果。