zoukankan      html  css  js  c++  java
  • caffe:自己搭建网络来训练

    1.准备样本

      要训练自己的样本,首先需要把样本准备好,需要准备的是训练集和测试集,caffe支持直接使用图片,当然把样本转换为leveldb或lmdb格式的话训练起来会更快一点。这里我先偷个懒,直接使用图片吧 [尴尬.jpg]

      训练集和测试集是一样的,不过样本不要重叠。首先我把训练集的图片都放在一个目录,然后shift+右键选择该目录,打开cmd,使用命令 dir /s/b >train.txt ,这样就在该目录下生成了一份所有图片的列表,效果如下

      然后使用查找替换功能把它修改成下面这个样子,后面的0,1,,序号是为每个类别的样本分配的标签,需要从0开始:

    位置/../xx1.jpg 0
    位置/../xx2.jpg 0
    位置/../xx3.jpg 0
    位置/../xx4.jpg 1
    位置/../xx5.jpg 1
    位置/../xx6.jpg 1
    .....................

      这里样本的准备已经差不多了,最后一步是需要生成均值文件 binaryproto,生成均值文件之前需要先将图片转换为lmdb,这里可以使用caffe自带的工具来生成(vs编译后会在bin文件夹下生成comput_image_mean.exe convert_imageset.exe

      打开cmd,然后运行:

    convert_imageset -shuffle -resize_height=150 -resize_width=150 J:/Caffe/train/ J:/Caffe/train/train.txt J:/Caffe/train/lmdb

      使用命令生成均值文件:

    compute_image_mean J:/Caffe/train/lmdb J:/Caffe/train/train.binaryproto

      到这里训练集已经准备好了,然后测试集同上,最后我把它们全放在了data文件夹下,该文件夹下包含训练和测试所需的所有图片图片列表train.txt和test.txt均值文件train.binaryproto(我的测试也是使用这个均值文件)

    2. 编写配置文件solver,我在caffe目录下的face_example目录下新建了my_solver.prototxt,编写如下:

    net: "face_example/my_train.prototxt" # 网络结构文件的位置
    test_iter:1200 # 迭代次数,根据batch大小来
    test_interval:100 # 测试间隔
    
    base_lr:0.001 # 学习率
    lr_policy: "multistep" 
    gamma: 0.1
    
    stepvalue: 200 # 设置学习率什么时候减小
    stepvalue: 400
    stepvalue: 700
    stepvalue: 1000
    max_iter: 2000 # 最大迭代次数
    
    display: 100 # 每训练100次显示一次
    momentum: 0.9 # 设置冲量
    weight_decay: 0.0005 
    snapshot: 200 # 每200次保存一个快照文件
    snapshot_prefix: "face_example/face_snapshot" # 快照文件保存位置
    
    solver_mode:GPU # 使用GPU训练

    3. 编写网络定义文件,新建 my_train.prototxt ,编写如下:

    name: "my_caffe_test"
    
    layer{
        name: "data"
        type: "ImageData"
        top: "data"
        top: "label"
        include{
            phase:TRAIN
        }
        transform_param{
            mean_file:"face_example/train.binaryproto"
            scale: 0.0078125
            mirror:true
        }
        image_data_param{
            source:"face_example/data/train.txt"
            batch_size:1
            shuffle:true
        }
    }
    
    layer{
        name: "data"
        type: "ImageData"
        top: "data"
        top: "label"
        include{
            phase:TEST
        }
        transform_param{
            mean_file:"face_example/train.binaryproto"
            scale: 0.0078125
            mirror:true
        }
        image_data_param{
            source:"face_example/data/test.txt"
            batch_size:1
            shuffle:true
        }
    }
    
    layer{
        name: "conv1"
        type: "Convolution"
        bottom: "data"
        top: "conv1"
        param{
            lr_mult: 1 # 和base_lr相乘
            decay_mult: 1
        }
        convolution_param{
            num_output: 32
            kernel_size: 3
            stride: 1
            weight_filler{
                type: "xavier"
            }
            bias_filler{
                type: "constant"
                value: 0
            }
        }
    }
    
    layer{
        name: "relu1"
        type: "PReLU"
        bottom: "conv1"
        top: "conv1"
    }
    
    layer{
        name: "conv2"
        type: "Convolution"
        bottom: "conv1"
        top: "conv2"
        param{
            lr_mult: 1
            decay_mult: 1
        }
        convolution_param{
            num_output: 64
            kernel_size: 3
            stride: 1 # 步长
            weight_filler{
                type: "xavier"
            }
            bias_filler{
                type: "constant"
                value: 0
            }
        }
    }
    
    layer{
        name: "relu2"
        type: "PReLU"
        bottom: "conv2"
        top: "conv2"
    }
    
    layer{
        name: "pool1"
        type: "Pooling"
        bottom: "conv2"
        top: "pool1"
        pooling_param{
            pool: MAX
            kernel_size: 2
            stride: 2
        }
    }
    
    layer{
        name: "conv3"
        type: "Convolution"
        bottom: "pool1"
        top: "conv3"
        param{
            lr_mult: 1
            decay_mult: 1
        }
        convolution_param{
            num_output: 128
            kernel_size: 3
            stride: 1
            weight_filler{
                type: "xavier"
            }
            bias_filler{
                type: "constant"
                value: 0
            }
        }
    }
    
    layer{
        name: "relu3"
        type: "PReLU"
        bottom: "conv3"
        top: "conv3"
    }
    
    layer{
        name: "fc1"
        type: "InnerProduct"
        bottom: "conv3"
        top: "fc1"
        param{
            lr_mult: 1
            decay_mult:10
        }
        inner_product_param{
            num_output: 256
            weight_filler{
                type: "xavier"
            }
            bias_filler{
                type: "constant"
                value: 0
            }
        }
    }
    
    layer{
        name: "fc2"
        type: "InnerProduct"
        bottom: "fc1"
        top: "fc2"
        param{
            lr_mult: 1
            decay_mult:10
        }
        inner_product_param{
            num_output: 12
            weight_filler{
                type: "xavier"
            }
            bias_filler{
                type: "constant"
                value: 0
            }
        }
    }
    
    layer{
        name: "softmax_loss"
        type: "SoftmaxWithLoss"
        bottom: "fc2"
        bottom: "label"
        top: "softmax_loss"
    }

    4. 然后开始训练,打开cmd,输入命令:

    caffe train -solver=face_example/my_solver.prototxt

      

    ------------ 转载请注明出处 ------------
  • 相关阅读:
    SEO分享:我为什么会有这么多的优质外链资源?
    执行shell脚本提示“syntax error near unexpected token for((i=0;i<$length;i++))”
    Codeforces Round #254 (Div. 2)D(预计)
    自己写配置文件
    软件測试基本方法(二)之白盒測试
    hdu 4638 Group
    影视集结号--首页
    2015阿里巴巴秋招在线笔试题
    php 抓取天气情况 www.weather.com.cn
    C语言中的enum(枚举)使用方法
  • 原文地址:https://www.cnblogs.com/whlook/p/6932831.html
Copyright © 2011-2022 走看看