You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义/修改非分类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:33:28