深度学习caffe框架(2): layer定义

2023-05-16


caffe的代码层次

首先让我们回顾一下caffe的代码层次: blob,layer, net和solver.
其中blob是数据结构, layer是网络的层, net是将layer搭建成的网络,solver是网络BP时候的求解算法. 本节主要介绍caffe的layer基本结构, 种类, 以及不同类型的layer如何定义.

layer的基本结构和种类

Caffe的layer的基本结构:

Layer{
 name: "xx"  # 名称
  type: "xx" # 类型
  top: "xx" # 输出
  bottom: "xx" # 输入
  some_param { # 其他参数定义等
    ...
  }
}

从一个典型的卷积神经网络模型结构出发, 首先需要数据输入层,然后是图像的预处理,例如图像切割slice, 卷积层Convolution, 在caffe中,激活函数等数据运算也用layer的方式定义. 总的来说,caffe的layer种类如下:

  • 数据输入层:
  • 视觉层(Vision Layers): 包括Convolution, Pooling, Local Response Normalization (LRN), im2col等
  • 损失层: softmax-loss层, Euclidean层.
  • 循环层: RNN, LSTM层等.
  • 工具层(Utility layer): 例如reshape层, concat层等
  • 普通层(Common layer): dropout层, 全连接层, embed层.

数据输入层:

一个常见的数据输入层定义如下. 输入数据定义为lmdb数据库格式.

layer {
  name: "data"
  type: "CPMData"
  top: "data"
  top: "label"
  data_param {
    source: "/home/zhecao/COCO_kpt/lmdb_trainVal"  # lmdb数据文件路径
    batch_size: 10
    backend: LMDB
  }
  cpm_transform_param { # 图片预处理
    stride: 8 
    max_rotate_degree: 40 # 旋转
    visualize: false 
    crop_size_x: 368 
    crop_size_y: 368
    scale_prob: 1
    scale_min: 0.5 # 缩放比例
    scale_max: 1.1 # 缩放比例
    target_dist: 0.6
    center_perterb_max: 40
    do_clahe: false
    num_parts: 56
    np_in_lmdb: 17
  }
}

详细的数据数据层定义见:http://www.cnblogs.com/denny402/p/5070928.html

视觉层

视觉层包括Convolution, Pooling, Local Response Normalization (LRN), im2col等层

卷积层

卷积层是卷积神经网络的核心层. 卷积层的定义:

layer {
  name: "conv1_1"
  type: "Convolution"
  bottom: "image" # 输入
  top: "conv1_1" # 输出
  param { 
    lr_mult: 1.0  #权值学习率的系数,
    decay_mult: 1 # 学习率的衰减系数
  }
  param {
    lr_mult: 2.0 # 偏置的系数
    decay_mult: 0 # 偏置的衰减系数
  }
  convolution_param {
    num_output: 64 #卷积核(filter)的个数
    pad: 1  # 步长
    kernel_size: 3 # 卷积核大小
weight_filler { # 卷积核权值的初始化, 默认是常值0, 或者gaussian/ xavier
      type: "gaussian"       
    std: 0.01
    }
    bias_filler {
      type: "constant"
    }
  }
}

lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。
pad: 进行边缘扩充。默认为0, 也就是不扩充。 扩充的时候是左右、上下对称的,比如卷积核的大小为5*5,那么pad设置为2,则四个边缘都扩充2个像素,即宽度和高度都扩充了4个像素,保证在卷积运算之后的特征图就不会变小。也可以通过pad_h和pad_w来分别设定。
输入: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;
如果设置stride为1,前后两次卷积部分存在重叠。如果设置pad=(kernel_size-1)/2,则运算后,宽度和高度不变.

池化层

池化层有效减少了网络参数, 同时尽可能保持了位置信息.

layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX # 池化类型
    kernel_size: 3 # 池化核的大小
    stride: 2 # 步长
  }
}

这里pad还是默认为0,不进行扩充.
输入:n*c*w0*h0
输出:n*c*w1*h1
和卷积层的区别就是其中的c保持不变
w1=(w0+2*pad-kernel_size)/stride+1;
h1=(h0+2*pad-kernel_size)/stride+1;
如果设置stride为2,前后两次卷积部分不重叠。100*100的特征图池化后,变成50*50.

