程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了获取 keras 模型中 3 个类的混淆矩阵大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决获取 keras 模型中 3 个类的混淆矩阵?

开发过程中遇到获取 keras 模型中 3 个类的混淆矩阵的问题如何解决?下面主要结合日常开发的经验,给出你关于获取 keras 模型中 3 个类的混淆矩阵的解决方法建议,希望对你解决获取 keras 模型中 3 个类的混淆矩阵有所启发或帮助;

所以我有类似 (10000,178,3) 形状的数据,其中我有 10000 个样本,每个样本有 3 个不同的颜色通道(不是 RGB 通道),我将它们分为 3 个这样的类,所以我有 3 个标签 0,1 & 2:

导入库:

from keras.layers import Conv2D,MaxPooling2D,Flatten,Dense
from keras.models import Sequential
from keras import regularizers
from keras.layers import Dense,Activation,Dropout,Batchnormalization

from keras import optimizers
import keras
from keras.callBACks import LearningRatescheduler
from tensorflow.keras import optimizers
import tensorflow as tf
from keras.layers import LeakyReLU

from sklearn.metrics import classification_report,confusion_matrix

label = np.where((np.array(val) < 0.1),np.where((np.array(val) < 0.2),1,2))

一个热编码:

def to_one_hot(y,num_class=3):
    results = numpy.zeros((len(y),num_class))
    for i,label in enumerate(y):
        results[i,label] = 1

    return results

y_Train_vec = to_one_hot(label)

用于训练和测试的拆分:

rand_inDices = np.random.permutation(len(data))
Train_inDices = rand_inDices[0:7460]
valID_inDices = rand_inDices[7460:len(data)]

x_test = data_arraY[valID_inDices,:]
y_test = y_Train_vec[valID_inDices,:].astype('float')

x_Train = data_arraY[Train_inDices,:]
y_Train = y_Train_vec[Train_inDices,:].astype('float')

然后我使用这个神经网络来训练这个数据集:

weight_decay = 1e-4
model = Sequential()
model.add(Conv2D(32,(20,20),padding='same',kernel_regularizer=regularizers.l2(weight_decay),input_shape=x_tr.shape[1:]))
model.add(LeakyReLU(Alpha=0.01))
model.add(Batchnormalization())
model.add(Conv2D(32,(30,30),kernel_regularizer=regularizers.l2(weight_decay)))
model.add(LeakyReLU(Alpha=0.01))
model.add(Batchnormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(1,activation='sigmoID'))

model.sumMary()

然后我在这里训练它:

def lr_schedule(epoch):
    lrate = 0.001
    if epoch > 30:
        lrate = 0.0005
    elif epoch > 60:
        lrate = 0.0003        
    return lrate

batch_size = 128

opt_rms = tf.keras.optimizers.Adam()

model.compile(loss= 'categorical_crossentropy',optimizer = opt_rms,metrics=['accuracy'])

history = model.fit(x_Train,y_Train,batch_size,epochs=100,verbose=1,callBACks=[LearningRatescheduler(lr_schedulE)])

现在我想要 3 个班级的混淆矩阵,我知道如何为这样的 2 个班级做到这一点,但有人可以告诉我如何为 3 个班级做同样的事情:

T=0.5
y_pred = model.preDict(x_val)
y_pred_bool = y_pred>=T

confusion_matrix(y_val,y_pred_bool)

解决方法

你能不能得到 y_pred_bool 的形状,然后发布几行看看它是什么样子?

但一般来说,如果您的目标存储在单个列中(形状 (N,)):

# Libraries
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.metrics import multilabel_confusion_matrix

# Target and preDictions in (N,) shape
y_true = np.array([0,1,2])
y_pred = np.array([0,1])

# Get confusion matrix
confusion_matrix(y_true=y_true,y_pred=y_pred)
> array([[1,0],[0,0]])

如果您的目标和预测标签被编码为指标列,您可以使用 sklearn.metrics.multilabel_confusion_matrix。这将以一对一的方式为每个类产生一个混淆矩阵。例如:

# Libraries
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.metrics import multilabel_confusion_matrix

# Target and preDictions in (N,3) shape
y_true = np.array([[1,1]])
y_pred = np.array([[1,0]])

# Get confusion matrix for each class 
multilabel_confusion_matrix(y_true=y_true,y_pred=y_pred)
> array([[[2,1]],[[1,1],[[2,[1,0]]])

大佬总结

以上是大佬教程为你收集整理的获取 keras 模型中 3 个类的混淆矩阵全部内容,希望文章能够帮你解决获取 keras 模型中 3 个类的混淆矩阵所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。