精华内容
下载资源
问答
  • 最近做一个CNN,从0开始调节,终于让准确率提高到了95%。 网络结构为,两层卷积,池化,两层卷积,池化,两层全连接: 目录 打乱 优化器 BATCHSIZE(重要!) 权重初始化 其他方法 打乱 1.千万要对数据...

    最近做一个CNN,从0开始调节,终于让准确率提高到了95%。

    网络结构为,两层卷积,池化,两层卷积,池化,两层全连接:


    目录

    打乱

    优化器

    BATCHSIZE(重要!)

    权重初始化

    其他方法


    打乱

    1.千万要对数据进行shuffle,不然准确率低的令人发指。发现某一类别正确率极高,但是数据是平均分布的,怀疑shuffle出错,但是没有。。。

    优化器

    2.由于准确率一直很低,怀疑陷入局部最优,也可能是鞍点,所以采用各种优化器尝试了下,

    adam结果:

    理解:adam采用自适应优化,所以它的优势是训练快,但是问题在于更容易陷入局部最优、鞍点等!虽然SDG慢了点,但是真好用(所以那么多研究中都采用SDG)

    SDG对应tensorflow:tf.train.GradientDescentOptimizer

    ADAM对应tensorflow:tf.train.AdamOptimizer

    采用SDG方法损失函数突破1.5,(ADAM为1.9)

    BATCHSIZE(重要!)

    (我这个网络的问题主要与batchsize有关,由于此参数的不合适,学习到内容过于偏离预期!)

    3.batchsize,主要三个作用:

    • 内存利用率(只要能跑就行)
    • 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。但是盲目加大导致达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
    • 一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。但是Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。也就说容易陷入局部最优(也可以理解为如果batch_size很大会导致学习到的特征偏向于整体特征,学习到的内容不够)

    忽略异常的波动:发现合理减少batch-size后准确率提升了,损失函数值下降到新高度(batch-size=700时准确率不足40%,损失最低达到1.5)

    橙色为训练集,蓝色为验证集

    batch-size=128batch-size=32batch-size=8
    下图为batch-size=32时每个类别的正确率,发现某几个类别从一开始就学习不到(这里只有两个类别没有学习到,batch-size值更大时更多类别学习不到,尤其700时只能学习到2个类别),所以:Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化,陷入局部最优

    来一个batch-size=8对比:

    思考那是不是batch-size越小学习的内容越多,最终准确率越高?(虽然越小训练时间越长,不考虑时间的情况下:)

    batch-size=1:只学习到了2个类别,未截图

    batch-size=2:

    原理:batch-size过大,下降方向为整体方向,学习不到足够的东西,batch-size过小,每次下降方向横冲直撞,其实会偏向每个都有的特征方向,最终导致学习不到东西,无法达到预期准确率。只有合理的batch-size才能快准

    方法:观测前几代,看是否学习到足够的内容,及时停止,及时止损(batch-size可以理解成下降方向,而算法结果跟初始化权重是有关系的,所以如果在这种batch-size下,在这种下降方向下,总是落到很差的局部最优解,就及早重新来过)

    权重初始化

    4.权重初始化影响很大,不同初始化导致不同结果,多试几次。而且An Explanation of Xavier Initialization文章介绍xavier不适用于卷积初始化,适用于全连接初始化(尝试了几次,感觉没啥区别啊,想看看原理,文章怎么都找不到。。。)

    其他方法

    5.batch normlization:加入BN层,可以让权重初始化更加优秀(没有尝试过,当batch-size调整的比较好,多试几次结果就比较好了)

    6.网络调整,将网络扩宽或者加深,可以提高准确率(95%足够了,没将此网络继续进行下去)

    展开全文
  • 卷积神经网络性能优化(提高准确率

    万次阅读 多人点赞 2020-05-17 19:12:48
    神经网络是一种在很多用例中能够提供最优准确率的机器学习算法。但是,很多时候我们构建的神经网络准确率可能无法令人满意,或者无法让我们在数据科学竞赛中拿到领先名次。所以,我们总是在寻求更好的方式来改善...

    注:本文先讲解理论部分,之后会用pytorch给出示例

    神经网络是一种在很多用例中能够提供最优准确率的机器学习算法。但是,很多时候我们构建的神经网络的准确率可能无法令人满意,或者无法让我们在数据科学竞赛中拿到领先名次。所以,我们总是在寻求更好的方式来改善模型的性能。有很多技术可以帮助我们达到这个目标。本文将介绍这些技术,帮助大家构建更准确的神经网络。

    过拟合

    过拟合,典型的表现为训练集损失远远小于验证集损失。而欠拟合则表现为训练集损失大于验证集损失。

    在这里插入图片描述
    保证神经网络在测试集上运行良好的第一步就是验证神经网络没有过拟合。

    我们要清楚远远大于的概念,如果训练集损失只比验证集损失多一点点的话,同等数量级(例如0.8与0.9)这种情况下并不是过拟合的表现。我们一般遇到的过拟合应该是0.8(训练集损失)与2.0(验证集损失)这种不在一个量级的损失比。

    什么是过拟合呢?

    当你的模型开始记录训练数据而不是从中学习的时候,就发生了过拟合。然后,当你的模型遇到之前没有见过的数据时,它就无法很好的运行。为了更好地理解,我们来看一个类比。

    我们有一个记性特好的同学,假设一次数学考试马上就要来临了。你和这位擅长记忆的同学开始学习课本。这名同学记住课本中的每一个公式、问题以及问题的答案,然而你要比他来得聪明一些,所以你决定以直觉为基础、解决问题、学习这些公式是如何发挥作用的。考试来了,如果试卷中的问题是直接来源于课本的,那么可以想像那名记忆力超群的同学发挥得更好,但是,如果试题是涉及应用直观知识的全新问题,那么你将会做得更好,而你的朋友会惨败。

    如何鉴别模型是否过拟合呢?

    你仅仅需要交叉检查训练准确率和测试准确率。如果训练准确率远远高出了测试准确率,那么可以断定你的模型是过拟合了。你也可以在图中画出预测点来验证。下面是一些避免过拟合的技术:

    1. 数据正则化(L1 或 L2);
    2. Dropout:随机丢弃一些神经元之间的连接,强制神经网络寻找新的路径并泛化;

    Dropout类似于bagging ensemble减少variance。也就是投通过投票来减少可变性。通常我们在全连接层部分使用dropout,在卷积层则不使用。但要声明,dropout并不适合所有的情况,请大家不要无脑上Dropout。

    Dropout一般适合于全连接层部分,而卷积层由于其参数并不是很多,所以不需要dropout,加上的话对模型的泛化能力并没有太大的影响。如下图:
    在这里插入图片描述
    我们一般在网络的最开始和结束的时候使用全连接层,而hidden layers则是网络中的卷积层。所以一般情况,在全连接层部分,采用较大概率的dropout而在卷积层采用低概率或者不采用dropout。

    1. 早停(Early Stopping):促使神经网络训练早点停止,以减少在测试集中的误差。

    超参数调节

    在这里插入图片描述超参数是你必须给网络初始化的值,这些数值不能在训练的过程中学到。在卷积神经网络中,这些超参数包括:核大小、神经网络层数、激活函数、损失函数、所用的优化器(梯度下降、RMSprop)、批大小、训练的 epoch 数量等等。

    每个神经网络都会有最佳超参数组合,这组参数能够得到最大的准确率。你也许会问,「有这么多超参数,我如何选择每个参数呢?

    不幸的是,对每个神经网络而言,并没有确定最佳超参数组合的直接方法,所以通常都是通过反复试验得到的。但是也有一些关于上述超参数的最佳实践:

    学习率:
    选择最优学习率是很重要的,因为它决定了神经网络是否可以收敛到全局最小值。选择较高的学习率几乎从来不能到达全局最小值,因为你很可能跳过它。所以,你总是在全局最小值附近,但是从未收敛到全局最小值。选择较小的学习率有助于神经网络收敛到全局最小值,但是会花费很多时间。这样你必须用更多的时间来训练神经网络。较小的学习率也更可能使神经网络困在局部极小值里面,也就是说,神经网络会收敛到一个局部极小值,而且因为学习率比较小,它无法跳出局部极小值。所以,在设置学习率的时候你必须非常谨慎。

    比如下图利用fastai中的lr_find()函数寻找合适的学习率,根据下方的学习率-损失曲线得到此时合适的学习率为1e-2
    在这里插入图片描述如果想要了解更多,这里推荐一篇fastai首席设计师Sylvain Gugger的一篇博客:How Do You Find A Good Learning Rate以及相关的论文Cyclical Learning Rates for Training Neural Networks

    神经网络架构:
    并不存在能够在所有的测试集中带来高准确率的标准网络架构。你必须实验,尝试不同的架构,从实验结果进行推断,然后再尝试。我建议使用已经得到验证的架构,而不是构建自己的网络架构。例如:对于图像识别任务,有 VGG、Resnet、谷歌的 Inception 网络等。这些都是开源的,而且已经被证明具有较高的准确率。所以你可以把这些架构复制过来,然后根据自己的目的做一些调整。

    优化器和损失函数:
    这方面有很多可供选择。事实上,如果有必要,你可以自定义损失函数。常用的优化器有 RMSprop、随机梯度下降和 Adam。这些优化器貌似在很多用例中都可以起作用。如果你的任务是分类任务,那么常用的损失函数是类别交叉熵。如果你在执行回归任务,那么均方差是最常用的损失函数。你可以自由地使用这些优化器超参数进行试验,也可以使用不同的优化器和损失函数。

    批大小和 epoch 次数:
    同样,没有适用于所有用例的批大小和 epoch 次数的标准值。你必须进行试验,尝试不同的选择。在通常的实践中,批大小被设置为 8、16、32……epoch 次数则取决于开发者的偏好以及他/她所拥有的计算资源。

    权重初始化
    权重初始化相比于其他的trick来说在平常使用并不是很频繁。为什么呢?原因很简单,因为大部分人使用的模型都是预训练模型,使用的权重都是在大型数据集上训练好的模型,当然不需要自己去初始化权重了。只有没有预训练模型的领域会自己初始化权重,或者在模型中去初始化神经网络最后那几个全连接层的权重。那么大家喜欢用什么初始化权重算法?
    当然是kaiming_normal或者xavier_normal。

    相关论文:

    Delving deep into rectifiers: Surpassing human-level performance on ImageNet classificationUnderstanding the difficulty of training deep feedforward neural networks

    激活函数:
    激活函数映射非线性函数输入和输出。激活函数是特别重要的,选择合适的激活函数有助于模型学习得更好。现在,整流线性单元(ReLU)是最广泛使用的激活函数,因为它解决了梯度消失的问题。更早时候,Sigmoid 和 Tanh 函数都是最常用的激活函数。但是它们都会遇到梯度消失的问题,即在反向传播中,梯度在到达初始层的过程中,值在变小,趋向于 0。这不利于神经网络向具有更深层的结构扩展。ReLU 克服了这个问题,因此也就可以允许神经网络扩展到更深的层。
    在这里插入图片描述learning-rate学习率与batch-size批大小的关系
    一般来说,越大的batch-size使用越大的学习率。

    原理很简单,越大的batch-size意味着我们学习的时候,收敛方向的confidence越大,我们前进的方向更加坚定,而小的batch-size则显得比较杂乱,毫无规律性,因为相比批次大的时候,批次小的情况下无法照顾到更多的情况,所以需要小的学习率来保证不至于出错。

    可以看下图损失Loss与学习率Lr的关系:

    在这里插入图片描述当然我们也可以从上图中看出,当batchsize变大后,得到好的测试结果所能允许的lr范围在变小,也就是说,当batchsize很小时,比较容易找打一个合适的lr达到不错的结果,当batchsize变大后,可能需要精细地找一个合适的lr才能达到较好的结果,这也给实际的large batch分布式训练带来了困难。

    所以说,在显存足够的条件下,最好采用较大的batch-size进行训练,找到合适的学习率后,可以加快收敛速度。另外,较大的batch-size可以避免batch normalization出现的一些小问题:

    https://github.com/pytorch/pytorch/issues/4534
    

    如何理解深度学习分布式训练中的large batch size与learning rate的关系?

    差分学习率与迁移学习
    有关迁移学习可以看这篇博客:迁移学习 Transfer Learning—通俗易懂地介绍(常见网络模型pytorch实现)

    先说下迁移学习,迁移学习是一种很常见的深度学习技巧,我们利用很多预训练的经典模型直接去训练我们自己的任务。虽然说领域不同,但是在学习权重的广度方面,两个任务之间还是有联系的。
    在这里插入图片描述由上图,我们拿来model A训练好的模型权重去训练我们自己的模型权重(Model B),其中,modelA可能是ImageNet的预训练权重,而ModelB则是我们自己想要用来识别猫和狗的预训练权重。

    那么差分学习率和迁移学习有什么关系呢?我们直接拿来其他任务的训练权重,在进行optimize的时候,如何选择适当的学习率是一个很重要的问题。

    一般地,我们设计的神经网络(如下图)一般分为三个部分,输入层,隐含层和输出层,随着层数的增加,神经网络学习到的特征越抽象。因此,下图中的卷积层和全连接层的学习率也应该设置的不一样,一般来说,卷积层设置的学习率应该更低一些,而全连接层的学习率可以适当提高。
    在这里插入图片描述这就是差分学习率的意思,在不同的层设置不同的学习率,可以提高神经网络的训练效果,具体的介绍可以查看Transfer Learning using differential learning rates
    在这里插入图片描述
    余弦退火(cosine annealing)和热重启的随机梯度下降
    余弦就是类似于余弦函数的曲线,退火就是下降,余弦退火就是学习率类似余弦函数慢慢下降。

    热重启就是在学习的过程中,学习率慢慢下降然后突然再回弹(重启)然后继续慢慢下降。

    两个结合起来就是下方的学习率变化图:
    在这里插入图片描述更多详细的介绍可以查看知乎机器学习算法如何调参?这里有一份神经网络学习速率设置指南
    以及相关论文SGDR: Stochastic Gradient Descent with Warm Restarts

    多尺度训练
    多尺度训练是一种直接有效的方法,通过输入不同尺度的图像数据集,因为神经网络卷积池化的特殊性,这样可以让神经网络充分地学习不同分辨率下图像的特征,可以提高机器学习的性能。

    也可以用来处理过拟合效应,在图像数据集不是特别充足的情况下,可以先训练小尺寸图像,然后增大尺寸并再次训练相同模型,这样的思想在Yolo-v2的论文中也提到过:
    在这里插入图片描述需要注意的是:多尺度训练并不是适合所有的深度学习应用,多尺度训练可以算是特殊的数据增强方法,在图像大小这一块做了调整。如果有可能最好利用可视化代码将多尺度后的图像近距离观察一下,看看多尺度会对图像的整体信息有没有影响,如果对图像信息有影响的话,这样直接训练的话会误导算法导致得不到应有的结果。

    算法集成

    如果单个神经网络不像你期待的那样准确,那么你可以创建一个神经网络集成,结合多个网络的预测能力。你可以选择不同的神经网络架构,在不同部分的数据集上训练它们,然后使用它们的集合预测能力在测试集上达到较高的准确率。

    假设你在构建一个猫狗分类器,0 代表猫,1 代表狗。当组合不同的猫狗分类器时,基于单个分类器之间的皮尔逊相关系数,集成算法的准确率有了提升。让我们看一个例子,拿 3 个模型来衡量它们各自的准确率:

    Ground Truth: 1111111111
    Classifier 1: 1111111100 = 80% accuracy
    Classifier 2: 1111111100 = 80% accuracy
    Classifier 3: 1011111100 = 70% accuracy
    

    3 个模型的皮尔逊相关系数很高。所以,集成它们并不会提升准确率。如果我们使用多数投票的方式来组合这三个模型,会得到下面的结果:

    Ensemble Result: 1111111100 = 80% accuracy
    

    正如你在上面所看到的,具有低皮尔逊相关系数的弱学习器的组合优于具有较高皮尔逊相关系数的学习器的组合。

    难例挖掘 hard-negative-mining

    在任何一个深度学习任务中,我们都会遇到一些比较“棘手”的数据,这些数据相比较于其他的普通数据更难识别,这种特比容易识别错误的例子就称为hard-negative。

    举个栗子。比如Kaggle比赛中的一个识别遥感图像中船只的任务,使用的图像集是从一张大的遥感图中裁剪出来的,每张图的大小为768*768,在简单地对图像进行分类时(仅仅分类图像中有无船只),在validation中发现最容易识别出错的图如下:
    在这里插入图片描述在观察到这些最难办的图像的特征后,我们可以针对这些难办的图像采取一些方法来解决这些问题。我们先用初始的正负样本(一般是正样本+与正样本同规模的负样本的一个子集)训练分类器, 然后再用训练出的分类器对样本进行分类, 把其中负样本中错误分类的那些样本(hard negative)放入负样本集合, 再继续训练分类器, 如此反复, 直到达到停止条件(比如分类器性能不再提升)。也就是不停滴将困难样本拿去训练,让分类器更好地学习到难以学习的特征,简单来说就是熟能生巧嘛。

    在这里插入图片描述在 Fast-RCNN 中将与 groud-truth 的 IoU 在 [0.1, 0.5) 之间的图像标记为负例,[0, 0.1)的example 用于hard negative mining.在训练时一般输入为N=2张图片, 选择128个RoI,即每张图片64个RoI。对于每张图片, 按照1:3的比例来抽取RoI, 抽取正负样本的比例为1:3,要在负例中抽取48个。

    相关的两篇文章可以看一下

    [17] P. Felzenszwalb, R. Girshick, D. McAllester, and D. Ramanan. Object detection with discriminatively trained part based models. TPAMI, 2010.
    [37] K. Sung and T. Poggio. Example-based learning for viewbased human face detection. Technical Report A.I. Memo No. 1521, Massachussets Institute of Technology, 1994.
    

    数据问题

    缺乏数据
    在使用了上述所有的技术以后,如果你的模型仍然没有在测试集上表现得更好一些,这可能是因为缺乏数据。在很多用例中训练数据的数量是有限的。如果你无法收集更多的数据,那么你可以采取数据增强方法。
    在这里插入图片描述
    如果你正在使用的是图像数据集,你可以通过剪切、翻转、随机裁剪等方法来增加新的图像。这可以为你正在训练的神经网络提供不同的样本。

    数据集损坏
    数据集的好坏是算法泛化好坏的一个非常重要的前提条件,我们通常在构建深度学习的任务中,所得到的数据集一般不会是非常完美的(不论是自己搭建还是利用他人的数据,在数据集量过大的时候,数据集中难免会有图像损坏或者错误的个例)。如果有损坏的图像,如果我们不知情,一般来说,在我们使用代码读取的时候就会报错,举个例子:

    raise IOError("image file is truncated)
    

    Kaggle的一个比赛中就存在这样的情况,训练的数据中有10w+的图像数据,但是存在10余张的图像内容缺失(图像大小明显小于其他正常图像)或者直接被损坏无法读取。这个时候就需要我们自己去手动编写代码将那些错误且无法参与训练的图像挑选出来。
    在这里插入图片描述那么如果正确过滤这些图像呢?

    • 找到损坏图像的特点,例如无法读取,编写程序去除无法读取的图像
    • 找到内容缺失的图像,这样的图像大小往往比普通图像小一些,通过过滤文件大小小于某一阈值去除

    当然,数据集损坏的形式还有很多,需要我们自己去发掘。在一开始得到数据集的时候最好不要直接开始训练,应该去仔细检查自己的数据集是否有问题,这样可以避免很多之后训练时需要的处理的麻烦。

    Cross Validation 交叉验证

    在李航的统计学方法中说到,交叉验证往往是对实际应用中数据不充足而采用的,基本目的就是重复使用数据。在平常中我们将所有的数据分为训练集和验证集就已经是简单的交叉验证了,可以称为1折交叉验证。注意,交叉验证和测试集没关系,测试集是用来衡量我们的算法标准的,不参与到交叉验证中来。

    交叉验证只针对训练集和验证集。

    交叉验证是Kaggle比赛中特别推崇的一种技巧,我们经常使用的是5-折(5-fold)交叉验证,将训练集分成5份,随机挑一份做验证集其余为训练集,循环5次,这种比较常见计算量也不是很大。还有一种叫做leave-one-out cross validation留一交叉验证,这种交叉验证就是n-折交叉,n表示数据集的容量,这种方法只适合数据量比较小的情况,计算量非常大的情况很少用到这种方法。

    吴恩达有一节课The nuts and bolts of building applications using deep learning中也提到了。
    在这里插入图片描述数据增强
    数据集增强是一个老生常谈的话题了,我们为什么需要那么多数据?为什么需要数据增强技术?
    可以看这篇文章来了解一下:深度学习为什么需要那么多的数据?

    这里只简单说下我们常用的数据增强的Transform。大部分我们使用的图像增强技术一般是随机旋转,水平翻转,高斯模糊和尺度变化还有什么拉伸等blabla的操作。这些图像变化对大部分的任务是比较适合的,但针对特定的任务,存在某一簇特殊的图像增强技术可以达到比普通图像增强技术更好的效果。例如夜视图或者光照:
    在这里插入图片描述
    但也需要提个醒,并不是所有的图像增强都可以提升模型的泛化能力

    而且有些图像增强技术会对原始图像造成损失从而导致神经网络学习到错误的信息,这点是我们比较容易忽视的问题,同样重要,相关内容可以查看fastai中的图像增强技术为什么相对比较好

    TTA(Test Time Augmentation)
    最初这个概念是在fastai课程中看到的,这个过程在训练阶段不会参与,是通过在验证和测试阶段进行的。具体过程是,对所要处理的图像进行几种随机的图像增强变化,然后对每种图像增强后的图像进行预测,对预测结果取平均值。

    原理类似于模型平均,牺牲推断速度来实现推断精度的提升。
    在这里插入图片描述
    当然,这个技术也有好有坏,在我自己跑的卫星图数据集中采用TTA的精确度比不采用低了0.03个百分点。

    训练神经网络真的很像炼丹,而我们所有使用的技巧tricks,也只是增加一些炼丹的成功率,而究竟炼丹能不能成功,最终还是要取决于我们设计的算法合不合理。

    参考自:
    Rohith Gandhi
    OLDPAN

    展开全文
  • 学习了从一个只含有一层的mnist的网络,怎么使得其训练的准确率得到提高:基础的构建是输入为784个节点,输出为10个节点,准确率为0.92方式1.添加隐层,其中注意的是,隐藏的添加,要根据小于784的节点来设置(700,...
    学习了从一个只含有一层的mnist的网络,怎么使得其训练的准确率得到提高:
    基础的构建是输入为784个节点,输出为10个节点,准确率为0.92
    方式1.
    添加隐层,其中注意的是,隐藏的添加,要根据小于784的节点来设置(700,600,500,400,300,350)其中隐层节点为400的时候,其准确率为0.758。

    其中最需要注意的是,前向传播结构第二层为隐藏层输出y1与参数w2  矩阵相乘加上偏置,得到输出y。由于输出y要经过softmax函数,固就不需要激活。但前面一层输出的结果一定要需要激活。

    方式2. 

    再加了隐层的基础上,把原来数据初始化的方式进行相应的改变,从zeros()改为random_normal()生成正态随机数的方式,其准确率变为0.9467

    方式3.

    激活函数的改变,由这次mnist数据集,其sigmoid作为激活函数的准确率要略微的高于relu函数

    方式4

    给权重加正则,再加正则的时候,遇到了一些问题

    比如Failed to convert object of type <class 'function'> to Tensor


    这是因为在对权重加正则的时候要指明对哪个地方添加。tf.add_to_collection("losses", tf.contrib.layers.l2_regularizer(0.0001)(w1)),权重添加正确,其相应的准确率变为0.95左右。在此次数据中,l2正则比l1正则表现的得更好。

    方式5:增加学习率

    学习率的设置相对简单

    learning_rate = tf.train.exponential_decay(
        LEARNING_RATE_BASE,
        global_step,
        mnist.train.num_examples/BATCH_SIZE,
        LEARNING_RATE_DECAY,

        staircase = True/False)

    LEARNING_RATE_BASE=0.9,LEARNING_RATE_DECAY=0.99

    global_step=tf.Variable(0,trainable = False),其准确率就会达到98%以上

    展开全文
  • 神经网络调参,提升准确率

    万次阅读 多人点赞 2018-06-05 16:09:26
    ------如果只是调cnn网络的参数,可以看这篇文章...数据集扩增可以考虑增加数据集容量,有时候简单的增加容量,准确率提升明显2.增大数据集差异性,随机性在制作数据集时可以考虑增加数据的差异性3.tensor transform...

    ------

    如果只是调cnn网络的参数,可以看这篇文章

    http://cs231n.github.io/neural-networks-2/#init

    ------

    当初步搭建好网络,模型能出初步结果后,若想优化,可以考虑调整:

    1.数据集扩增

    可以考虑增加数据集容量,有时候简单的增加容量,准确率提升明显


    2.增大数据集差异性,随机性

    在制作数据集时可以考虑增加数据的差异性


    3.tensor transform

    pytorch 中使用transform模块对数据进行处理


    4.batch_size大小

    调整batch_size大小,可以16,32,64....这样依次往上调,寻找最适合的,当然不必要是2的倍数


    5.shuffle=True

    随机读取数据,一般在训练网络时使用,对于小数据集来说效果惊人


    6.learning rate

    可以使用动态学习率

    也可以先是大的学习率 ,然后慢慢减小,如开始是0.1,然后是0.05,每一次都对半分,寻找最合适的学习率


    7.weight_decay

    权重衰减   也称L2正则化,具体可以自行百度,哈哈哈哈


    8.n_epochs

    当准确率不再上升,可以增加学习次数,让网络充分学习,当然要防止过拟合,


    9.dropout()参数及位置

    dropout() 的参数可以从0.1开始调,以0.05为间隔,各个网络有不同的参数

    所放的位置也有很大的影响,不一定要在全连接层后


    10.参数初始化

    pytorch中会有默认的参数初始化

    如果没有,可以考虑自行初始化,有助于提高准确率


    11.网络结构(层数,每层的大小,函数)

    可以考虑增加层次,或者调整输出的大小来提高准确率



    ------

    希望各位多多留言

    ------

    展开全文
  • 卷积神经网络准确率提高后突降变很低是为什么? ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553409807_905308.png) 训练数据集分成 275 批, 前面每批 16 个数据,最后一批 15 个数据,共4399个。是...
  • 制作一个二分类的神经网络验证是否只要经过足够的迭代都能使准确率无限上升并接近1。 r1 r2 <1 <1 吸引子 c >1 ...
  • 将人工神经网络和Adaboost相结合提高绝缘子图像识别的准确率.pdf
  • 初始的代码 //载入数据集 //one_hot 转化数据某一位是1 其他位为0 ...//每个批次的大小 以矩阵形式一次性放入200张到神经网络中去 batch_size=200 //计算一共有多少个批次=总量/批次 n_batch=mnist.train....
  • 我们在看一些关于深度学习的教材或者视频时,作者(讲解者)总是喜欢...最初我在设置网络结构去训练时,准确率才40%的样子,同时不能够收敛。后来结合着一些论文对神经网路有了一定的了解,接着就开始对网络进行优化...
  • 基于卷积神经网络的验证码识别(准确率87.5%+)

    千次阅读 多人点赞 2020-05-16 11:45:09
    目录一、任务背景与目标概述二、卷积神经网络简介三、方案设计及实现过程四、实验结果及分析与讨论五、结论实现代码 一、任务背景与目标概述 随着现代网络技术的飞速发展和提高,改善了我们的生活质量,同时也给生活...
  • #train_acc = sess.run(accuracy, feed_dict={x: mnist.train.images, y: mnist.train.labels,keep_prob:1.0})#利用训练集测试模型,准确率一定很高 #打印迭代次数及对应准确率、学习率 print("Iter "+str(epoch)+...
  • 然而,利用matlab建立BP神经网络,训练结果有时候非常好,测试正确能达到98以上,有时候正确只有20~30。 ``` %训练样本 train_sample=[trainECG']; %21*25 %测试样本 test_sample=[testECG']; ...
  • 卷积神经网络用于识别手写字体,识别非常高,而且代码全有。
  • 卷积神经网络

    千次阅读 多人点赞 2019-07-04 23:30:48
      最近在研究DCGAN,需要卷积神经网络的相关知识,之前零零散散地看过一些卷积神经网络的相关博客,打算乘此机会好好做一个总结,也算是为后面的学习打下基础。   卷积神经网络主要用于图像方面的应用例如图像...
  • 查到的资料: 先留着,以后出问题还可以再回过来看 https://blog.csdn.net/u013249853/article/details/89393982 自己的解决办法: 1、emmm,数据集太杂了,一个标签里有很多有其他特征的图片,删掉就好了;???......
  • 在写论文的时候,看到很多人都是用到了召回准确度和F1值,但是不知道如何获得,本文经过查找资料终于找到解决了此问题。
  • 第五章 卷积神经网络

    千次阅读 多人点赞 2020-01-13 07:49:37
    第五章 卷积神经网络第五章 卷积神经网络卷积一维卷积二维卷积互相关卷积的变种卷积的数学性质交换性导数卷积神经网络用卷积来代替全连接卷积层汇聚层(池化层)典型的卷积网络结构参数学习误差项的计算几种典型的卷积...
  • TensorFlow 实战之实现卷积神经网络

    千次阅读 2018-02-25 21:31:51
    本文根据最近学习TensorFlow书籍网络文章...1、卷积神经网络(ConvolutionNeural Network,CNN)  19世纪60年代科学家最早提出感受野(ReceptiveField)。当时通过对猫视觉皮层细胞研究,科学家发现每一个视觉神经...
  • 关于神经网络算法的推导及手写底层的实现,在下面的超链接中详细的总结了,现在我们来用sklearn库来快速实现神经网络算法的操作。 神经网络算法的推导及手写代码实现 1、神经网络算法的调库实现 import matplotlib....
  • 如上图所示,有时候我们做训练的时候,会得到测试集的准确率或者验证集的准确率高于训练集的准确率,这是什么原因造成的呢?经过查阅资料,有以下几点原因,仅作参考,不对的地方,请大家指正。 (1)数据集太小的...
  • 1.验证集准确率val_acc>训练集准确率train_acc。查资料,属于正常情况,不过也有可能有一些问题,先观察着。 2. 随着epoch迭代,验证集准确率val_acc保持不变了!这不就是传说中过拟合的征兆吗?引用另一篇博客的...
  • 只要把学习改小变成0.1,0.05之类的就行了!
  • 神经网络的结构 神经网络模型包含三个部分:input layer(输入层)、hidden layer(中间层或隐藏层)、output layer(输出层)。其中,hidden layer的层数不固定,在某些简单问题中,hidden layer的层数可能为0,仅...
  • 一般的深度学习入门例子是 MNIST 的训练和测试,几乎就算是深度学习领域...现实开发当中的例子可没有这么简单,如果让初学者直接去上手 VOC 或者是 COCO 这样的数据集,很可能自己搭建的神经网络准确率不超过 30%。...
  • 神经网络算法

    千次阅读 2015-10-23 14:38:18
    神经网络算法  锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核。 逻辑性的思维是指根据逻辑规则进行推理的过程;它先将信息化成概念,并用符号表示,然后,根据符号运算按串行模式进行逻辑推理...
  • 主旨这篇从可视化的角度形象说明神经网络到底如何提升分类正确,不会涉及数学推导和模型原理,目的在于帮助读者建立神经网络对数据处理的形象化概念。备注这篇最初发表于我的知乎专栏:程序员深度学习笔记,结合...
  • 1.数据集太小,这样会导致数据集切分的时候不均匀,也就是说训练集和测试集的分布不均匀,如果模型能够正确地捕捉到数据...Dropout迫使神经网络成为一个非常大的弱分类器集合,这就意味着,一个单独的分类器没有太高的
  • MNIST数据集信息参考:... MNIST训练数据集包含:(1.)60000张图片的像素信息,因为神经网络的输入层表示特征的维度,所以将图像表示成一个[60000,28,28]的pixel张量;(2.)60000张图片的标签信息,表示成一个[6...
  • 为克服BP神经网络算法在故障诊断应用中的缺点,提出了粒子群优化BP神经网络的方法,并在此基础上优化BP神经网络的结构来提高准确率。最后,通过对变压器故障诊断在Matlab中的仿真结果,验证了此方法有较高的准确率和较快...
  • 如何提高图像分类准确率

    万次阅读 多人点赞 2018-02-08 06:04:27
    一、问题描述当我们在处理图像识别或者图像分类或者其他机器学习任务的时候,我们总是迷茫于做出哪些改进能够提升模型的性能(识别率、分类准确率)。。。或者说我们在漫长而苦恼的调参过程中到底调的是哪些参数。。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,646
精华内容 18,258
关键字:

神经网络提高准确率