3.局部响应归一化层(Local Response Normalization, LRN)
对于每一个输入, 去除以

得到归一化后的输出

4.Im2col层.
将输入的image的各个区域(小矩阵)拉成向量,然后依次排列形成新的大矩阵.

在caffe中,卷积运算就是先对数据进行im2col操作,再进行内积运算(inner product)。这样做,比原始的卷积操作速度更快。

LRN和im2col层的详细情况见:http://www.cnblogs.com/denny402/p/5071126.html

激活层

在激活层,是对输入做元素级的激活操作(函数变换), 输入和输出的维度是一致的.常用的激活函数有sigmoid, relu和tanh等.
典型的激活层定义:

layer {
  name: "XX"
  bottom: "in_data"
  top: "out_data" 
  type: "Sigmoid"  # 也可以是"ReLU"或者"TanH"
}

以ReLU层为例, 非线性变化层 max(0,x),一般与CONVOLUTION层成对出现
:

layer {
  name: "relu1"
  type: "ReLU" # 激活函数类型
  bottom: "ip1"
  top: "ip1"
}

其他层

全连接层(inner product)

  • weight_filler: 权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"
  • bias_filler: 偏置项的初始化。一般设置为"constant",值全为0。
  • bias_term: 是否开启偏置项,默认为true, 开启
    全连接层的定义为:
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"
    }
  }
}

Dropout层

防止过拟合.只需要定义dropout比率就可以了.

layer {
  name: "drop7"
  type: "Dropout"
  bottom: "fc7-conv"
  top: "fc7-conv"
  dropout_param {
    dropout_ratio: 0.5
  }
}

Softmax-loss层:

如果我们最终目的就是得到各个类别的概率似然值,这个时候就只需要一个 Softmax层,而不一定要进行softmax-Loss 操作;如果输出结果理论上的概率分布已知,然后要做最大似然估计,此时最后需要一个softmax-Loss层.
从Softmax-loss的计算公式可以看出, softmax-loss实际上定义的是交叉熵:

softmax-loss层的定义:

layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip1"

  bottom: "label"
  top: "loss"
}

Softmax和softmax-loss的比较:http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/

还有如reshape层等,参考:
caffe官网: http://caffe.berkeleyvision.org/tutorial/layers.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习caffe框架(2): layer定义 的相关文章

