caffe(八)日常问题解析

  • 关闭日志输出

    在命令行执行命令之前调用如下命令,

    GLOG_minloglevel=X  ./your_app

    X代表的是需要打印在terminal上面的日志的级别,如下是每个级别的代码详解,

    0 - debug
    1 - info (still a LOT of outputs)
    2 - warnings
    3 - errors
  • memory_data_layer 的调用和改进

    这次是刚开始写C++的caffe程序,有些迷茫,在网上找了一下,居然有人和我干了同样的活,都是拿到别人的模型之后写C++来跑测试,这样我很感动,下面是这个哥们的链接,

    通过研读classification.cpp了解如何使用caffe模型

    本来我觉得这个东西很快就能做完,因为照葫芦画瓢就OK了,但是后来发现根本就不是这么简单的。。

    一开始以为所有的datalayer都是一样的,后来发现还有imagedatalayer, memorydatalayer等等,而且每种datalayer的操作方式都不相同,

    这次的项目是memorydatalayer,我找了好久才发现了如下的链接,

    caffe:使用C++来提取任意一张图片的特征(从内存读取数据)

    链接里把memorydatalayer的操作的每一步说的都很清楚,很开心,后来发现最关键的一个函数是把图片数据放到memorydatalayer的bottom blob中,但是最令人恶心的是这个函数只接受8位单通道无符号数据,不接受64位有符号数据,这就让标准化后的数据没办法放入到caffe中运行,这个函数样例如下,

    m_layer->AddMatVector(dv, label); // 把图片和标签,添加到 MemoryData层

    后来我发现这个函数之所以只接受8位无符号单通道数据,就是因为其之前有个check,保证输入的数据必须是8位无符号单通道数据,如果跳过这个check程序就能够跑通了,这个其实是受python在操纵memorydatalayer的时候的操作,至于python的操作的源代码和解析,可以见下面链接,

    python caffe memorydatalayer操作

    经过上面链接的启发,我直接就绕过上述check的判断,把数据放入内存中,调试了一段时间后通过,激动万分,

  • data_transformer.cpp

    这是对数据进行预处理操作的,比如mirror,scale等等。。。

    data_transformer.cpp

  • solver参数说明

    test_iter: 1000 //1000指的是测试的批次,测试样本较多时,一次性执行全部数据,效率较低,因此分几个批次进行执行,  
                    //如果每个批次数量设为batch_size,则有以下关系:test_iter = 测试样本总数/batch_size  
    test_interval: 1000 //测试间隔,即每训练1000次,进行一次测试
    max_iter: 12000 //最大迭代次数
    layer {
      name: "accuracy"
      type: "Accuracy"
      bottom: "fc8"
      bottom: "label"
      top: "accuracy"
      include {
        phase: TEST
      }
    }

    accuracy 层是通过比较最后一个全连接层(神经元个数=类别数、但没有加入activation function)的输出和数据集的labels来得到的,在AccuracyLayer内部,实现了“利用fc8的输出得到数据集的预测labels”(数值最大的那个值得idnex就是样本的类别),那么,再与输入的数据集真实lebels作对比,就实现了accuray的计算!

    最后一个全连接层(fc8)的输出值位于区间[−∞,∞],它并不是概率值

    fc8后面接的SoftmaxWithLoss层做的工作分2步

    1. 对fc8的输出计算softmax function(结果为概率值)

    2. 利用求得的概率值计算Loss值

你可能感兴趣的:(机器学习,深度学习与计算机视觉)