CNN运行时model.evaluate准确率超100%,如何隔离各model.fit训练实例?
问题根源
- 评估输出取错字段:
model.evaluate()的返回值第一个元素是损失值,第二个才是你配置的准确率指标。你当前代码取score[0](损失值)乘100当作准确率输出,交叉熵损失没有0-1的取值限制,模型训崩时损失会大于1,自然会出现超过100%的错误结果。 - 输出层激活函数错误:二分类单神经元输出场景下,输出层需要用
sigmoid激活函数,你当前用的softmax在单神经元下输出恒为1,模型无法正常学习分类规则,训练过程会异常。 - 训练隔离方式错误: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
相关产品推荐
相关产品推荐

