caffe中各层定义

caffe源码学习(六) 自定义层 经过前面对google protocol buffer、Blob、SyncedMemory 与 shared_ptr、layer、data layer的初步学习,已经能够仿照caffe中已有的层来写自定层了。所以接下来就在caffe深度学习框架下写自定义层。首先应该注意,不同版本的caffe可能会有一些区别,所以要根据官网指南来写自定义层。为了方便,把目前版本的指南(20160605)贴出来:Dev 阅读详情


原文


  • 要想创建一个Caffe模型,需要在prototxt中定义一个model architecture(模型架构)。
  • Caffe自带的Layer及其参数被定义在caffe.proto中。

Vision Layers

  • 头文件: ./include/caffe/vision_layers.hpp

Vision layers 通常以图片images作为输入,运算后产生输出的也是图片images。对于图片而言,可能是单通道的(c=1),例如灰度图,或者三通道的 (c=3),例如RGB图。但是,对于Vision layers而言,最重要的特性是输入的spatial structure(空间结构)。2D的几何形状有助于输入处理,大部分的Vision layers工作是对于输入图片中的某一个区域做一个特定的处理,产生一个相应的输出。与此相反,其他大部分的layers会忽略输入的空间结构,而只是将输入视为一个很大的向量,维度为: c*h*w。

Convolution

  • 类型(type):Convolution(卷积层)
  • CPU 实现: ./src/caffe/layers/convolution_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/convolution_layer.cu
  • 参数 (convolution_param):
  • 必要: 
    • num_output (c_o): the number of filters(滤波器数目)
    • kernel_size (or kernel_h and kernel_w): specifies height and width of each filter(每一个滤波器的大小)
  • 强烈推荐: 
    • weight_filler [default type: ‘constant’ value: 0](滤波器权重,默认为0)
  • 可选:

    • bias_term [default true]: specifies whether to learn and apply a set of additive biases to the filter outputs(是否添加bias-偏置项,默认为True)
    • pad (or pad_h and pad_w) [default 0]: specifies the number of pixels to (implicitly) add to each side of the input(为输入添加边界的像素大小,默认为0)
    • stride (or stride_h and stride_w) [default 1]: specifies the intervals at which to apply the filters to the input(每一次使用滤波器处理输入图片时,前后两次处理区域的间隔,即“步进”,默认为1)
    • group (g) [default 1]: If g > 1, we restrict the connectivity of each filter to a subset of the input. Specifically, the input and output channels are separated into g groups, and the ith output group channels will be only connected to the ith input group channels.(默认为1,如果大于1:将限制每一个滤波器只与输入的一部分连接。输入、输出通道会被分隔为不同的g个groups,并且第i个输出group只会与第i个输出group相关)
  • 输入(Input)

  • n * c_i * h_i * w_i
  • 输出(Output)
  • n * c_o * h_o * w_o,其中h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1;w_o类似

  • 例子(详见 ./examples/imagenet/imagenet_train_val.prototxt)

