2020/5/8——5/9 参考Stack Overflow相关问题下面的回答:
stackoverflow_What does it mean when training and validation accuracy are 1.000 but results are still poor?
可能性1:Did you scale the data?(data normalization数据标准化
1.1数据标准化与数据归一化定义辨析
深度学习图像分类:首先要对图像做数据预处理——数据标准化和数据归一化。各种博客各种定义说法我都蒙了,看了这个回答觉得说的最清楚。主要内容如下:
知乎_归一化标准化辨析——nulltoall的回答
“首先要明确一下,标准化( standardization)和归一化(normalization)在ML中的概念和统计学中不太一样,容易引发歧义。两者都是特征缩放(Feature Scaling)的方法。
标准化(Standardization)又叫做Z-score normalization (是的,其实它也是一种normalization),公式是这样的
归一化(normalization)又叫做 Min-Max scaling,这个名字不容易引起歧义。它会把数据的范围限制在0到1, 而Standardization则不会把数据限定在特定范围。Standardization受异常值(outliers)的影响也较小。\”
1.2 深度学习(CNN)——选择归一化还是标准化?
深度学习图像数据标准化与归一化的特点优势:
1.图像标准化是将数据通过去均值实现中心化的处理,根据凸优化理论与数据概率分布相关知识,数据中心化符合数据分布规律,更容易取得训练之后的泛化效果, 数据标准化是数据预处理的常见方法之一
2.图像归一化不会改变图像本身的信息存储,但是通过打印出来的像素值可以发现,取值范围从0~255已经转化为0~1之间了,这个对于后续的神经网络或者卷积神经网络处理有很大的好处,tensorflow官方给出mnist数据集,全部采用了归一化之后的结果作为输入图像数据来演示神经网络与卷积神经网络。
选谁要具体情况具体分析:
知乎回答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中。
好的,现在在程序里已经写上:
img=img/255
属于图片的特别的归一化方式。还是不好使,说明不是归一化的问题。
可能性2 应该在test set 上测试一下,看看test_vcc是多少
如果很poor 说明我和上面问题的题主情况是相同的。那么下面有回答建议说,调换val set 和test set 然后观察,如果还是这样,那么有可能,你是在导入新训练好的模型的时候出错了,按理说train_acc:1.000 ,val_acc=1.000的话,test_acc应该也有不错的结果,80%甚至90%以上之类的,但是如果很poor的话,可以看看是不是模型导入出现问题了,当然也有可能是其他方面的问题。下面是原评论:
“If you have labels for your test data, then make test data your validation data and vice-versa. Repeat the experiment again. See if you get the same results. Then update here.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.
好的,运行predict程序,抽查了几个图片的预测,发现了不对劲的地方,所有图片预测结果似乎都一样。这让我开始怀疑label是不是打错了有影响。
可能性3 batchsize 大小
batchsize大小对训练有什么影响?
batch_Size 太小,算法在 200 epoches 内不收敛。
随着 Batch_Size 增大,处理相同数据量的速度越快。
随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
收敛 准确率的关系?判断模型是否收敛?
深度学习之收敛问题
深度学习中网络不收敛指的是什么?
答:loss(误差)持续波动,跳来跳去,或者保持稳定,却不能趋近一个在容忍度内的定值,进入不到容忍度内,例如认为loss<0.01就算是模型收敛了,但是你的loss却一直在0.1附近跳来跳去。
好的。改了好几次batchsize值,还是不对。so,应该不是batchsize的问题。
4网络太复杂了,数据相对来说太少所以过拟合了。
VGG16层数很多是不是过于复杂?也许使用其他稍微浅层一点的网络会更好一些?
5 原来是 label写错了
心音标签一直写的是(1,-1),因为直接套用的是之前猫狗二分类的程序,之前是(猫1,狗0)所以一直不对!
改成(1,0)1代表正常心音,0是非正常心音
果然解决了acc=1.000,val_acc=1.000的这个奇怪的问题!!!!!!
训练集准确率没有验证集高,上网查了一下,属于正常状况。可以再改变比例训练尝试一下。