zoukankan      html  css  js  c++  java
  • 【Caffe篇】--Caffe从入门到初始及各层介绍

    一、前述

    Caffe,全称Convolutional Architecture for Fast Feature Embedding。是一种常用的深度学习框架,主要应用在视频、图像处理方面的应用上。caffe是一个清晰,可读性高,快速的深度学习框架。作者是贾扬清,加州大学伯克利的ph.D,现就职于Facebook。caffe的官网是http://caffe.berkeleyvision.org/。

     二、具体

    1、输入层

    layer {
      name: "cifar"
      type: "Data"
      top: "data"  #一般用bottom表示输入,top表示输出,多个top代表有多个输出
      top: "label"
      include {
        phase: TRAIN #训练网络分为训练阶段和自测试阶段,如果没写include则表示该层即在测试中,又在训练中
      }
      transform_param {
        mean_file: "examples/cifar10/mean.binaryproto" #用一个配置文件来进行均值的操作
        transform_param {
        scale: 0.00390625
        mirror: 1  # 1表示开启镜像,0表示关闭,也可用ture和false来表示
        # 剪裁一个 227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪
        crop_size: 227
      }
      }
      data_param {
        source: "examples/cifar10/cifar10_train_lmdb" #数据库来源
        batch_size: 64 #每次批处理的个数
        backend: LMDB #选用数据的名称
      }
    }
    
    ### 使用LMDB源
    layer {
      name: "mnist"
      type: "Data"
      top: "data"
      top: "label"
      include {
        phase: TRAIN
      }
      transform_param {
        scale: 0.00390625
      }
      data_param {
        source: "examples/mnist/mnist_train_lmdb"
        batch_size: 64
        backend: LMDB
      }
    }
    
    ###使用HDF5数据源
    layer {
      name: "data"
      type: "HDF5Data"
      top: "data"
      top: "label"
      hdf5_data_param {
        source: "examples/hdf5_classification/data/train.txt"
        batch_size: 10
      }
    }
    
    ###数据直接来源与图片
    #/path/to/images/img3423.jpg 2  
    #/path/to/images/img3424.jpg 13  
    #/path/to/images/img3425.jpg 8
    
    layer {
      name: "data"
      type: "ImageData" #类型
      top: "data"
      top: "label"
      transform_param {
        mirror: false
        crop_size: 227
        mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
      }
      image_data_param {
        source: "examples/_temp/file_list.txt"
        batch_size: 50
        new_height: 256 #如果设置就对图片进行resize操作
        new_ 256
      }
    }

     2、卷积层

     

    layer {
      name: "conv1" #定义一个名字 必须指定的
      type: "Convolution"
      bottom: "data"#前面连接的层 data层
      top: "conv1"#输出是卷积层
      param {
        lr_mult: 1  #lr_mult: #当前层的学习率 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍
      }
      param {
        lr_mult: 2
      }
      convolution_param {
        num_output: 20 #卷积核(filter)的个数等于特征图的个数
        kernel_size: 5 #卷积核的大小 5*5*d  中的d是上一层的深度 
        stride: 1 #卷积核的步长,默认为1 
        pad: 0 #扩充边缘,默认为0,不扩充
        weight_filler {
          type: "xavier" #权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"
        }
        bias_filler {
          type: "constant" #偏置项的初始化。一般设置为"constant",值全为0
        }
      }
    }
    
    输入:n*c0*w0*h0
    输出:n*c1*w1*h1
    其中,c1就是参数中的num_output,生成的特征图个数
     w1=(w0+2*pad-kernel_size)/stride+1;
     h1=(h0+2*pad-kernel_size)/stride+1;

    结论:

    假设输入时h*w k是kernel_size p 是padding s是stride则
    特征图 的输出的h是多大的 (h-k+2p)/s+1
    w是(w-k+2p)/s+1

    3、池化层

    layer {
      name: "pool1"
      type: "Pooling"
      bottom: "conv1"
      top: "pool1"
      pooling_param {
        pool: MAX #池化方法,默认为MAX。目前可用的方法有MAX, AVE
        kernel_size: 3 #池化的核大小
        stride: 2 #池化的步长,默认为1。一般我们设置为2,即不重叠。
      }
    }
    
    #pooling层的运算方法基本是和卷积层是一样的。

     4、激活函数层

    #在激活层中,对输入数据进行激活操作,是逐元素进行运算的,在运算过程中,没有改变数据的大小,即输入和输出的数据大小是相等的。
    
    ###Sigmoid
    
    
    layer {
      name: "test"
      bottom: "conv"
      top: "test"
      type: "Sigmoid"
    }
    
    #ReLU是目前使用最多的激活函数,主要因为其收敛更快,并且能保持同样效果。标准的ReLU函数为max(x, 0),当x>0时,输出x; 当x<=0时,输出0
    f(x)=max(x,0)
    
    
    
    layer {
      name: "relu1"
      type: "ReLU"
      bottom: "pool1"
      top: "pool1"
    }

     5、全连接层

    #全连接层,输出的是一个简单向量  参数跟卷积层一样
    layer {
      name: "ip1"
      type: "InnerProduct"
      bottom: "pool2"
      top: "ip1"
      param {
        lr_mult: 1
      }
      param {
        lr_mult: 2
      }
      inner_product_param {
        num_output: 500
        weight_filler {
          type: "xavier"
        }
        bias_filler {
          type: "constant"
        }
      }
    }
    #测试的时候输入准确率
    layer {
      name: "accuracy"
      type: "Accuracy"
      bottom: "ip2"#两个输入一个输入是分类结果
      bottom: "label"#另一个输入是label
      top: "accuracy"
      include {
        phase: TEST
      }
    }

     6、softmax_layer

    #softmax-loss layer:输出loss值 对于softmax 得到损失函数 -logp p为正确的分类的概率
    layer {
      name: "loss"
      type: "SoftmaxWithLoss"
      bottom: "ip1"
      bottom: "label"
      top: "loss"
    }
    
    #softmax layer: 输出似然值  得到每一个类别的概率值
    layers {
      bottom: "cls3_fc"
      top: "prob"
      name: "prob"
      type: “Softmax"
    }

     7、reshape层

    #在不改变数据的情况下,改变输入的维度
    
    layer {
        name: "reshape"
        type: "Reshape"
        bottom: "input"
        top: "output"
        reshape_param {
          shape {
            dim: 0  # copy the dimension from below
            dim: 2
            dim: 3
            dim: -1 # infer it from the other dimensions
          }
        }
      }
    
    有一个可选的参数组shape, 用于指定blob数据的各维的值(blob是一个四维的数据:n*c*w*h)。
    
    dim:0  表示维度不变,即输入和输出是相同的维度。
    
    dim:2 或 dim:3 将原来的维度变成2或3
    
    dim:-1 表示由系统自动计算维度。数据的总量不变,系统会根据blob数据的其它三维来自动计算当前维的维度值 。
    
    假设原数据为:32*3*28*28, 表示32张3通道的28*28的彩色图片
        shape {
        dim: 0 #表示不变
        dim: 0
        dim: 14
        dim: -1 #表示自动推断
        }
    输出数据为:32*3*14*56
    
    #Dropout是一个防止过拟合的层
    #只需要设置一个dropout_ratio就可以了。
    layer {
      name: "drop7"
      type: "Dropout"
      bottom: "fc7-conv"
      top: "fc7-conv"
      dropout_param {
        dropout_ratio: 0.5
      }
    }

     

  • 相关阅读:
    创建web应用程序时出现 SharePoint HRESULT:0x80070094 问题
    用Javascript获取SharePoint当前登录用户的用户名及Group信息
    javascript连接数据库
    sharepoint 中banner 图片的放大
    GridView导出Excel 类库
    SQL Server 性能调优
    GridView长字段的显示
    MOSS母版页制作学习笔记(二)
    sharepoint 中批量导入导出
    JavaScript 动态更改sharepoint 列表的颜色
  • 原文地址:https://www.cnblogs.com/LHWorldBlog/p/9246684.html
Copyright © 2011-2022 走看看