zoukankan      html  css  js  c++  java
  • caffe

    定义CAFFE为caffe跟目录,caffe的核心代码都在$CAFFE/src/caffe 下,主要有以下部分:net, blob, layer, solver.

      • net.cpp
        net定义网络, 整个网络中含有很多layers, net.cpp负责计算整个网络在训练中的forward, backward过程, 即计算forward/backward 时各layer的gradient。

      • layers
        在$CAFFE/src/caffe/layers中的层,在protobuffer (.proto文件中定义message类型,.prototxt或.binaryproto文件中定义message的值) 中调用时包含属性name, type(data/conv/pool…), connection structure (input blobs and output blobs),layer-specific parameters(如conv层的kernel大小)。定义一个layer需要定义其setup, forward 和backward过程。

      • blob.cpp
        net中的数据和求导结果通过4维的blob传递。一个layer有很多blobs, e.g,

        • 对data,weight blob大小为Number * Channels * Height * Width, 如256*3*224*224;
        • 对conv层,weight blob大小为 Output 节点数 * Input 节点数 * Height * Width,如AlexNet第一个conv层的blob大小为96 x 3 x 11 x 11;
        • 对inner product 层, weight blob大小为 1 * 1 * Output节点数 * Input节点数; bias blob大小为1 * 1 * 1 * Output节点数( conv层和inner product层一样,也有weight和bias,所以在网络结构定义中我们会看到两个blobs_lr,第一个是weights的,第二个是bias的。类似地,weight_decay也有两个,一个是weight的,一个是bias的); 


          blob中,mutable_cpu/gpu_data() 和cpu/gpu_data()用来管理memory,cpu/gpu_diff()和 mutable_cpu/gpu_diff()用来计算求导结果。

      • slover.cpp
        结合loss,用gradient更新weights。主要函数: 
        Init(), 
        Solve(), 
        ComputeUpdateValue(), 
        Snapshot(), Restore(),//快照(拷贝)与恢复 网络state 
        Test();

        在solver.cpp中有3中solver,即3个类:AdaGradSolverSGDSolverNesterovSolver可供选择。

        关于loss,可以同时有多个loss,可以加regularization(L1/L2);

  • 相关阅读:
    解决maven导入坐标太慢问题
    +=的扩展
    JavaScript
    多线程
    异常
    面向对象
    数组
    java内存
    循环语句和递归
    剑指 Offer 30. 包含min函数的栈
  • 原文地址:https://www.cnblogs.com/changbosha/p/5765978.html
Copyright © 2011-2022 走看看