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

CNN运行时model.evaluate准确率超100%,如何隔离各model.fit训练实例?

问题根源

  1. 评估输出取错字段:model.evaluate()的返回值第一个元素是损失值,第二个才是你配置的准确率指标。你当前代码取score[0](损失值)乘100当作准确率输出,交叉熵损失没有0-1的取值限制,模型训崩时损失会大于1,自然会出现超过100%的错误结果。
  2. 输出层激活函数错误:二分类单神经元输出场景下,输出层需要用sigmoid激活函数,你当前用的softmax在单神经元下输出恒为1,模型无法正常学习分类规则,训练过程会异常。
  3. 训练隔离方式错误:Keras的model.fit()默认是增量训练,同一个模型实例多次调用fit会在上次训练结束的权重基础上继续更新,不会自动重置。你之前创建多个Model实例的方法无效,因为所有实例复用了同一组层对象,权重是全局共享的,等于还是在同一个权重基础上训练。

解决步骤

1. 修复评估输出逻辑

将所有打印准确率的代码中score_xxx[0]改为score_xxx[1],正确取准确率字段。

2. 修正模型结构

把输出层的激活函数从softmax改为sigmoid。

3. 正确隔离不同epoch的训练

将模型构建逻辑封装为独立函数,每次测试不同epoch数量时调用函数重新创建全新的模型实例,所有层权重会重新初始化,不会互相干扰,参考实现如下:

def build_model(img_shape):
    input_layer = Input(shape=(img_shape, img_shape, 3))
    convolution_layer_1 = Conv2D(32, kernel_size=(5,5), activation = 'relu')(input_layer)
    max_pool_1 = MaxPooling2D(pool_size=(2,2), strides=2)(convolution_layer_1)

    convolution_layer_2 = Conv2D(64, kernel_size=(5,5), activation = 'relu')(max_pool_1)
    max_pool_2 = MaxPooling2D(pool_size=(2,2),strides=2)(convolution_layer_2)

    dense_layer_1 = Dense(32, activation='relu')(max_pool_2)
    flatten_layer_1 = Flatten()(dense_layer_1)
    dropout_1 = Dropout(0.4)(flatten_layer_1)

    output_layer = Dense(1, activation='sigmoid')(dropout_1)

    model = Model(inputs=input_layer, outputs=output_layer)
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model

# 测试100轮
model_100 = build_model(img_shape=你的图片尺寸)
model_100.fit(training_set_data, epochs = 100, validation_data = test_set_data)
score_100 = model_100.evaluate(test_set_data)
print('\nTest accuracy for 100 epochs: %0.4f%%' % (score_100[1] * 100))

# 测试200轮
model_200 = build_model(img_shape=你的图片尺寸)
model_200.fit(training_set_data, epochs = 200, validation_data = test_set_data)
score_200 = model_200.evaluate(test_set_data)
print('\nTest accuracy for 200 epochs: %0.4f%%' % (score_200[1] * 100))

# 测试300轮
model_300 = build_model(img_shape=你的图片尺寸)
model_300.fit(training_set_data, epochs = 300, validation_data = test_set_data)
score_300 = model_300.evaluate(test_set_data)
print('\nTest accuracy for 300 epochs: %0.4f%%' % (score_300[1] * 100))

注:新版本Keras中fit_generator已弃用,直接使用fit即可支持生成器类型的输入数据。

内容的提问来源于stack exchange,提问作者Brian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:00