layer {
  name: "conv1"                  # 名称:conv1
  type: "Convolution"            # 类型:卷积层
  bottom: "data"                 # 输入层:数据层
  top: "conv1"                   # 输出层:卷积层1
  # 滤波器(filters)的学习速率因子和衰减因子
  param { lr_mult: 1 decay_mult: 1 }
  # 偏置项(biases)的学习速率因子和衰减因子
  param { lr_mult: 2 decay_mult: 0 }
  convolution_param {
    num_output: 96               # 96个滤波器(filters)
    kernel_size: 11              # 每个滤波器(filters)大小为11*11
    stride: 4                    # 每次滤波间隔为4个像素
    weight_filler {
      type: "gaussian"           # 初始化高斯滤波器(Gaussian)
      std: 0.01                  # 标准差为0.01, 均值默认为0
    }
    bias_filler {
      type: "constant"           # 初始化偏置项(bias)为零
      value: 0
    }
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

卷积层(The Convolution layer)利用一系列具有学习功能的滤波器(learnable filters)对输入的图像进行卷积操作,每一个滤波器(filter)对于一个特征(feature )会产生一个输出图像(output image)。

Pooling

  • 类型(type):Pooling(池化层)
  • CPU 实现: ./src/caffe/layers/pooling_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/pooling_layer.cu
  • 参数 (pooling_param):

    • 必要: 
      • kernel_size (or kernel_h and kernel_w): specifies height and width of each filter(每一个滤波器的大小)
    • 可选: 
      • pool [default MAX]: the pooling method. Currently MAX, AVE, or STOCHASTIC(pooling方法,目前有MAX、AVE,和STOCHASTIC三种,默认为MAX)
      • pad (or pad_h and pad_w) [default 0]: specifies the number of pixels to (implicitly) add to each side of the input(为输入添加边界的像素大小,默认为0)
      • stride (or stride_h and stride_w) [default 1]: specifies the intervals at which to apply the filters to the input(每一次使用滤波器处理输入图片时,前后两次处理区域的间隔,即“步进”,默认为1)
  • 输入(Input)

    • n * c_i * h_i * w_i
  • 输出(Output)

    • n * c_o * h_o * w_o,其中h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1;w_o类似
  • 例子(详见 ./examples/imagenet/imagenet_train_val.prototxt)

layer {
  name: "pool1"                 # 名称:pool1
  type: "Pooling"               # 类型:池化层
  bottom: "conv1"               # 输入层:卷积层conv1
  top: "pool1"                  # 输出层:池化层pool1
  pooling_param {
    pool: MAX                   # pool方法:MAX
    kernel_size: 3              # 每次pool区域为3*3像素大小
    stride: 2                   # pool步进为2
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Local Response Normalization (LRN)

  • 类型(type):LRN(局部响应归一化层)
  • CPU 实现: ./src/caffe/layers/lrn_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/lrn_layer.cu
  • 参数 (lrn_param): 
    • 可选: 
      • local_size [default 5]: the number of channels to sum over (for cross channel LRN) or the side length of the square region to sum over (for within channel LRN)(对于cross channel LRN,表示需要求和的channel的数量;对于within channel LRN表示需要求和的空间区域的边长;默认为5)
      • alpha [default 1]: the scaling parameter(缩放参数,默认为1)
      • beta [default 5]: the exponent(指数,默认为5)
      • norm_region [default ACROSS_CHANNELS]: whether to sum over adjacent channels (ACROSS_CHANNELS) or nearby spatial locaitons (WITHIN_CHANNEL)(选择基准区域,是ACROSS_CHANNELS => 相邻channels,还是WITHIN_CHANNEL => 同一 channel下的相邻空间区域;默认为ACROSS_CHANNELS)

LRN Layer对一个局部的输入区域进行归一化,有两种模式。ACROSS_CHANNELS模式,局部区域在相邻的channels之间拓展,不进行空间拓展,所以维度是local_size x 1 x 1。WITHIN_CHANNEL模式,局部区域进行空间拓展,但是是在不同的channels中,所以维度是1 x local_size x local_size。对于每一个输入,都要除以:计算公式,其中n是局部区域的大小,求和部分是对该输入值为中心的区域进行求和(必要时候可以补零)。

im2col

Im2col 是一个helper方法,用于将图片文件image转化为列矩阵,详细的细节不需要过多的了解。在Caffe中进行卷积操作,做矩阵乘法时,会用到Im2col方法。


Loss Layers

Caffe是通过最小化输出output与目标target之间的cost(loss)来驱动学习的。loss是由forward pass计算得出的,loss的gradient 是由backward pass计算得出的。

Softmax

  • 类型(type):SoftmaxWithLoss(广义线性回归分析损失层)

Softmax Loss Layer计算的是输入的多项式回归损失(multinomial logistic loss of the softmax of its inputs)。可以当作是将一个softmax layer和一个multinomial logistic loss layer连接起来,但是计算出的gradient更可靠。

Sum-of-Squares / Euclidean

  • 类型(type):EuclideanLoss(欧式损失层)

Euclidean loss layer计算两个不同输入之间的平方差之和,计算公式

Hinge / Margin

  • 类型(type):HingeLoss
  • CPU 实现: ./src/caffe/layers/hinge_loss_layer.cpp
  • CUDA、GPU实现: 尚无
  • 参数 (hinge_loss_param):

    • 可选: 
      • norm [default L1]: the norm used. Currently L1, L2(可以选择使用L1范数或者L2范数;默认为L1)
  • 输入(Input)

    • n * c * h * w Predictions(预测值)
    • n * 1 * 1 * 1 Labels(标签值)
  • 输出(Output)

    • 1 * 1 * 1 * 1 Computed Loss(计算得出的loss值)
  • 例子

# 使用L1范数
layer {
  name: "loss"                  # 名称:loss
  type: "HingeLoss"             # 类型:HingeLoss
  bottom: "pred"                # 输入:预测值
  bottom: "label"               # 输入:标签值
}

# 使用L2范数
layer {
  name: "loss"                  # 名称:loss
  type: "HingeLoss"             # 类型:HingeLoss
  bottom: "pred"                # 输入:预测值
  bottom: "label"               # 输入:标签值
  top: "loss"                   # 输出:loss值
  hinge_loss_param {
    norm: L2                    # 使用L2范数
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 关于范数: 
    范数

Sigmoid Cross-Entropy

  • 类型(type):SigmoidCrossEntropyLoss
  • (没有详解)

Infogain

  • 类型(type):InfogainLoss
  • (没有详解)

Accuracy and Top-k

  • 类型(type):Accuracy
  • 计算输出的准确率(相对于target),事实上这不是一个loss layer,并且也没有backward pass。

Activation / Neuron Layers

激励层的操作都是element-wise的操作(针对每一个输入blob产生一个相同大小的输出):

  • 输入(Input) 
    • n * c * h * w
  • 输出(Output) 
    • n * c * h * w

ReLU / Rectified-Linear and Leaky-ReLU

  • 类型(type):ReLU
  • CPU 实现: ./src/caffe/layers/relu_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/relu_layer.cu
  • 参数 (relu_param):

    • 可选: 
      • negative_slope [default 0]: specifies whether to leak the negative part by multiplying it with the slope value rather than setting it to 0.(但当输入x小于0时,指定输出为negative_slope * x;默认值为0)
  • 例子(详见 ./examples/imagenet/imagenet_train_val.prototxt)

layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

给定一个输入值x,ReLU layer的输出为:x > 0 ? x : negative_slope * x,如未给定参数negative_slope 的值,则为标准ReLU方法:max(x, 0)。ReLU layer支持in-place计算,输出会覆盖输入,以节省内存空间。

Sigmoid

  • 类型(type):Sigmoid
  • CPU 实现: ./src/caffe/layers/sigmoid_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/sigmoid_layer.cu

  • 例子(详见 ./examples/mnist/mnist_autoencoder.prototxt)

layer {
  name: "encode1neuron"
  bottom: "encode1"
  top: "encode1neuron"
  type: "Sigmoid"
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对于每一个输入值x,Sigmoid layer的输出为sigmoid(x)。

TanH / Hyperbolic Tangent

  • 类型(type):TanH
  • CPU 实现: ./src/caffe/layers/tanh_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/tanh_layer.cu

  • 例子

layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "TanH"
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对于每一个输入值x,TanH layer的输出为tanh(x)。

Absolute Value

  • 类型(type):AbsVal
  • CPU 实现: ./src/caffe/layers/absval_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/absval_layer.cu

  • 例子

layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "AbsVal"
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对于每一个输入值x,AbsVal layer的输出为abs(x)。

Power

  • 类型(type):Power
  • CPU 实现: ./src/caffe/layers/power_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/power_layer.cu
  • 参数 (power_param):

    • 可选: 
      • power [default 1](指数,默认为1)
      • scale [default 1](比例,默认为1)
      • shift [default 0](偏移,默认为0)
  • 例子

layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "Power"
  power_param {
    power: 1
    scale: 1
    shift: 0
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

对于每一个输入值x,Power layer的输出为(shift + scale * x) ^ power。

BNLL

  • 类型(type):BNLL(二项正态对数似然,binomial normal log likelihood)
  • CPU 实现: ./src/caffe/layers/bnll_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/bnll_layer.cu
  • 例子
layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: BNLL
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对于每一个输入值x,BNLL layer的输出为log(1 + exp(x))。


Data Layers

Data 通过Data Layers进入Caffe,Data Layers位于Net的底部。 
Data 可以来自:1、高效的数据库(LevelDB 或 LMDB);2、内存;3、HDF5或image文件(效率低)。 
基本的输入预处理(例如:减去均值,缩放,随机裁剪,镜像处理)可以通过指定TransformationParameter达到。

Database

  • 类型(type):Data(数据库)
  • 参数: 
    • 必要: 
      • source: the name of the directory containing the database(数据库名称)
      • batch_size: the number of inputs to process at one time(每次处理的输入的数据量)
    • 可选: 
      • rand_skip: skip up to this number of inputs at the beginning; useful for asynchronous sgd(在开始的时候跳过这个数值量的输入;这对于异步随机梯度下降是非常有用的)
      • backend [default LEVELDB]: choose whether to use a LEVELDB or LMDB(选择使用LEVELDB 数据库还是LMDB数据库,默认为LEVELDB)

In-Memory

  • 类型(type):MemoryData
  • 参数: 
    • 必要: 
      • batch_size, channels, height, width: specify the size of input chunks to read from memory(4个值,确定每次读取输入数据量的大小)

Memory Data Layer从内存直接读取数据(而不是复制数据)。使用Memory Data Layer之前,必须先调用,MemoryDataLayer::Reset(C++方法)或Net.set_input_arrays(Python方法)以指定一个source来读取一个连续的数据块(4D,按行排列),每次读取大小由batch_size决定。

HDF5 Input

  • 类型(type):HDF5Data
  • 参数: 
    • 必要: 
      • source: the name of the file to read from(读取的文件的名称)
      • batch_size(每次处理的输入的数据量)

HDF5 Output

  • 类型(type):HDF5Output
  • 参数:

    • 必要: 
      • file_name: name of file to write to(写入的文件的名称)

    HDF5 output layer与这部分的其他layer的功能正好相反,不是读取而是写入。

Images

  • 类型(type):ImageData
  • 参数: 
    • 必要: 
      • source: name of a text file, with each line giving an image filename and label(一个text文件的名称,每一行指定一个image文件名和label)
      • batch_size: number of images to batch together(每次处理的image的数据)
    • 可选: 
      • rand_skip: (在开始的时候跳过这个数值量的输入)
      • shuffle [default false](是否随机乱序,默认为否) 
        -new_height, new_width: if provided, resize all images to this size(缩放所有的image到新的大小)

Windows

  • 类型(type):WindowData
  • (没有详解)

Dummy

  • 类型(type):DummyData

DummyData 用于开发和测试,详见DummyDataParameter(没有给出链接)。


Common Layers

Inner Product

  • 类型(type):Inner Product(全连接层)
  • CPU 实现: ./src/caffe/layers/inner_product_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/inner_product_layer.cu
  • 参数 (inner_product_param):

    • 必要: 
      • num_output (c_o): the number of filters(滤波器数目)
    • 强烈推荐: 
      • weight_filler [default type: ‘constant’ value: 0](滤波器权重;默认类型为constant,默认值为0)
    • 可选: 
      • bias_filler [default type: ‘constant’ value: 0](bias-偏置项的值,默认类型为constant,默认值为0)
      • bias_term [default true]: specifies whether to learn and apply a set of additive biases to the filter outputs(是否添加bias-偏置项,默认为True)
  • 输入(Input)

    • n * c_i * h_i * w_i
  • 输出(Output)

    • n * c_o * 1 * 1
  • 例子

layer {
  name: "fc8"                              # 名称:fc8
  type: "InnerProduct"                     # 类型:全连接层
  # 权重(weights)的学习速率因子和衰减因子
  param { lr_mult: 1 decay_mult: 1 }
  # 偏置项(biases)的学习速率因子和衰减因子
  param { lr_mult: 2 decay_mult: 0 }
  inner_product_param {
    num_output: 1000                       # 1000个滤波器(filters)
    weight_filler {
      type: "gaussian"                     # 初始化高斯滤波器(Gaussian)
      std: 0.01                            # 标准差为0.01, 均值默认为0
    }
    bias_filler {
      type: "constant"                     # 初始化偏置项(bias)为零
      value: 0
    }
  }
  bottom: "fc7"                            # 输入层:fc7
  top: "fc8"                               # 输出层:fc8
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

InnerProduct layer(常被称为全连接层)将输入视为一个vector,输出也是一个vector(height和width被设为1)

Splitting

  • 类型(type):Split

Split layer用于将一个输入的blob分离成多个输出的blob。这用于当需要将一个blob输入至多个输出layer时。

Flattening

  • 类型(type):Flatten

Flatten layer用于把一个维度为n * c * h * w的输入转化为一个维度为 n * (c*h*w)的向量输出。

Reshape

  • 类型(type):Reshape
  • CPU 实现: ./src/caffe/layers/reshape_layer.cpp
  • CUDA、GPU实现: 尚无
  • 参数 (reshape_param):

    • 可选: 
      • shape(改变后的维度,详见下面解释)
  • 输入(Input)

    • a single blob with arbitrary dimensions(一个任意维度的blob)
  • 输出(Output)

    • the same blob, with modified dimensions, as specified by reshape_param(相同内容的blob,但维度根据reshape_param改变)
  • 例子

 layer {
    name: "reshape"                       # 名称:reshape
    type: "Reshape"                       # 类型:Reshape
    bottom: "input"                       # 输入层名称:input
    top: "output"                         # 输出层名称:output
    reshape_param {
      shape {
        dim: 0  # 这个维度与输入相同
        dim: 2
        dim: 3
        dim: -1 # 根据其他维度自动推测
      }
    }
  }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Reshape layer只改变输入数据的维度,但内容不变,也没有数据复制的过程,与Flatten layer类似。

输出维度由reshape_param 指定,正整数直接指定维度大小,下面两个特殊的值:

  • 0 => 表示copy the respective dimension of the bottom layer,复制输入相应维度的值。
  • -1 => 表示infer this from the other dimensions,根据其他维度自动推测维度大小。reshape_param中至多只能有一个-1。

再举一个例子:如果指定reshape_param参数为:{ shape { dim: 0 dim: -1 } } ,那么输出和Flattening layer的输出是完全一样的。

Concatenation

  • 类型(type):Concat(连结层)
  • CPU 实现: ./src/caffe/layers/concat_layer.cpp
  • CUDA、GPU实现: ./src/caffe/layers/concat_layer.cu
  • 参数 (concat_param):

    • 可选: 
      • axis [default 1]: 0 for concatenation along num and 1 for channels.(0代表连结num,1代表连结channel)
  • 输入(Input) 
    -n_i * c_i * h * w for each input blob i from 1 to K.(第i个blob的维度是n_i * c_i * h * w,共K个)

  • 输出(Output)

    • if axis = 0: (n_1 + n_2 + … + n_K) * c_1 * h * w, and all input c_i should be the same.(axis = 0时,输出 blob的维度为(n_1 + n_2 + … + n_K) * c_1 * h * w,要求所有的input的channel相同)
    • if axis = 1: n_1 * (c_1 + c_2 + … + c_K) * h * w, and all input n_i should be the same.(axis = 0时,输出 blob的维度为n_1 * (c_1 + c_2 + … + c_K) * h * w,要求所有的input的num相同)
  • 例子

layer {
  name: "concat"
  bottom: "in1"
  bottom: "in2"
  top: "out"
  type: "Concat"
  concat_param {
    axis: 1
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Concat layer用于把多个输入blob连结成一个输出blob。

Slicing

Slice layer用于将一个input layer分割成多个output layers,根据给定的维度(目前只能指定num或者channel)。

  • 类型(type):Slice
  • 例子
layer {
  name: "slicer_label"
  type: "Slice"
  bottom: "label"
  ## 假设label的维度是:N x 3 x 1 x 1
  top: "label1"
  top: "label2"
  top: "label3"
  slice_param {
    axis: 1                        # 指定维度为channel
    slice_point: 1                 # 将label[~][1][~][~]赋给label1
    slice_point: 2                 # 将label[~][2][~][~]赋给label2
                                   # 将label[~][3][~][~]赋给label3
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

axis表明是哪一个维度,slice_point是该维度的索引,slice_point的数量必须是top blobs的数量减1.

Elementwise Operations

  • 类型(type): Eltwise
  • (没有详解)

Argmax

  • 类型(type):ArgMax
  • (没有详解)

Softmax

  • 类型(type):Softmax
  • (没有详解)

Mean-Variance Normalization

  • 类型(type):MVN
  • (没有详解)
Elementwise层1 Element Wise 层初始例代码播操作初始例代码from cuda import cudartimport tensorrt as trt# # 替换部分 立即下载

相关推荐

运维与软件实施课表

运维与软件实施课表 课程 章节编号 章节 课程地址 软件及操作系统基础 ch01 软件及操作系统基础01 实施、运维工程师基本技能:https://blog.youkuaiyun.com/qq_28189423/article/details/82700539 老毛桃制作winPE镜像:https://blog.youkuaiyun.com/qq_2818942...

Mr.O~的博客 1万+

Caffe学习:Layers

Caffe学习:Layers

from_jiarenyf 3万+

告别Qweb!用ReportBro在Odoo 13-19版本中5步搞定动态报表

本文介绍了如何在Odoo 13-19版本中使用ReportBro替代Qweb快速实现动态报表设计。通过5步集成指南,包括环境准备、前端集成、后端服务搭建等,展示了ReportBro在可视化设计、即时预览和多格式输出(PDF/XLSX)方面的优势,显著提升开发效率和报表灵活性。

mac99的博客 800

darknet添加新层以编译yolo_cpp_dll-------shufflenet模块

首先感谢AlexeyAB大神提供的YOLOv4源码,以及gmayday1997大神提供的split以及shuffle模块源码,本文以两位的工作进行yolov4版本中轻量化模块shufflenet模块的添加。 ①首先寻找到channel_slice.c和channel_shuffle.c的源文件及.h头文件,以及加入split.c与split.h六个文件。 ②接下来添加新层。参考DarkNet(1)--添加新层教程(slice层为例) 2.1 makefile文件的154行OBJ=中添加ch....

qq_16759959的博客 404

智能客服系统知识库构建:长尾问题解决方案全解析

智能客服系统知识库构建:长尾问题解决方案全解析

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 4112

避坑指南:Allegro 17.2更新封装时遇到的5个典型问题及解决方案(含Symbol报错处理)

本文深度解析Allegro 17.2封装更新过程中的核心机制与常见陷阱。针对“Update Symbols”功能失效、焊盘不匹配、DRC报错、图形层叠错误等5大典型问题,提供从原理分析到实战解决方案的完整指南,帮助用户实现从“更新失败”到“丝滑替换”的平稳过渡。

tgb34567890的博客 1039

caffe常用网络层及参数说明

1.Normalize层 layer { name: "conv4_3_norm" type: "Normalize" bottom: "conv4_3" top: "conv4_3_norm" norm_param { across_spatial: false scale_filler { type: "constant" val...

CPFelix的博客 1069

Android13无重力感应系统修改触摸屏跟随屏幕显示旋转方向旋转

在实际产品中设计时会移除重力传感器。当设备缺少重力传感器时,系统无法使用该传感器提供的方向数据来确定屏幕旋转的方向。Android 系统中由于移除重力传感器导致的默认显示方向旋转引起触摸屏与屏幕显示不一致问题,主要是由于缺乏方向检测和触摸坐标的正确转换。通过使用替代传感器(如陀螺仪)、手动配置方向、调整触摸事件坐标和 UI 布局,可以解决这个问题。开发者需要确保在设备没有重力传感器的情况下,能够通过其他方法推测方向,并确保触摸事件和 UI 动作能够正确响应设备的旋转。

weixin_35723192的博客 803

【深度学习】caffe中那些layers

本文介绍了深度学习开源框架caffe中各个layer的内容及使用方法。

心所愿,力必坚! 1万+

SAP ABAP 四种传统的数据库视图类型介绍之二:Projection View

一是该 projection view 只暴露了底层 TADIR 表的四个字段,因此通过该 view 维护数据,在维护界面我们只能维护一条记录的四个字段,如下图所示。使用 Projection view 的优点在于其设计灵活性:如果系统中原始的数据库表字段较多,通过投影仅保留关键信息可有效降低从数据库层到应用层之间的数据传输负担,且保持数据的一致性。其二是笔者之前的文章提到,TADIR 是 ABAP 系统重要的对象注册表,如同 window 操作系统的注册表一样,一般的应用开发人员不应该去修改其内容。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1441

倍福控制第三方伺服走CSV模式--以汇川伺服为例

在使用TwinCAT软件控制标准CiA402协议的EtherCAT伺服时使用TwinCAT软件NC自带的运动控制指令控制伺服,此时伺服驱动器一般工作在CSP/CSV/CST模式。最常见伺服驱动器工作在CSP模式,轨迹规划运行在TwinCAT软件,位置环速度环电流环运行在伺服驱动器中。该模式下速度波动较大,需要极度平稳的速度需要采用CSV模式。本文讲述的是伺服驱动器工作在CSV模式,此时轨迹规划和位置环均运行在TwinCAT软件,速度环电流环运行在伺服驱动器中。为了简化文字描述,本文采用图文结合的方式介绍伺服

weixin_41883890的博客 4848

Caffe学习(六):Caffe 添加自定义层

这里我们以mnist example为例来说明,如何在网络中添加自定义的Caffe层(C++ 实现): 1. 不带参数的层 (1)网络文件添加自定义层 在caffe-master\examples\mnist\下拷贝lenet_train_test.prototxt,重命名为lenet_train_test_new.prototxt 在第1个卷积层,即conv1层前添加一个自定义层,层名为...

夜风里唱的专栏 2833

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Caffe添加自定义的层

介绍在使用Caffe时,可能已有的层不满足需求,需要实现自己的层,最好的方式是修改caffe.proto文件,增加对应cpp、h、cu的声明和实现,编译caffe库即可。

热爱生活,忠于自己 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

caffe自定义层

下面caffe代码的功能是通过一个卷积层,再将卷积层的输出结果通过自定义层,计算结果。 自定义函数前,现在caffe 的makefile中取消python层的注释 、 再进入caffe文件,重新编译: make clear make all -j8 make pycaffe input_dim为定义的输入blobs[‘data’]的格式大小[1,3,100,100]=[batch_size,ch...

qq_38016957的博客 426

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

在caffe中添加自定义层

Caffe中添加自定义层[6,7] 1)头文件 路径:py-faster-rcnn/caffe-fast-rcnn/include/caffe/layers 2)CPP或者CU文件 fasterrcnn_huawei/py-faster-rcnn/caffe-fast-rcnn/src/caffe/layers 3)caffe.proto定义该层的参数 py-faste

并行时代 4624

Caffe 结构+使用+自定义层

一、Caffe 信息结构 在Caffe框架中,神经网络的结构和参数都可以通过prototxt文件定义。prototxt文件是Google Protocol Buffer库(简称prototbuf)用于存储结构数据序列化后的文本。prototbuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或RPC数据交换格式,类似于json和xml,但比它们更加高效...

半度微凉的博客 373

caffe添加自定义loss层

caffe添加自定义loss层 复现MTCNN,需要修改loss层,基于EuclideanLoss,: 修改forward部分,实现分类别训练(ground truth为-1时,loss为0) 修改backward部分,实现在线难例挖掘(还没做,以后补) 参考Github上的代码,他实现了gpu版本,我在此实现cpu版本 用VS打开工程 caffe-windows/scripts/...

qq_34867559的博客 2262

caffe 添加自定义层(custom layer)

在《剖析Caffe源码之Layer》可以知道layer是所有层的基类,由此类派生出各种不同的不同的层,其如下图所示: 由此扩展出了各种不同的层,基本能满足要求,但是有时候在搭建拓扑网络时,所需要的层并没有实现,这时就需要用户自己新添加一个layer。添加layer过程相对较为简单,下面将举一个例子进行说明。 用例 下面将以双曲线余弦函数为例子,说明添加一个custom layer过程: ...

weixin_42730667的博客 1191

Caffe学习5-用C++自定义层以及可视化结果

用C++自定义 层以及可视化结果用C自定义 层以及可视化结果 用C自定义层 三处地方 重新编译并测试 可视化结果 可视化loss 可视化blobs 修改caffecpp 添加可视化层 后记上一周,我们学校开始了实训,我参与的项目是深度学习相关的,于是第一周我们专注与学习Caffe的使用,包括对Caffe的源码的理解。接着,我们被要求定义一个自己的数据输入层,以完成特定的任务。用C++自定义层对于刚开

u012767526的专栏 4570

caffe添加C++层和python层定义

caffe的网络层类型注册机制。 我们知道,caffe中有很多网络层(layer),每个层并单独定义成一个c++类,如卷积层class ConvolutionLayer、class PoolingLayer等。当我们自定义一个层结构,该如何融入caffe架构里去呢?为了实现这个目的,需要首先了解一下caffe层的构建机制。1. 编写源文件及头文件首先,编写自己类(Mytest)的头文件、源文件:M

dataningwei的博客 2554

在Caffe下自定义网络层 Interp层

       之前跑 Residual Attention Network for Image Classification(2017年CVPR)发现Interp层在Caffe中没有定义(论文中用来上采样),于是从网上查找资料自己定义一个Interp层。   第一步先:自定义Interp网络层: 1.1  在caffe/include/cafffe/layers目录下新建一个文件 inter...

donkey_1993的博客 7023

caffe中使用Python定义自己的层

使用此功能,需要在Makefile.config中可以使用python定义自己的层那行注释打开一下重新进行编译 #将其中的下行打开,进行重新编译 WITH_PYTHON_LAYER := 1 在prototxt中添加以下测试层,这个层对网络不做任何修改,仅用于测试 layer{ name:'test' type:'Python' bottom:'data' top:'data' pyt...

weixin_44003563的博客 226

caffe添加自定义层

caffe框架可以完成基本的深度学习操作,但为了拓展功能需要自己定义层,或者将别人定义好的层移植进来。 下面以添加双线性插值层(pspnet中自己定义的层)为例说明过程: 1、写头文件 interp_layer.hpp , 放在include/caffe/layers文件夹下; 定义的格式是标准格式,可参考 https://github.com/BVLC/caffe/wiki/Simple-...

yly的博客 1250

基于Caffe框架扩展自定义层

caffe 自定义层/添加自己的损失函数 Developing new layers

liugan528的博客 1465

caffe 定义自己的python层

因为caffe底层是用c++编写的,所以我们有的时候想要添加某一个最新文献出来的新算法,正常的方法是直接编写c++网络层,然而这个有个前提条件是必须对caffe的底层非常熟悉,c++的编写达到一定的境界,才可灵活应用caffe,搞深度学习,走这条路对于菜鸟来说无疑很有难度。好在caffe为我们提供了一个可以用python编写新的网络层的方法,直接用python语言编写新的网络层,然后在caffe的网

机器学习的小学生 2904
上一篇: caffe中lstm的实现以及lstmlayer的理解
下一篇: 苹果笔记本设置MAC地址和ip地址
Ddreaming
博客等级 码龄10年 122粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值