时间:2020-10-24 21:44:52 | 栏目:Python代码 | 点击:次
问题描述:
在利用神经网络进行分类和识别的时候,使用了keras这个封装层次比较高的框架,backend使用的是tensorflow-cpu。
在交叉验证的时候,出现 val_categorical_accuracy: 0.0000e+00的问题。
问题分析:
首先,弄清楚,训练集、验证集、测试集的区别,验证集是从训练集中提前拿出一部分的数据集。在keras中,一般都是使用这种方式来指定验证集占训练集和的总大小。
validation_split=0.2
比如,经典的数据集MNIST,共有60000个训练集,就会
Train on 48000 samples, validate on 12000 samples
我自己学习使用的数据集比较小
训练数据集样本数: 498 ,标签个数 498
Train on 398 samples, validate on 100 samples
基本上符合4:1(0.2)的分配
出现 val_categorical_accuracy: 0.0000e+00的问题,我这边的原因主要是,样本本身是有规律的,导致分配的验证集的标签可能在训练集中可能就没有。
(PS:我实际看了下,498个样本共10个标签,后100个验证集占据了基本上后面3个标签(实际上,这三个标签占了103个样本),也就是前面的训练集基本上就没有后面的标签,整体占据前面7个标签)
问题解决:
把最初始的训练集打乱,当然,标签也要跟着移动。
index = [i for i in range(len(x_train))] np.random.shuffle(index) x_train = x_train[index] y_train = y_train[index] model.fit(x_train, y_train, batch_size=32, epochs=10, validation_split=0.2, verbose=1)
同样的问题表现,可能有不同的原因,解决方法也不尽相同,这里只是和大家分享我自己的问题解决过程。
补充知识:keras中自定义验证集的性能评估
如下所示:
def AUC(y_true,y_pred): not_y_pred=np.logical_not(y_pred) y_int1=y_true*y_pred y_int0=np.logical_not(y_true)*not_y_pred TP=np.sum(y_pred*y_int1) FP=np.sum(y_pred)-TP TN=np.sum(not_y_pred*y_int0) FN=np.sum(not_y_pred)-TN TPR=np.float(TP)/(TP+FN) FPR=np.float(FP)/(FP+TN) return((1+TPR-FPR)/2)