使用kerastuneR包调优深度神经网络的代码报错原因排查
报错产生原因
这个错误是指标命名不匹配导致的:
- 你初始化
RandomSearch调参器时,指定的优化目标是val_accuracy(验证集准确率),要求调参模块从训练返回的日志里找这个字段来评估模型效果。 - 你当前环境安装的Keras/TensorFlow版本,训练过程输出的指标用的是简写命名:训练集准确率字段为
acc、验证集准确率字段为val_acc,返回的所有指标key里根本没有val_accuracy,调参器找不到指定的优化目标,就会抛出这个值错误。
修复方案
两种方案任选其一即可解决报错:
- 修改调参器的优化目标名,和当前Keras输出的指标名对齐
把初始化调参器的objective参数值从val_accuracy改成val_acc,对应代码片段:
tuner = RandomSearch( build_model, objective = 'val_acc', max_trials = 5, executions_per_trial = 3, directory = 'my_dir', project_name = 'helloworld')
- 强制Keras输出全称命名的准确率指标,匹配你原来写的目标名
修改模型编译部分的metrics参数,显式指定准确率指标的名称为accuracy,对应代码片段:
model %>% layer_dense(units = hp$Int('units', min_value = 32, max_value = 512, step= 32),input_shape = ncol(x_data), activation = 'relu') %>% layer_dense(units = 1, activation = 'sigmoid') %>% compile( optimizer = tf$keras$optimizers$Adam( hp$Choice('learning_rate', values=c(1e-2, 1e-3, 1e-4))), loss = 'binary_crossentropy', metrics = tf$keras$metrics$BinaryAccuracy(name='accuracy') )
注:你原来的代码里二分类任务最后一层用1个神经元+
softmax激活搭配binary_crossentropy损失是不合理的,softmax适用于多分类输出多个类别的概率场景,二分类单输出应该用sigmoid激活,这个问题不会触发本次报错,但会导致模型训练效果异常。
内容的提问来源于stack exchange,提问作者TUSTLGC
相关产品推荐
相关产品推荐

