在运行任何程序之前写入下面代码(可放在主代码的开头):
#固定随机数种子 defseed_torch(seed=1029): random.seed(seed)#Python的随机性 os.environ['PYTHONHASHSEED']=str(seed)#设置Python哈希种子,为了禁止hash随机化,使得实验可复现 np.random.seed(seed)#numpy的随机性 torch.manual_seed(seed)#torch的CPU随机性,为CPU设置随机种子 torch.cuda.manual_seed(seed)#torch的GPU随机性,为当前GPU设置随机种子 torch.cuda.manual_seed_all(seed)#ifyouareusingmulti-GPU.torch的GPU随机性,为所有GPU设置随机种子 torch.backends.cudnn.benchmark=False#ifbenchmark=True,deterministicwillbeFalse torch.backends.cudnn.deterministic=True#选择确定性算法 seed_torch()
pytorch怎样确保 可重复性/每次训练结果相同(固定了随机种子,为什么还不行)?
pytorch怎样确保 可重复性/每次训练结果相同(固定了随机种子,为什么还不行)?
首先种子是不是都设置了?可以参考这里pytorchreproducibility把种子都给设置了。
种子没问题后,假如结果还是不一样可能是torch.backends.cudnn.benchmark的问题。这是python调用cudnn来加速卷积的一个机制。假如你设置这个为True的话。然后你的code出现一些地方使得这个机制被不停触发的话,可能就会导致结果不一样。我试过一个batch的loss会有小数点后第5位的差距。它被触发后,会重新判断怎样卷积最快,这个时候会使用不同的卷积方式,这样计算出来的卷积结果会有很细微的不同。但是经过很多batch,epoch的累积,最后结果就会相去甚远,1,2%不是问题。
这个时候解决方法是将torch.backends.cudnn.benchmark设置为False,然后直接加一句torch.backends.cudnn.deterministic=True。虽然在pytorch源码torch.backends.cudnn.benchmark?!里面,假如deterministic设置为True即使benchmark也为True还是会返回默认的卷积算法。(但是亲测,两个都设置为True的情况下,无法固定训练结果,所以必须benchmark设置为False,deterministic设置为True)。在一般情况下,这样设置后,就失去了加速的效果,可能导致程序运行变慢。Reproducibility-PyTorchmasterdocumentationpytorch官方文档的warning中有提到
但是在这种情况下,这样设置可能速度会更快,原因是torch.backends.cudnn.benchmark设置为True后(在torch.backends.cudnn.deterministic没有设置,或者为False)的情况下,出现了某些因素使得这个机制不停被触发,而每次触发都会导致有一个耗时的优化搜索时间。
想要最终解决这个问题是找一下代码中哪些因素导致了这个机制被不停地触发。因为一般情况下,即网络卷积架构不会在运行的时候改变,输入的B,C,H,W不会不停改变,这个机制只会在最开始的时候触发一次。所以训练过程是确定的,训练结果不会改变。所以问题可能出现在代码输入上面,比如batch_size改变(边训练边验证,batchsize大小不一样;dataloader加载最后一个batch的时候数量不足batch_size个<可使用drop_last=True来避免>)等等都会触发重新优化。
还有一种可能性,假如你在不同平台上,或者不同GPU,CPU上跑模型的话,那么就算前面的benchmark、deterministic、种子全部都设置对了的话都会导致训练结果不同。因为pytorch是基于CUDAAPI的,CUDA在不同设备上的伪随机数生成器不会是完全一样的,这是由设备决定的。可以参考这3个issues
DifferentdeterministicbehaviorbetweenCPUandCUDAfororthogonalinitialization·Issue#19013·pytorch/pytorch
Dropoutbehavesdifferentlyondifferentdevices·Issue#25690·pytorch/pytorch
Completelydeterministicnetwork,butresultisdifferentfromthepastanddifferentondifferentmachines.·Issue#18412·pytorch/pytorch
最后一种可能性是使用了一些CUDA本来就不会产生确定性结果的操作,如AtomicAdd、上采样(torch.nn.Upsample,Unet中常用到)等。较新版本的pytorch现在支持对这种操作的检查,只需要在代码中加入一行torch.use_deterministic_algorithms(True)。这句话相当于自检,只要使用了不可复现的运算操作,代码就会自动报错。
github上有一个RFCissue是关于训练确定性的
RFC:Addtorch.experimental.deterministicflagtoforcedeterministicalgorithms·Issue#15359·pytorch/pytorch
主要参考:
Reproducibility-PyTorchmasterdocumentation
一个测试系统,测量出两组数据,怎样使用数理统计工具来估计或者计算该测试系统的稳定性/重复性?
应用于机器学习的15个统计假设测试速查指南,附Python代码
尽管在日常开发中会用到数以百计的统计假设测试,但在机器学习实际项目中可能只需要使用到其中一小部分。
在本文中,将涵括最流行的PythonAPI的机器学习项目统计假设测试的备忘单。
每项统计测试均以下述统一的方式给出,包括:
测试名称测试检测内容测试的关键假设怎样解释测试结果用于测试的PythonAPI。注:当涉及到数据的预期分布或样本大小这样的假设时,即使在不满足假设的情况下,给定测试的结果虽然可能会不尽如人意,但是也不会无法使用。
通常,数据样本域必须足够大,以便能够分析出它们的分布。
在某些情况下,可以对数据进行校正以满足假设,例如:可以通过删除异常值将接近正态分布修正为正态分布,或在样本有不同方差时使用对自由度的修正。
最后,可能会对某一特定问题进行多项测试,例如:正态化。有时不能用统计数据直接得出清晰的答案,测试后得到的答案却是概率。为此,可以利用不同的方式考虑同一问题,得出不同的答案。所以,对于某些数据问题,需要进行多个不同的测试。
在我的新书中会涉及:统计假设检验、重采样方法,估计统计和非参数方法,并附有有29个进阶教程和完整的源代码。让我们开始吧。
教程概述
本教程分为以下四部分:
1.正态性测试
1.Shapiro-Wilk测试
2.D’Agostino’sK^2测试
3.Anderson-Darling测试
2.相关性测试
1.Pearson相关系数
2.Spearmans序相关性
3Kendall序相关性
4Chi-Squared测试。
3参数统计假设测试
1.学生t测试
2.配对学生t测试
3.方差分析测试(ANOVA)
4.重复测量方差分析(ANOVA)测试
4.非参数统计假设测试
1.Mann-WhitneyU测试
2.Wilcoxon带符号序测试
3.Kruskal-WallisH测试
4.Friedman测试
1.正态性测试
本节所列出的统计测试,可以利用它们来检查数据是否为高斯分布。
Shapiro-Wilk测试
测试数据样本是否为高斯分布。
假设:
各样本中的观察数据独立同分布(iid)。解释:
H0:样本为高斯分布。H1:样本为非高斯分布。Python代码。
详细信息请参考:scipy.stats.shapiro维基百科:Shapiro-Wilk测试D’Agostino’sK^2测试
测试数据样本是否为高斯分布。
假设:
各样本中的观察数据独立同分布(iid)。
解释
H0:样本为高斯分布。
H1:样本为非高斯分布。
Python代码
详细信息请参考:
scipy.stats.normaltest维基百科:D’Agostino’s$K$-squared测试Anderson-Darling测试
测试数据样本是否为高斯分布。
假设
·各样本中的观察数据独立同分布(iid)。
解释
H0:样本为高斯分布。
H1:样本为非高斯分布。
Python代码
详细信息请参考:scipy.stats.anderson维基百科:Anderson-Darling测试2.相关性测试
本节所列出的统计测试,可利用它们来检查两个样本是否相关。
Pearson相关系数
检验两个样本是否线性相关。
假设:
·各样本中的观察数据独同分布(iid)。
·各样本中的观测数据呈正态分布。
·各样本的观测数据有相同的方差。
解释
·H0:两个样本之间相互独立。
·H1:样本之间存在依存关系。
Python代码
详细信息请参考:scipy.stats.pearsonr维基百科:Pearson相关系数Spearman序相关性
测试两个样本是否存在单调关系。
假设
·各样本中的观察数据独立同分布(iid)。
·各样本中的观测数据可以进行排序。
解释
·H0:两个样本之间相互独立。
·H1:样本之间存在依存关系。
Python代码
详细信息请参考:
scipy.stats.spearmanr维基百科:Spearman序相关系数Kendall序相关性
测试两个样本是否存在单调关系。
假设
各样本中的观察数据独立同分布(iid)。各样本中的观测数据都可以进行排序。解释
H0:两个样本之间相互独立。
H1:样本之间存在依存关系。
Python代码。
详细信息请参考:
scipy.stats.kendalltau维基百科Kendall序相关系数Chi-Squared测试
测试两个范畴变量是相关的还是独立的。
假设
·计算相依表时使用的观察数据是独立的。
·相依表的每个单元格中至少有25个例子。
解释
·H0:两个样本之间相互独立。
·H1:样本之间存在依存关系。
Python代码
详细信息请参考:
scipy.stats.chi2_contingency维基百科:Chi-Squared测试3.参数统计假设测试
本节列出了可用于比较数据样本的统计测试。
学生t测试
测试两个独立样本的均值是否有显著不同。
假设
·各样本中的观察结果独立同分布(IID)。
·各个样本中的观察数据呈正态分布。
·各样本中的观察数据具有相同的方差。
解释
·H0:样本的均值相等。
·H1:样本的均值不等。
Python代码
详细信息请参考:
scipy.stats.ttest_ind维基百科:Student’st-test测试成对的学生t测试
测试两个样本对的均值是否存在显着性差异。
假设
·各样本中的观测数据是独立同分布的(Iid)。
·各样本中的观测数据呈正态分布。
·各样本的观测数据有相同的方差。
·各样本的观测数据成对出现。
解释
·H0:样本的均值相等。
·H1:样本的均值不等。
Python代码
详细信息请参考:
scipy.stats.ttest_rel维基百科:Student’st-test测试方差分析(ANOVA)测试
测试两个或多个独立样本的均值是否存在显着性差异。
假设
·各样本中的观测数据独立同分布(Iid)。各样本中的观测数据呈正态分布。各样本的观测数据有相同的方差。解释
·H0:样本的均值相等。
·H1:一个或多个样本的均值不等。
Python代码
重复测量方差分析(ANOVA)测试
测试两个或更多样本对的均值是否存在显着性差异。
假设
各样本中的观测数据独立同分布(Iid)。各样本中的观测数据呈正态分布。各样本的观测数据有相同的方差。各样本的观测数据成对。解释
·H0:样本的均值相等。
·H1:一个或多个样本的均值不等。
Python代码
目前Python不支持这种测试。
4.非参数统计假设测试
MannWhitneyU测试。
测试两个独立样本的分布是否相等。
假设
·各样本中的观测数据为独立同分布的(Iid)。
·可对各样本中的观察数据进行排序。
解释
·H0:样本之间同分布。
·H1:样本之间分布不同。
Python代码
详细信息请参考:
scipy.stats.mannwhitneyu维基百科:Mann-WhitneyU测试Wilcoxon带符号–序测试
测试样本对的分布是否相等。
假设:
各样本中的观测数据为独立同分布(Iid)。可对各样本中的观察数据进行排序。各样本的观察数据是成对的。解释
H0:样本之间同分布。
H1:样本之间的分布不等。
Python代码。
详细信息请参考:
scipy.stats.wilcoxon维基百科signed-rank测试Kruskal-WallisH测试
测试两个或多个独立样本的分布是否相等。
假设
·各样本中的观察数据独立同分布(IID)。
·可对各样本中的观察数据进行排序。
解释:
·H0:所有样本同分布。
·H1:一个或多个样本的分布不相同。
Python代码
详细信息请参考:
scipy.stats.kruskal维基百科Kruskal-Wallis方差分析Friedman测试
测试两对或多对样本的分布是否相等。
假设
·各样本中的观察数据独立同分布(IID)。
·可对各样本中的观察数据进行排序。
·各样本的观测数据成对。
解释
·H0:所有样本同分布。
·H1:一个或多个样本的分布不同。
Python代码
详细信息请参考:
scipy.stats.friedmanchisquare维基百科Friedman测试课外阅读
如果想深入了解本专题的话,本节给出了更多关于本主题的参考资料。
·Python正态测试通论·怎样利用相关性来理解变量之间的关系?怎样利用Python进行的参数统计测试?统计假设测试通论总结
在本教程中,对机器学习项目中可能需要用到的重要的统计假设测试做了介绍。
具体而言,通过本文可以了解到:
在不同应用环境下使用到的不同种类的测试,如:正态性检查、变量之间的关系和样本之间的差异。每个测试的关键假设以及怎样解释测试结果。·怎样使用PythonAPI实现该测试。还有问题吗?
可在下面的评论中提出你的问题,我会尽量作答。
我是否遗漏了一项重要的统计测试?或者遗漏了列表中的测试的关键假设?请在下面的评论中告诉我。
密度重复性误差计算?
测量物质密度”的实验是初中物理最主要的一个实验。下面就从误差的分类和来源两各方面来分析常见的几种实验方法中的误差产生原因和减小误差的方法。
一、、测量固体密度
(一)测量规则固体的密度:
原理:ρ=m/V
实验器材:天平(带砝码)、刻度尺、圆柱体铝块。
实验步骤:1、用天平测出圆柱体铝块的质量m;
2、根据固体的形状测出相关长度(横截面圆的直径:D、高:h),
由相应公式(V=Sh=πD2h/4)计算出体积V。
3、根据公式ρ=m/V计算出铝块密度。
误差分析:
1、产生原因:(1)测量仪器天平和刻度尺的选取不够精确;
(2)实验方法不完善;
(3)环境温度和湿度因素的影响;
(4)测量长度时估读和测量方法环节;
(5)计算时常数“π”的取值等。
2、减小误差的方法:
(1)选用分度值较小的天平和刻度尺进行测量;
(2)如果可以选择其他测量工具,则在测量体积时可以选择量筒来测量体积。
(3)测量体积时应当考虑环境温度和湿度等因素,如“热胀冷缩”对不同材料的体积影响。
(4)对于同一长度的测量,要选择正确的测量方法,读数时要估读到分度值的下一位,且要多测量几次求平均值。
(5)常数“π”的取值要尽量准确等。
(二)测量不规则固体的密度:
原理:ρ=m/V
实验器材:天平(带砝码)、量筒、小石块、水、细线。
实验步骤:
1、用天平测出小石块的质量m;
2、在量筒中倒入适量的水,测出水的体积内V1;
3、用细线系住小石块,使小石块全部浸入水中,测出总体积V2;
4、根据公式计算出固体密度。ρ=m/V=m/(V2-V1)
误差分析:
1、产生原因:
(1)测量仪器天平和量筒的选取不够精确;
(2)实验方法、步骤不完善;
(3)环境温度和湿度等因素的影响;
2、减小误差的方法:
(1)选用分度值较小的天平和刻度尺进行测量;
(2)测量小石块的质量和体积的顺序不能颠倒;
(3)选择较细的细线;
(4)测量体积时应当考虑环境温度和湿度等因素,如“水的蒸发”等因素对的体积影响。
(5)测量质量和体积时,要多测量几次求平均值。
误差分析:
1、产生原因
(1)测量仪器天平的选取不够精确;
(2)实验方法、步骤不完善;
(3)环境温度和湿度等因素的影响。
2、减小误差的方法
(1)选用分度值较小的天平进行测量;
(2)测量小石块的质量和体积的顺序不颠倒;
(3)选择较细的细线;
(4)测量体积时应当考虑环境温度和湿度等因素,如“水的蒸发”等因素对的体积影响、“水质(选用纯净水)”因素对水的密度的影响等。
(5)测量质量时,要多测量几次求平均值。
四、测量液体密度
原理:ρ=m/V
方法一:
实验器材:天平、量筒、烧杯、水、盐。
实验步骤:
1、用天平测出空烧杯的质量m1;
2、在烧杯中倒入适量的水,调制出待测量的盐水,用用天平测出烧杯和盐水的总质量m2;
3、将烧杯中的盐水全部导入量筒中测出盐水的体积V;
4、根据公式ρ=m/V=(m2-m1)/V计算出固体密度。
误差分析:
1、产生原因:
(1)测量仪器天平和量筒的选取不够精确;
(2)实验方法、步骤不完善;
(3)环境温度和湿度因素的影响;
2、减小误差的方法
(1)选用分度值较小的天平和量筒进行测量;
(2)尽量将烧杯中的水倒入量筒中;
(3)测量体积时应当考虑环境温度和湿度等因素,如“水的蒸发”等因素对的体积影响。
(4)测量质量和体积时,要多测量几次求平均值。
说明:
该试验方法中因为无法将烧杯中的水全部倒入量筒中,在烧杯内壁上或多或少会残留一些水,还有不好控制水的多少,所以实验误差较大,建议一般不选择此方法测量液体密度。
方法二:
实验器材:天平、量筒、烧杯、水、盐。
实验步骤:
1、在烧杯中倒入适量的水,调制出待测量的盐水,用天平测出烧杯和盐水的总质量;
2、将适量的盐水倒入量筒中,测出量筒中的盐水的体积;
3、用天平测出剩余的盐水和烧杯的总质量;
4、根据公式ρ=m/V=(m2-m1)/V计算出盐水的密度。
误差分析:
1、产生原因:
(1)测量仪器天平和量筒的选取不够精确;
(2)环境温度和湿度因素的影响;
2、减小误差的方法
(1)选用分度值较小的天平和量筒进行测量;
(2)测量体积时应当考虑环境温度和湿度等因素,如“水的蒸发”等因素对的体积影响;
(3)测量质量和体积时,要多测量几次求平均值。
msa多少值判定合格?
1、量具分辨率大于等于5;
2、重复性和再现性误差小于等于10%;
3、重复性和再现性误差在10%-30%时,可以考虑接受,但需要提交改进措施;
4、量具的最小读数应大于公差的1/10,即是向1/20这种方向靠拢。