多输出CNN年龄性别检测模型metrics参数ValueError问题求助
解决多输出CNN模型的Metrics ValueError问题
错误原因
你的模型包含性别二分类和年龄回归两个输出,但在model.compile()中仅传入了1个评估指标,Keras要求多输出模型的metrics参数条目数必须与输出数一致。同时要注意:年龄预测是回归任务,不能使用仅适用于分类任务的accuracy指标。
解决方案
针对多输出模型,有两种规范的metrics设置方式:
方式1:列表对应式
按输出顺序,为每个输出指定对应的评估指标(单个指标或指标列表):
- 第一个输出(性别分类):用
accuracy - 第二个输出(年龄回归):用回归类指标,比如
mae(平均绝对误差)或mse(均方误差)
修改后的compile代码:
model.compile( loss=["binary_crossentropy", "mae"], optimizer="Adam", metrics=[["accuracy"], ["mae"]] # 每个子列表对应一个输出的指标 )
方式2:字典映射式(更直观)
利用输出层的name参数,直接为每个输出指定指标,可读性更强:
model.compile( loss={"sex_out": "binary_crossentropy", "age_out": "mae"}, optimizer="Adam", metrics={"sex_out": "accuracy", "age_out": "mae"} )
如果需要为单个输出设置多个指标,也可以用列表:
metrics={"sex_out": ["accuracy", "recall"], "age_out": ["mae", "mse"]}
修改后的完整模型代码
def model(input_shape): inputs=Input((input_shape)) conv_1=Convolution(inputs,32) maxp_1=MaxPooling2D(pool_size=(2,2))(conv_1) conv_2=Convolution(maxp_1,64) maxp_2=MaxPooling2D(pool_size=(2,2))(conv_2) conv_3=Convolution(maxp_2,128) maxp_3=MaxPooling2D(pool_size=(2,2))(conv_3) conv_4=Convolution(maxp_3,256) maxp_4=MaxPooling2D(pool_size=(2,2))(conv_4) flatten= Flatten()(maxp_4) dense_1=Dense(64,activation='relu')(flatten) dense_2=Dense(64,activation='relu')(flatten) drop_1=Dropout(0.2)(dense_1) drop_2=Dropout(0.2)(dense_2) output_1=Dense(1,activation='sigmoid',name='sex_out')(drop_1) output_2=Dense(1,activation='relu',name='age_out')(drop_2) model=Model(inputs=[inputs],outputs=[output_1,output_2]) # 采用字典映射式配置loss和metrics model.compile( loss={"sex_out": "binary_crossentropy", "age_out": "mae"}, optimizer="Adam", metrics={"sex_out": "accuracy", "age_out": "mae"} ) return model
关键注意点
- 回归任务(年龄预测)不能使用
accuracy,该指标仅用于衡量分类任务的预测正确比例,对连续值预测完全不适用,必须选用回归类指标。 - 多输出模型的
loss和metrics参数,使用字典映射式比列表式更易维护,尤其是当输出顺序调整时,不会出现指标匹配错误。
内容的提问来源于stack exchange,提问作者Satya Prakash Mohanty
相关产品推荐
相关产品推荐

