如何定义/修改非分类CNN的精度?Keras回归模型相关问题
解决Keras模型的自定义精度计算与输出四舍五入需求
一、自定义精度指标(±0.05范围内判定为正确)
原模型使用的accuracy是分类任务专属指标,要求预测值与真实值完全匹配才判定正确,完全不适合你的连续值回归场景。我们需要自定义一个符合需求的精度计算函数:
import tensorflow as tf def custom_accuracy(y_true, y_pred): # 计算预测值与真实值的绝对误差 abs_error = tf.abs(y_true - y_pred) # 统计误差≤0.05的样本占比,即为自定义精度 return tf.reduce_mean(tf.cast(abs_error <= 0.05, tf.float32))
之后在模型编译时替换原有的accuracy指标:
model.compile(optimizer='adam', # 注意:你的任务是回归,推荐用MSE/MAE替代二分类的BinaryCrossentropy loss=tf.keras.losses.MeanSquaredError(), metrics=[custom_accuracy])
二、对CNN输出进行四舍五入处理
提供两种实现方式,按需选择:
方式1:在模型结构中添加Lambda层
直接让模型输出就是四舍五入后的结果,无需额外后处理:
def networkModel(): model = tf.keras.Sequential([ tf.keras.layers.Conv2D(filters=16, kernel_size=(2, 2), activation='relu', padding='same'), tf.keras.layers.Conv2D(filters=9, kernel_size=(2, 2), activation='relu', padding='same'), tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid'), # 四舍五入到两位小数 tf.keras.layers.Lambda(lambda x: tf.round(x * 100) / 100) ]) model.compile(optimizer='adam', loss=tf.keras.losses.MeanSquaredError(), metrics=[custom_accuracy]) return model
方式2:预测后手动处理结果
如果不想修改模型结构,可在得到预测值后再处理:
# 假设model为训练好的模型,x_test为测试输入 predictions = model.predict(x_test) # 四舍五入到两位小数 rounded_predictions = tf.round(predictions * 100) / 100
完整修改后的代码示例
import tensorflow as tf def custom_accuracy(y_true, y_pred): abs_error = tf.abs(y_true - y_pred) return tf.reduce_mean(tf.cast(abs_error <= 0.05, tf.float32)) def networkModel(): model = tf.keras.Sequential([ tf.keras.layers.Conv2D(filters=16, kernel_size=(2, 2), activation='relu', padding='same'), tf.keras.layers.Conv2D(filters=9, kernel_size=(2, 2), activation='relu', padding='same'), tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid'), tf.keras.layers.Lambda(lambda x: tf.round(x * 100) / 100) ]) model.compile(optimizer='adam', loss=tf.keras.losses.MeanSquaredError(), metrics=[custom_accuracy]) return model
内容的提问来源于stack exchange,提问作者Teresa Wan
相关产品推荐
相关产品推荐

