【过拟合】深度学习卷积神经⽹络训练测试集准确率acc=1和验证集准确率
val_acc=1的。。。
2020/5/6——2020/5/7记录
1读标签
读csv⽂件作为深度学习标签
将csv⽂件另存为.csv(逗号分割)⽂件,然后⽤记事本打开,将“”,全替换成“;”(注意中英⽂,程序中和TXT⽂件中要⼀致),然后就可以在程序中对txt⽂件readlines啦。
2 改bug
python 使⽤opencv读取图⽚,解决: OpenCV(4.1.0) C:\projects\opencv-python\opencv…报错
⾸先检查⽂件路径是否正确
如果保证⽂件路径没有错误的情况下,请检查你的图⽚格式。我⽹上下的jpg格式是可以正常读取的,但是当我转化为png 就会报错!所以第⼆个原因就是你图⽚的格式问题。
挫折也美丽
(-215:Asrtion failed) !_pty() in function ‘cv::cvtColor’
出现这个问题,⼀般是路径上⾯的错误,仔细查看⾃⼰输⼊的图⽚路径是否正确
检查发现⾃⼰少写了.jpg,改正后可以正常运⾏。
3训练集与测试集准确率⼀直为1,acc=1.0 ,val_acc=1.0
搜索到以下可能性:
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 ts, 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,没⽤
采取措施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了。
没关系,我们增加数据集⼤⼩,把a-f全部放进来。
消化不良吃什么好采取措施3:增加数据集⼤⼩
还是没有解决这个问题 ⽽且第⼀轮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 = Fal
还是不太管⽤。
改后⼏层中的激活函数“relu”为“sigmoid”
⽊的⽤处…
对参数进⾏初始化——Xavier或he
降低模型复杂性?
数据增强(增⼴)?
使⽤batch normalization?
批量归⼀化。这是你永远都需要做的事情!批量归⼀化是⼀个相对较新的概念,因此在 Vgg 模型中尚未实现。
如果你对机器学习有所了解,你⼀定听过标准化模型输⼊。批量归⼀化加强了这⼀步。批量归⼀化在每个卷积层之后添加“归⼀化层”。这使得模型在训练中收敛得更快,因此也允许你使⽤更⾼的学习率。
简单地标准化每个激活层中的权重不起作⽤。随机梯度下降⾮常顽固。如果使得其中⼀个⽐重⾮常⾼,那么下⼀次训练它就会简单地重复这个过程。通过批量归⼀化,模型可以在每次训练中调整所有的权重⽽⾮仅仅只是⼀个权重。
5/8 stackoverflow 相关回答线索整理
1:Did you scale the data?(data normalization数据标准化嫩枝扦插
深度学习图像分类:⾸先要对图像做数据预处理——数据标准化和数据归⼀化蓝莓的营养价值
各种博客各种说法我都蒙了,看了这个回答觉得说的最清楚。主要内容如下:
“⾸先要明确⼀下,标准化( standardization)和归⼀化(normalization)在ML中的概念和统计学中不太⼀样,容易引发歧义。两者都是特征缩放(Feature Scaling)的⽅法。
标准化(Standardization)⼜叫做Z-score normalization (是的,其实它也是⼀种normalization),公式是这样的
归⼀化(normalization)⼜叫做 Min-Max scaling,这个名字不容易引起歧义。它会把数据的范围限制在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 analys, standardization may be especially crucial in order to compare similarities between features bad 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 uful 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的⼼⾳声谱图分类课题⾮常有借鉴意义
⾥⾯提到 “振幅图,能量图,log能量图,debug的时候发现振幅和能量值的range还是挺⼤的,⽤log可以把range很⼤的值压到⽐较⼩的范围,所以我⽤的是log能量图。论⽂中提到对声谱图做⼀个预处理,说是可以让训练过程更加稳定,我在实现论⽂的时候有发现不加这个预处理结果会⽐较⾼。预处理的做法是先归⼀化到[-1, 1]然后做⼀个u为256的u率压扩,看到这⾥的256我估计论⽂是把声谱图直接保存成图像后做的归⼀化,⽽我是保存成声谱图矩阵来作为输⼊。”
儿童剪纸图案大全⼜提到另外⼀篇论⽂是这样的处理顺序:
“分帧加窗DFT转为log能量谱,然后做0均值1标准差的归⼀化(根据训练集)”
我⼤概理解:1使⽤log能量图声谱图⽐较好。2 如果将声谱图保存为图像输⼊CNN那么应该再做⼀下归⼀化效果会更好,如果直接保存声谱图矩阵作为CNN输⼊的话,不⽤做归⼀化⽐较好。
总结⼀下如果选归⼀化什么时候做:先⽣成log能量谱声谱图,再归⼀化,再输⼊进CNN中。
>优美词