【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决

2020/5/6——2020/5/7记录

1读标签

读csv文件作为深度学习标签

将csv文件另存为.csv(逗号分割)文件,然后用记事本打开,将“”,全替换成“;”(注意中英文,程序中和TXT文件中要一致),然后就可以在程序中对txt文件readlines啦。

2 改bug

python 使用opencv读取图片,解决cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv…报错

首先检查文件路径是否正确
如果保证文件路径没有错误的情况下,请检查你的图片格式。我网上下的jpg格式是可以正常读取的,但是当我转化为png 就会报错!所以第二个原因就是你图片的格式问题。

(-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’

出现这个问题,一般是路径上面的错误,仔细查看自己输入的图片路径是否正确

检查发现自己少写了.jpg,改正后可以正常运行。

3训练集与测试集准确率一直为1,acc=1.0 ,val_acc=1.0

【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决_第1张图片
搜索到以下可能性:
1.模型是否收敛?模型不收敛就是模型问题。

2.数据是否混洗

3.模型是否过拟合。验证集几乎不动,而训练集还在下降,说明过拟合。改模型结构,加正则化,加数据。

4.修改学习速率。减小lr,增大epoch,观察是否能走出局部最小值。
5.不小心给负样本的权重为0?
6.首先对部分简单任务,验证集精度可以到1;其次,如果要验证集和训练集有重合,也会导致精度为1;再不行看看加大验证集试试。还不行就看看数据载入有没有出错,比如label载入的对不对,数据是不是正常,精度计算是不是错了之类的
7.训练集&验证集&测试集的数据分布有出入,这是我认为出现这个结果最有可能的原因.分析三个数据集的分布,如果分布不一致那么可以通过改变数据分布来改善你这个问题.如果数据分布没问题,那么就是你的模型复杂度太高,导致过拟合,可以尝试正则化如果第二点也尝试了,那么你可以尝试一些其他的数据集,如果在其他数据集上的表现还可以,那么就确定是你数据集的问题,如果表现同样很差,很有可能是你模型的问题

8 .scale your data before training? Are you applying the same scaling to your data during testing? data normalization 数据标准化
9. If after switching val/test sets, you get same results, then that probably means that you are not loading your trained network correctly while you are testing on the new data.

采取措施1:修改学习率

算法搜索一个好的起始学习率。对于分类就用0.1*bn/256(bn表示batchsize)

如何正确设置验证集 如何设置一个好的初始学习率

设置batchsize=4,则lr=0.0015625(原来等于0.001)或0.0001,没用
设batchsize=1,lr=0.001 ,没用
设batchsize=4 ,lr=0.0001,没用
【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决_第2张图片

采取措施2:加入dropout

提示错误:‘Dropout’ is not defined
在主程序train.py中加入from keras.layers import Dropout,仍然报错。上个厕所清醒一下突然意识到,要在VGG16.py子程序中import 才管用。加上,果然可以正常运行了。
另外,还调整了一下训练集和验证集数据比例从9:1到8:2。

改了这三项重新运行,仍然是epoch=1的时候,val_acc=1.0了。
【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决_第3张图片
没关系,我们增加数据集大小,把a-f全部放进来。

采取措施3:增加数据集大小

1.excel 中一次性选中所有不为空单元格的操作:编辑-定位-定位条件 即可。
【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决_第4张图片
还是没有解决这个问题 而且第一轮epoch就acc=1,val_acc=1了。

采取措施4:shuffle?

已经shuffle过了

改正 指定的训练层

 # 指定训练层
    for i in range(0,len(model.layers)-7):  //之前程序写的是5。加了dropout两层,应该改成7了。
        model.layers[i].trainable = False

还是不太管用。
【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决_第5张图片

改后几层中的激活函数“relu”为“sigmoid”

木的用处…

对参数进行初始化——Xavier或he

加了,貌似默认就是Xavier,看到博客说“relu”激活函数和he 参数初始化 很搭,所以试了一下,不太对。
https://www.cnblogs.com/TensorSense/p/7413312.html

【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决_第6张图片

降低模型复杂性?

数据增强(增广)?

使用batch normalization?

批量归一化。这是你永远都需要做的事情!批量归一化是一个相对较新的概念,因此在 Vgg 模型中尚未实现。

如果你对机器学习有所了解,你一定听过标准化模型输入。批量归一化加强了这一步。批量归一化在每个卷积层之后添加“归一化层”。这使得模型在训练中收敛得更快,因此也允许你使用更高的学习率。

简单地标准化每个激活层中的权重不起作用。随机梯度下降非常顽固。如果使得其中一个比重非常高,那么下一次训练它就会简单地重复这个过程。通过批量归一化,模型可以在每次训练中调整所有的权重而非仅仅只是一个权重。
CNN中过拟合问题的解决

5/8 stackoverflow 相关回答线索整理

1:Did you scale the data?(data normalization数据标准化

深度学习图像分类:首先要对图像做数据预处理——数据标准化和数据归一化

知乎_归一化标准化辨析——nulltoall的回答
各种博客各种说法我都蒙了,看了这个回答觉得说的最清楚。主要内容如下:

“首先要明确一下,标准化( standardization)和归一化(normalization)在ML中的概念和统计学中不太一样,容易引发歧义。两者都是特征缩放(Feature Scaling)的方法。
标准化(Standardization)又叫做Z-score normalization (是的,其实它也是一种normalization),公式是这样的【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决_第7张图片

归一化(normalization)又叫做 Min-Max scaling,这个名字不容易引起歧义。【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决_第8张图片它会把数据的范围限制在0到1, 而Standardization则不会把数据限定在特定范围。Standardization受异常值(outliers)的影响也较小。"

深度学习图像数据标准化与归一化的特点优势:

1.图像标准化是将数据通过去均值实现中心化的处理,根据凸优化理论与数据概率分布相关知识,数据中心化符合数据分布规律,更容易取得训练之后的泛化效果, 数据标准化是数据预处理的常见方法之一

2.图像归一化不会改变图像本身的信息存储,但是通过打印出来的像素值可以发现,取值范围从0~255已经转化为0~1之间了,这个对于后续的神经网络或者卷积神经网络处理有很大的好处,tensorflow官方给出mnist数据集,全部采用了归一化之后的结果作为输入图像数据来演示神经网络与卷积神经网络。

深度学习cnn选择归一化还是标准化?

要具体情况具体分析。
知乎回答1:“关于在ML里面是用第一个好还是第三个好,感觉大家都讨论的很激烈.有的认为取决于你的数据的特点(是否稀疏),有的认为取决于数据是否有明确的界限. 个人不太赞同只有归一化让椭圆变成了圆的想法,在我的梯度下降中,两种都加速得挺好…”
知乎回答2:“引用文章里的话,“Standardization or Min-Max scaling?” - There is no obvious answer to this question: it really depends on the application.For example, in clustering analyses, standardization may be especially crucial in order to compare similarities between features based on certain distance measures. Another prominent example is the Principal Component Analysis, where we usually prefer standardization over Min-Max scaling, since we are interested in the components that maximize the variance (depending on the question and if the PCA computes the components via the correlation matrix instead of the covariance matrix; but more about PCA in my previous article).However, this doesn’t mean that Min-Max scaling is not useful at all! A popular application is image processing, where pixel intensities have to be normalized to fit within a certain range (i.e., 0 to 255 for the RGB color range). Also, typical neural network algorithm require data that on a 0-1 scale.作者还写过这么一句As a rule of thumb I’d say: When in doubt, just standardize the data, it shouldn’t hurt.总之,有空可以多试试。”

数据标准化/归一化 ,声谱图(SFFT)特征提取 的先后顺序?

我的问题是在心音数据预处理的时候,我已经做过标准化了,使用的是就是减掉均值除以标准差的normalization方式标准化的,然后用这个数据,生成的二维心音声谱图,生成图像之后我还需要再进行标准化吗?另外就是猫狗分类的源程序里面是不是包含数据标准化了?如果包含了我是不是不需要做了。

答:

参考这个博客,对我的基于CNN的心音声谱图分类课题非常有借鉴意义
语音情感识别(二)声谱图+CRNN
里面提到 “振幅图,能量图,log能量图,debug的时候发现振幅和能量值的range还是挺大的,用log可以把range很大的值压到比较小的范围,所以我用的是log能量图。论文中提到对声谱图做一个预处理,说是可以让训练过程更加稳定,我在实现论文的时候有发现不加这个预处理结果会比较高。预处理的做法是先归一化到[-1, 1]然后做一个u为256的u率压扩,看到这里的256我估计论文是把声谱图直接保存成图像后做的归一化,而我是保存成声谱图矩阵来作为输入。”
又提到另外一篇论文是这样的处理顺序:
“分帧加窗DFT转为log能量谱,然后做0均值1标准差的归一化(根据训练集)
我大概理解:1使用log能量图声谱图比较好。2 如果将声谱图保存为图像输入CNN那么应该再做一下归一化效果会更好,如果直接保存声谱图矩阵作为CNN输入的话,不用做归一化比较好。

总结一下如果选归一化什么时候做:先生成log能量谱声谱图,再归一化,再输入进CNN中。

你可能感兴趣的:(【过拟合】深度学习卷积神经网络训练测试集准确率acc=1和验证集准确率val_acc=1 的问题分析与解决+csv文件作为深度学习标签导入+cv2.error: OpenCV(4.1.0)错误解决)