精华内容
下载资源
问答
  • 救救孩子吧,孩子的头都快秃了 ... 具体就是这样,一张图就能说明问题,不管我给了10000张图,还是给了2000张,不管我的损失函数和激活函数怎么变,始终是这个曲线(其实应该更加的平稳) 代码在下面(我用的是jupyter ...
  • 问题2描述:resnet50迁移学习,最终训练集上的准确率一直在攀升,但验证机上的准确率一直上不去,在一定程度上出现了过拟合现象,但加很多的BN、dropout、l1和l2正则化手段都不能有效的解决问题。 ...

    keras之resnet50迁移学习做分类

    问题1描述:迁移学习用resnet50做分类,验证集上的准确率一直是一个大问题,有时候稳定在一个低的准确率,我的一次是一直在75%上下波动。

    问题2描述:resnet50迁移学习,训练集上的准确率一直在攀升,但验证集上的准确率一直上不去,一定程度上出现了过拟合现象,但加很多的BN、dropout、l1和l2正则化手段都不能有效的解决问题。

    ***问题1答案:***这个问题网络设计没有问题的话,一般出现在训练的数据量上,数据量偏少就会出现验证集上准确率一直很低。

    问题2答案:

    2020/10/12更新

    根本原因可参考:https://github.com/keras-team/keras/pull/9965
    解决方案:在这里插入图片描述其实就是加一个参数:layers=tf.keras.layers

    下面的采坑可不看

    --------------------------------------------

    -----------------------------------------------

    先来看一下一般resnet50迁移学习的网络设计:

     base_model = ResNet50(weights='imagenet', include_top=False,
                                  input_shape=(image_size, image_size, 3), )
    x = base_model.output
    x = GlobalAveragePooling2D(name='average_pool')(x)
    x = Flatten(name='flatten')(x)
    

    这是一个典型的残差网络做迁移学习的套路,很多人都是这么做的,但真的有很高的准确率吗?反正我试了很多次,一直出现验证集上的准确率很低上不去的问题。不管怎么用防止过拟合的手段,效果都不是很好。后来研究BN层看了几篇相关的论文,发现包括resnet,inception等模型都包含了Batch Normalization层,如果使用pretrained参数进行finetune,这些BN层一般情况下使用了K.learning_phase的值作为is_training参数的默认值,因此导致训练的时候使用的一直是mini batch的平均值 ,由于trainable在finetune时候一般设置为false了导致整个layer 不会update,因此moving_mean\variance根本没有更新。导致你在test时用的moving_mean\variance全是imagenet数据集上的值。
    参考链接:https://github.com/keras-team/keras/pull/9965
    修正后的代码:

    K.set_learning_phase(0)
    base_model = ResNet50(weights='imagenet', include_top=False,
                                  input_shape=(image_size, image_size, 3), )
     K.set_learning_phase(1)
    x = base_model.output
    x = GlobalAveragePooling2D(name='average_pool')(x)
    x = Flatten(name='flatten')(x)
    x = Dense(2048, activation='relu', kernel_regularizer=regularizers.l2(0.0001), )(x)
    x = BatchNormalization()(x)
    x = Dense(1024, activation='relu', kernel_regularizer=regularizers.l2(0.0001))(x)
    x = BatchNormalization(name='bn_fc_01')(x)
    predictions = Dense(num_classes, activation='softmax')(x)
    model = Model(inputs=base_model.input, outputs=predictions)
    

    这样更正后可以使得准确率有一个良好的上升,但优化的不够彻底,再有一些小的技巧可以让你的验证集上的准确率有更好的提升。这是一个试验,没有理论支持,如果上述的方案不能满足你对准确率的要求,不妨试试下面这个方案:

    K.set_learning_phase(0)
    Inp = Input((224, 224, 3))
    base_model = ResNet50(weights='imagenet', include_top=False,
                                  input_shape=(image_size, image_size, 3), )
     K.set_learning_phase(1)
     x = base_model(Inp)
    x = GlobalAveragePooling2D(name='average_pool')(x)
    x = Flatten(name='flatten')(x)
    ...
    predictions = Dense(num_classes, activation='softmax')(x)
    model = Model(inputs=Inp, outputs=predictions)
    

    可看出区别了吗?下面代码将输入变更了,不用resnet的输出做输入,直接定义自己的输入,我有测试过,这样做确实对准确率有一定的提升。基本上resnet50迁移学习的坑就踩到这里。

    展开全文
  • 最近在做一个图片分类的问题,测试集的准确率总是上不去,主要是和训练集差的也太大了,大佬可以给一些建议吗?


    最近在做一个图片分类的问题,测试集的准确率总是上不去,主要是和训练集差的也太大了,大佬可以给一些建议吗?

    展开全文
  • 损失函数一直在下降,为什么识别率上不去。 1.最常见的原因:过拟合 过拟合值得单独开个章节。主要包括 1.数据量小,网络复杂 2.learning rate 比较高,又没有设置任何防止过拟合的机制 解决方法主要包括 1....

    损失函数一直在下降,为什么识别率上不去。

    ----------------2021-01-08更新-----------------------

    0.学习率设置太高,一个epoch直接收敛,所以损失不会下降

    比如学利率一开始设置为1,因为下降太快,那么很有可能在一个epoch旧完全收敛。所以看到的validation数值并不下降,第一个epoch就已经处于谷底了。所以如果使用的是系统默认的学习率,最好检查下默认值是什么。

     

    -------------------旧---------------------------------------

    1.最常见的原因:过拟合

    过拟合值得单独开个章节。主要包括

    1.数据量小,网络复杂

    2.learning rate 比较高,又没有设置任何防止过拟合的机制

    解决方法主要包括

    1.简化模型,利用现有深度学习手段增加数据(翻转,平移,随机裁剪,imgaug)

    2.利用 dropout层

    3.利用正则化

    2.你犯了错误:没有把数据规格化

    图片的话,img/255是肯定的

    3.你犯了错误:没有在分验证集之前打乱数据

    因为validation_split操作不会为你shuffle数据,所以如果你的数据前一半标签全是1 ,后一半全是0,validation=0.5。恭喜你,你压根也分不对,你的validation准确率会一直为0.因为你拿所有的正样本训练,却想判断负样本。

    4.你犯了错误,数据和标签没有对上

    有可能再读取自定义的数据库的时候出现问题,导致数据与标注不对应。比如第一张图片用第十张的标注

    5.你的训练数据太少,validation数据太多,类别也太多

    比如4000张训练,1000张validation,300类,这显然就是不合理的。

    遇到这种情况,建议:

        1.使用别的大的数据集预训练

        2.使用DATA augment

        3.可以考虑迁移学习

     

    6.最好使用预训练的权重

    大多数流行的backone比如resnet都有再imagenet数据集上与训练过,那么使用这种权重,比起随即重新训练,显然要可靠不少注意调整学习率。

    7.网络结构有问题

    可以通过使用现在流行的网络(resnet,unet等)替入你的代码,如果结果没有问题,你的结果有问题那么肯定就是你网络结构出问题了。那么可以通过逐层注释掉排查究竟哪里出了问题

    7.1 网络最后一层没有使用正确的激活函数

    比如多类的应该使用softmax

    8.relu后面是softmax

    有一些说法是relu由于对于很大的数值直接复制,所以会对softmax产生不好的影响,从而输出不好的结果。所以可以使用tanh代替relu。

    9.batch normalization需要batch size至少16张

    https://mp.csdn.net/postedit/89456400

    由于做dense prediction图片通常比较大。所以一个batch一般都只有1-2张图片,不建议使用 BN。

    因为BN一般是16张图片以上一起跑。所以吧,如果是BN,那么请用多GPU,16以上的batch size。s

    另外keras TF1.x可能会出问题,https://github.com/keras-team/keras/pull/9965

    10.你犯了错误,你可能设置了一些参数是不可训练的

    在训练语句之前,检查以下你的trainable参数,是否设置了一些参数是不可训练的。这还可能导致你的输出只能是一个值,比如永远预测为标注0,因为你只有一点点的参数,而这并不是一个模型(比如只有100个参数是可以训练的,太简单了,无法模拟)。

     

    11.附送一个调参论文

    Bag of Tricks for Image Classification with Convolutional Neural Networks

    https://arxiv.org/abs/1812.01187

    NLP 独有错误 

    最傻的错误,比如train和val使用了不一样的字典,那效果能好才怪了。。。。

    展开全文
  • 这个准确率极低,基本就算不上有准确的说法了。加载模型主要是对故障进行分类,输出故障标签,每次运行结果都一样,输入的时候用的是测试。 下面是我加载模型测试的代码,求大家帮忙指点 ``` import csv ...
  • <div><p>该提问来源于开源项目:bubbliiiing/faster-rcnn-keras</p></div>
  • 不过昨天那个对半划分数据集,一半作为训练集,一半作为验证集的划分方式效果实在是令人敢恭维。。。我是死了心这么分了。到时候毕设答辩的时候拿这个说简直就是丢死人了。 正文 我这次采用的是以前的那一拨...

    正文之前

    昨天好不容易心气爆发,肝了一会儿的毕业设计,也算是初步走上了正轨,很是期待后面完成之后我自己回首会是怎样一般场景了!不过昨天那个对半划分数据集,一半作为训练集,一半作为验证集的划分方式效果实在是令人不敢恭维。。。我是死了心这么分了。到时候毕设答辩的时候拿这个去说简直就是丢死人了。

    正文

    我这次采用的是以前的那一拨钢板的数据集,清洗数据后剩下六个属性,分类也分为六类。这就构成了这个1940条记录的数据集。但是因为数据的分类过于集中。很是让人烦恼!

    诸君请看,前面的这些异常分类都是0,也就是对应的故障列表的第一项:

    String[] Fault = new String[]{"Pastry","Z_Scratch","K_Scatch","Stains","Dirtiness","Bumps","Other_Faults"};
    复制代码

    mysql> select min(id) from steelplate where Fault=1;
    +---------+
    | min(id) |
    +---------+
    |     158 |
    +---------+
    1 row in set (0.01 sec)
    复制代码

    分类为1 的最小的记录编号都已经到了158了。所以我选择交叉获取数据的方式分配训练集和数据集。即第一条到训练集,第二条到验证集。这样下来尚且算是分配均匀了。

    不过各位看看最终的实验效果就知道。。我这个分配均匀到底有多坑了!

    准确率0.51。。。。堪堪过半!!简直无敌自容了好吗?!!!!所以今天我准备修改训练集和验证集 的比例,调成4:1左右的话会不会好一点呢?肯定会的好吗?这时候训练集有1552,测试集388。而且继续采用交叉办法,肯定能有较好的效果了!

    不过,我还没开始呢。。。所以先放0.51的代码。然后下面再来一篇放另外的吧!!

    //读取测试集和验证集的方法
       public Object[][] readTrainData() {
            int columnCount=0;
            try {
                mysql.Connect();
                Statement statement=mysql.getStatement();
                String GETCOLUMN="select max(id) from steelplate";
                String getDataQuery="";
                Object[][] DataTrain;
                ResultSet answer = statement.executeQuery(GETCOLUMN);
                if(answer.next())
                    columnCount  = answer.getInt(1);
                DataTrain = new Object[columnCount/2][7];
                for (int  i = 0;i<columnCount/2;++i) {
                    getDataQuery = getSelectQuery(Name,"steelplate",i*2);
                    ResultSet select_ok;
                    select_ok = statement.executeQuery(getDataQuery);
                    select_ok.next();
                    for (int j = 0; j<7;++j){
                        DataTrain[i][j]=select_ok.getObject((String) Name[j]);
                    }
                }
                statement.close();
                mysql.Dis_Connect();
                return DataTrain;
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return new Object[1][1];
        }
    
        public Object[][] readTestData() {
            int columnCount=0;
            try {
                mysql.Connect();
                Statement statement=mysql.getStatement();
                String GETCOLUMN="select max(id) from steelplate";
                Object[][] DataTest;
                ResultSet answer = statement.executeQuery(GETCOLUMN);
                if(answer.next())
                    columnCount  = answer.getInt(1);
                DataTest = new Object[columnCount/2][7];
                for (int  i = 0 ;i<columnCount/2-1;++i) {
                    String getDataQuery = getSelectQuery(Name,"steelplate",i*2+1);
                    ResultSet select_ok;
                    select_ok = statement.executeQuery(getDataQuery);
                    select_ok.next();
                    for (int j = 0; j<7;++j){
                        DataTest[i][j]=select_ok.getObject((String) Name[j]);
                    }
                }
                statement.close();
                mysql.Dis_Connect();
                return DataTest;
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return new Object[1][1];
        }
    复制代码

    下面是读取验证集并且计算正确率的函数

    else if(command.toLowerCase().equals("autotest")){
                if (TData.isEmpty()){
                    jl12.setText(Space+"Please Open the Test File to load the Data!");
                    return;
                }
                else {
                    for (int i=0;i<TData.size();++i) {
                        Object[] test = TData.get(i).split(" ");
                        String res="";
                        res=TestData.TestData(tree, Test_Names,test,res);
                        if (res.contains(":")){
                            String Fault = res.substring(res.indexOf(":")+1);
                            Fault = Fault.trim();
                            String Fa = FaultMap.get(Fault);
                            if(Fa.equals((String) test[test.length-1])){
                                RightCount++;
                            }
                            else {
                                FaultCount++;
                            }
                        }
                        else {
                            FaultCount++;
                        }
                    }
                    System.out.println(RightCount+" "+FaultCount);
                    jl12.setText(Space+"准确率: "+((float)RightCount/(float)(RightCount+FaultCount)));
                    RightCount = 0;
                    FaultCount = 0;
                }
            }
    复制代码

    另外还有一个故障编号Map

        public  Map<String,String> FaultMap = new HashMap<String,String>();
            FaultMap.put("Pastry","0");
            FaultMap.put("Z_Scratch","1");
            FaultMap.put("K_Scatch","2");
            FaultMap.put("Stains","3");
            FaultMap.put("Dirtiness","4");
            FaultMap.put("Bumps","5");
            FaultMap.put("Other_Faults","6");
    复制代码

    正文之后

    溜了溜了。。。我室友借我车去吃饭,结果半路上跟外卖小哥来了段相爱相杀,求问这种时候我室友还垫付了200+的医药费,万一外卖小哥纠缠报警的话会吃亏不?外卖小哥的车技一向是。。。生死时速的!

    展开全文
  • 这也能解释为什么评论里到处都是问准确率的问题,拿着一个有问题的训练集当然训练不好。 最后需要指明一点的是,这个代码所需要的GPU性能还是挺高的,尤其是显存要求。我自己的使用数据集(...
  • 目前多数机器学习算法在平衡数据集上的分类预测准确率和灵敏度都相对较差。为了能准确识别异常数据,以煤矿分布式光纤竖井变形监测系统采集的数据为研究对象,提出了一种面向平衡数据、基于重复下采样(RDU...
  • 1. 当训练集的效果(准确率上不去,和贝叶斯估计(人的表现)存在一定差距的时候:(1)增加模型的复杂 度。 或者直接多加几层。(2)现在目前效果非常好的一些模型:resnet,inception等。(3)重新选择优化函 ...
  • 训练过程--对loss和acc的分析、处理

    万次阅读 多人点赞 2018-12-06 14:10:33
      其实你这个问题就是个伪命题,如果我们刻意的训练集上拟合模型,使其准确率达到很高的高度,或者说尽量在验证集合表现的好,都是相悖的。   因为我们能为了某一特定数据集来刻意拟合,因为模型预测...
  • 训练过程–对loss和acc的分析、处理。...其实你这个问题就是个伪命题,如果我们刻意的训练集上拟合模型,使其准确率达到很高的高度,或者说尽量在验证集合表现的好,都是相悖的。   因为我们...
  • 本次实验中,我使用的是keras的vgg16模型,然后再添加了三层全连接层对花进行识别,50个epoch后在验证集中的准确率为87.63,不算很好,但有由于确实太耗费时间了,就太想重新调参然后训练了,就只能勉强接受了。...
  • 过拟合、欠拟合 -你需要了解的概念

    万次阅读 2018-08-27 21:26:20
    直接点,训练集中特别是十几万的数据,会有脏数据,这些脏数据也成为负样本,会造成模型训练有误差,模型在训练的时候并清楚那些是脏数据,它只会不停的拟合这些数据,所以过拟合的模型在训练集上准确率特别高,...
  • 针对日前在互联网中被广泛使用的验证码,提出将卷积神经网络引入到验证码识别之中。通过设计新的卷积网络拓扑结构,针对...最终实验研究证实卷积神经网络对于可分割及可分割验证码的平均识别准确率均收敛于99%左右。
  • 通过多次进行上述抽样形成多个训练集合,使用Bagging方法集成在多个训练集合获得的分类器来提高有效信息的利用。实验表明,该算法较几种现有算法不仅能够提高少数类样本的分类性能,而且能够有效提高整体分类...
  • 训练集:loss:0.384,acc:0.931. 验证集:loss:0.212,acc:0.968. 训练完在同一session内的测试集:acc:0.96。导入保存的模型进行测试:acc:0.29 ``` def create_model(hps): global_step = tf....
  • ResNet在2015年被提出,在ImageNet比赛classification任务获得第一名,因为它“简单与实用...随着网络的加深,出现了训练集准确率下降的现象,我们可以确定这不是由于Overfit过拟合造成的(过拟合的情况训练集应该准确
  • 测试样本准确率上不去,一般还有什么办法么,我训练样本5千个的时候,测试样本准确率停留在0.2左右,后来我把训练样本增加到两万了,测试准确率提升到了0.6,但是我现在把训练...
  • 训练集在0.99或者1,测试集在0.95上不去了,测试集的loss也大得多。还有什么方法能再提高测试集的准确率或者减小过拟合吗? 这里可以看到这位同学已经探索了一些方法,可以继续使用dropout和正则化来抑制过拟合问题...
  • 在复现resnetv2的时候遇到了BN保存的问题,直接导致的结果就是训练集收敛很快,测试集准确率上升缓慢甚至上不去。查解决方案的时候看到网上也同样有不少同道中人,如果你试了很多方法还不管用,建议你试试本文所述的...
  • Fine-tuning(Finetune|微调)很多时候,我们的电脑跑了那么多的数据,就可以下载别人已经训练好的网络进行第二次训练,达到准确率更高,或者增加一个新的类别,让我们一步一步来。在原有数据集上进行微调我们之前...
  • 实验表明,相比多尺度输入的CNN模型,该方法在保持较高准确率的同时,省采样的操作,简化了图像预处理的过程,同时也减少了传统"跨空间法"中需要学习的呋射函数的个数。4.针对监控系统中数据流传输带来的带宽占用...
  • 人脸识别系统从没有充分代表某些种族群体的数据集训练,对这些群体显示出较低的准确率。在被描述的人的活动性和性别表达高度相关的数据集上训练的活动识别模型已经过度放大了这些相关性。计算机视觉系统是一种经过...
  • 运行python train.py即可开始训练,可以在train.py文件中设置epoch、batch等参数,运行结束模型会储存到model文件夹中,可以在训练好的模型基础继续训练。 可以运行python train.py pretrained使用预训练的词向量...
  • **我们提出了可理解的经验证据证明这些残差网络更容易优化,并且可以从适当增加深度来获得准确率提升。**在ImageNet数据集上,我们评估的残差网络最多到152层,比VGG网络要深8倍,但是有着更低的复杂性。
  • LIDC-IDRI数据库的实验结果表明,所提方法对三维CT图像的肺结节检测具有更高的适用性,取得了较高的召回率和准确率,优于目前相关文献报道的方法。该框架易于扩展到其他3D医疗图像的目标检测任务中,对辅助医师...
  • fastText优点是可以快速的在cpu进行训练,但是准确率不高。 fastText将输入的文本特征通过一层全连接层映射到向量空间,然后将词向量平均处理一下,做预测。 keras模型搭建如图: 三,fastText的实现 1.pip...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

训练集准确率上不去