我正在开发一个只有两个类别的分割神经网络,分别是0和1(0代表背景,1代表我在图像中要查找的对象)。在每张图像中,大约有80%是1,20%是0。正如你所见,数据集是不平衡的,这使得结果不准确。我的准确率是85%,损失值也很低,但这仅仅是因为我的模型擅长于识别背景!
我想基于其他指标来优化模型,比如精确度或召回率,这些在这种情况下更为有用。
有谁知道如何实现这一点吗?
回答:
你不应该使用精确度或召回率来进行优化。你只需将它们作为有效的评分指标来跟踪,以便获得最佳权重。不要将损失、优化器、指标和其他混淆。它们并不是用于同一目的的。
THRESHOLD = 0.5def precision(y_true, y_pred, threshold_shift=0.5-THRESHOLD): # 以防万一 y_pred = K.clip(y_pred, 0, 1) # 如果需要,将预测阈值从0.5移位 y_pred_bin = K.round(y_pred + threshold_shift) tp = K.sum(K.round(y_true * y_pred_bin)) + K.epsilon() fp = K.sum(K.round(K.clip(y_pred_bin - y_true, 0, 1))) precision = tp / (tp + fp) return precisiondef recall(y_true, y_pred, threshold_shift=0.5-THRESHOLD): # 以防万一 y_pred = K.clip(y_pred, 0, 1) # 如果需要,将预测阈值从0.5移位 y_pred_bin = K.round(y_pred + threshold_shift) tp = K.sum(K.round(y_true * y_pred_bin)) + K.epsilon() fn = K.sum(K.round(K.clip(y_true - y_pred_bin, 0, 1))) recall = tp / (tp + fn) return recalldef fbeta(y_true, y_pred, beta = 2, threshold_shift=0.5-THRESHOLD): # 以防万一 y_pred = K.clip(y_pred, 0, 1) # 如果需要,将预测阈值从0.5移位 y_pred_bin = K.round(y_pred + threshold_shift) tp = K.sum(K.round(y_true * y_pred_bin)) + K.epsilon() fp = K.sum(K.round(K.clip(y_pred_bin - y_true, 0, 1))) fn = K.sum(K.round(K.clip(y_true - y_pred, 0, 1))) precision = tp / (tp + fp) recall = tp / (tp + fn) beta_squared = beta ** 2 return (beta_squared + 1) * (precision * recall) / (beta_squared * precision + recall) def model_fit(X,y,X_test,y_test): class_weight={ 1: 1/(np.sum(y) / len(y)), 0:1} np.random.seed(47) model = Sequential() model.add(Dense(1000, input_shape=(X.shape[1],))) model.add(Activation('relu')) model.add(Dropout(0.35)) model.add(Dense(500)) model.add(Activation('relu')) model.add(Dropout(0.35)) model.add(Dense(250)) model.add(Activation('relu')) model.add(Dropout(0.35)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adamax',metrics=[fbeta,precision,recall]) model.fit(X, y,validation_data=(X_test,y_test), epochs=200, batch_size=50, verbose=2,class_weight = class_weight) return model