多标签分类:keras自定义指标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多标签分类:keras自定义指标相关的知识,希望对你有一定的参考价值。

语境 我正在研究图像的multi_label分类问题。我试图预测39个标签。换句话说,我试图确定给定图像中存在39个特征中的哪一个(在一个图像中可以找到许多特征,这就是我在多标签分类情况下的原因。 数据 我的输入数据是(X,Y):X是形状(1814,204,204,3),Y是形状(1814,39)。因此,基本上X是图像集,Y是与每个图像相关联的标签,将用于监督学习过程。

模型 我正在构建卷积神经网络以进行预测。对于此任务,我使用Keras来创建我的模型。

我做了什么 为了验证我的模型,我需要选择一个指标。但是,Keras中可用的指标在我的情况下是不敬的,并且由于我处于多标签分类情况,因此无法帮助我验证我的模型。这就是我决定创建自定义指标的原因。我创建了应用于Y和Y_predict列的召回和精确度指标。换句话说,我将计算39个班级中每个班级的召回率和精确度。所以这是我的指标的代码:

def recall(y_true, y_pred):
    #Recall metric.

    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)),axis=0)
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)),axis=0)
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def precision(y_true, y_pred):
    #Precision metric.

    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)),axis=0)
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)),axis=1)
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

我的向量Y是形状(n,39),这就是我在轴= 0上进行操作的原因。换句话说,对于每个标签,我都在计算精确度和召回率。

下一步,我通过将其调整到keras拟合函数来调用这两个指标。换句话说,我使用了这行代码:

model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=[precision,recall])

建筑,编制和拟合模型代码: 这是我用于构建模型的代码,以及它的结果。 (我没有把代码的一部分放在我将数据分成火车和验证的地方:训练1269个样本,验证545个样本)

# Model: CNN
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(204, 204, 3), padding='same', activation='relu', kernel_constraint=maxnorm(3)))
model.add(Dropout(0.2))
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu', kernel_constraint=maxnorm(3)))
model.add(Dropout(0.5))
model.add(Dense(39))
model.add(Activation('sigmoid'))
# Compile model
epochs = 5
lrate = 0.001
decay = lrate/epochs
sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=[precision,recall])

# fitting the model 
model.fit(X_train, Y_train, epochs=epochs, batch_size=32,validation_data=(X_valid,Y_valid))

结果

Train on 1269 samples, validate on 545 samples
Epoch 1/5
  96/1269 [=>............................] - ETA: 6:40 - loss: 0.6668 - precision: 0.1031 - recall: 0.2493

问题/疑问 问题1:在结果部分的日志中,有精度和召回值。我不知道为什么我得到了真值而不是值的向量。我构建我的两个指标的方式应该给我一个形状(1,39)用于精度和(1,39)用于召回的数组,其应该包含每个类的精度和召回,仍然输出只是一个数字? 问题2:这些由日志给出的精度和召回值,它们代表尺寸=批量数据的度量计算?如何计算一个时期的度量标准(这比作为一个批处理的计算信息更有用?有人可能会说,只计算所有批次的平均值?当然,这就是我的想法,但我不知道知道如何做到这一点,因为KERAS对我来说是一个黑盒子,我不知道“在幕后”发生了什么,以便遵循/修改适当的代码部分?

答案

我认为你正在使用tensorflow后端。你实际上可以使用sklearn.metricskeras,只需通过sklearn调用tf.py_func度量,它将python函数扭曲为tf函数。

对于Q1,您看到的实际值实际上是度量向量的平均值。

对于Q2。它应该是整个时期的平均得分以进行验证。

以上是关于多标签分类:keras自定义指标的主要内容,如果未能解决你的问题,请参考以下文章

多标签分类 Keras 指标

为多标签分类生成 sklearn 指标的问题

如何处理 ValueError:分类指标无法处理多标签指标和多类目标错误的混合

f-score:ValueError:分类指标无法处理多标签指标和连续多输出目标的混合

哪些损失函数和指标用于具有非常高的负数与正数比率的多标签分类?

Keras 自定义损失函数 - 生存分析截尾