随机推荐

  • 升级到tensorflow2.0

    目录 从tensorflow1 x升级到2 x方案一 xff1a 依然使用tf 1 x的脚本方案二 xff1a 升级项目代码到2 x tensorflow2 0推出以后 xff0c 全面拥抱keras xff0c 简化了API接口 xff0
  • tensorflow2.0系列(1):张量

    目录 tensor xff1a 张量张量的数据类型Dtype类函数tf as type xff1a 定义Dtype类型对象tf dtypes cast xff1a 将张量映射 投射为新的类型tf dtypes complex xff1a 将
  • tensorflow 2.0系列(3):eager execution和计算图

    目录 tf 2 0 的新特性 xff1a eager execution开启eager模式关闭eager模式 构建图默认图创建多个计算图启动会话 从公式到计算图绘制心形曲线开根号线性回归 tf 2 0 的新特性 xff1a eager ex
  • tensorflow2.0系列(2):张量的运算

    目录 张量运算tf linalg 模块tf math模块常用的代数函数tf math segment 张量运算 tensorflow定义了很多张量的基本运算 xff0c 由于张量的特殊属性 xff0c 其运算操作主要有两类 xff0c 一类
  • 那些重要但是容易被忽略的python编程基础知识

    目录 变量类型标准数据类型 字典字典的内置函数 amp 方法 字符串前符号 python很容易上手 xff0c 工具包特别多 xff0c 入门后就特别容易忽略python的基本特性 这里将特别关注python那些特别基础 xff0c 重要但
  • 常见深度神经网络模型图

    from tensorflow learn in one day by Krishna Rungta
  • tensorflow2.0系列(4): Eager Execution和Auto Graph

    目录 静态图的弊端Eager模式Eager execution的基本特性对 numpy 的支持 Auto Graph 动态图static analysis VS dynamic flow局部参数的可见域python collections
  • Eclipse离线安装ADT插件

    Eclipse安装 ADT插件 但是由于某些不可抗拒的原因连上 https dl ssl google com android eclipse 后 xff0c 始终无法更新 ADT插件 卡死在 Fetchingcontent jar上 解决
  • ubuntu在shell中把文件拷贝进U盘

    1 创建挂载位置 xff0c 例如 sudo mkdir mnt u 这个位置只要建好 xff0c 以后就可以不用再建了 2 用mount命令将U盘挂载在这个位置 sudo mount dev sdb1 mnt u 注意U盘的盘符不一定是
  • linux文件管理

    linux文件管理 计算机操作系统都采用了目录树的文件结构 linux中 xff1a 符号名称 根目录 bin常见用户口令 boot内核和启动文件 dev设备文件 home系统默认的普通用户主目录 etc系统和服务配置文件 lib系统函数库
  • C++和Windows平台的一些书籍

    从2010年学习编程以来 xff0c 到现在有差不多3年时间了 xff0c 过的真快啊 目前在深圳工作 xff0c 主要使用的是C 43 43 语言 xff0c 那么我就说说C 43 43 和Windows平台的书籍吧 1 C primer
  • ubuntu上运行C程序

    ubuntu版本为Ukylin14 04LTS 首先配置编辑器vim step1 xff1a 查看系统是否安装vim 打开终端 xff0c 输入vi xff0c 按下tab键 xff0c 如果列表里没有vim xff0c 说明系统没有安装
  • 怎么让ubuntu变得更加好用

    ubunut14 04LTS版本其实已经很好用了 但是也有一些小小的美中不足 以下设置是陆续收集 摸索到的可以让系统更好用的方法 1 在终端打开已经安装的应用程序时 xff0c 总是会显示一些错误信息 在 bin下添加x文件 xff1a c
  • linux命令(1):touch

    touch 命令 功能说明 xff1a 改变文件或目录时间 xff0c 包括存取时间和更改时间 语 法 xff1a 补充说明 xff1a 使用touch指令可更改文件或目录的日期时间 最常用用法 xff1a touch fileA 如果fi
  • bash shell命令(1);、&&、||

    xff1b 命令 按照先后顺序一次执行多个命令 xff0c 命令之间用 xff1b 分割 xff1a command 1 command 2 command 3 amp amp 命令 如果前一个命令 command 1 顺利执行 xff0c
  • linux命令(2):less

    less工具也是对文件或其它输出进行分页显示的工具 xff0c 比more的功能更强大 命令格式 xff1a less 参数 文件1 xff08 文件2 xff09 命令功能 xff1a less 与 more 类似 xff0c 但使用 l
  • [zz] linux下vi或vim操作Found a swap file by the name的原因及解决方法

    在linux下用vi或vim打开Test java文件时 root 64 localhost tmp vi Test java 出现了如下信息 xff1a E325 ATTENTION Found a swap file by the na
  • ubuntu中使用判断符号[]

    鸟哥的私房菜p270中13 3 2使用 符号有这样一个例子 xff1a vim sh06 sh 脚本内容如下 xff1a bin bash Program This program shows the user 39 s choice Hi
  • 深度学习caffe框架(1):如何快速上手caffe?

    初识caffe 安装caffe跑一个例子mnist配置caffe框架的深度学习网络结构输入数据 数据层的定义图片数据如何保存为lmdb格式 模型的保存和读取 caffe的代码层次参考 初识caffe 安装caffe 跑一个例子 mnist
  • 深度学习caffe框架(2): layer定义

    caffe的代码层次 首先让我们回顾一下caffe的代码层次 blob layer net和solver 其中blob是数据结构 layer是网络的层 net是将layer搭建成的网络 solver是网络BP时候的求解算法 本节主要介绍ca