卷积神经网络参数说明

本文详细解析了Caffe神经网络中的各种层结构,包括卷积层、池化层、激励层、数据层等,提供了关键参数的详细介绍。

由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结。


1. Vision Layers

1.1 卷积层(Convolution)

类型:CONVOLUTION

例子

layers {  name: "conv1"  type: CONVOLUTION  bottom: "data"  top: "conv1"  blobs_lr: 1          # learning rate multiplier for the filters  blobs_lr: 2          # learning rate multiplier for the biases  weight_decay: 1      # weight decay multiplier for the filters  weight_decay: 0      # weight decay multiplier for the biases  convolution_param {    num_output: 96     # learn 96 filters    kernel_size: 11    # each filter is 11x11    stride: 4          # step 4 pixels between each filter application    weight_filler {      type: "gaussian" # initialize the filters from a Gaussian      std: 0.01        # distribution with stdev 0.01 (default mean: 0)    }    bias_filler {      type: "constant" # initialize the biases to zero (0)      value: 0    }  }}


blobs_lr: 学习率调整的参数,在上面的例子中设置权重学习率和运行中求解器给出的学习率一样,同时是偏置学习率为权重的两倍。 

weight_decay

 

卷积层的重要参数

必须参数:

num_output (c_o):过滤器的个数

kernel_size (or kernel_h and kernel_w):过滤器的大小

 

可选参数:

weight_filler [default type: 'constant' value: 0]:参数的初始化方法

bias_filler:偏置的初始化方法

bias_term [default true]:指定是否是否开启偏置项

pad (or pad_h and pad_w) [default 0]:指定在输入的每一边加上多少个像素

stride (or stride_h and stride_w) [default 1]:指定过滤器的步长

group (g) [default 1]: If g > 1, we restrict the connectivityof each filter to a subset of the input. Specifically, the input and outputchannels are separated into g groups, and the ith output group channels will beonly connected to the ith input group channels.

 

通过卷积后的大小变化:

输入:n * c_i * h_i * w_i

输出:n * c_o * h_o * w_o,其中h_o = (h_i + 2 * pad_h - kernel_h) /stride_h + 1,w_o通过同样的方法计算。


1.2 池化层(Pooling)

类型:POOLING

例子

layers {  name: "pool1"  type: POOLING  bottom: "conv1"  top: "pool1"  pooling_param {    pool: MAX    kernel_size: 3 # pool over a 3x3 region    stride: 2      # step two pixels (in the bottom blob) between pooling regions  }}

卷积层的重要参数

必需参数:

kernel_size (or kernel_h and kernel_w):过滤器的大小

 

可选参数:

pool [default MAX]:pooling的方法,目前有MAX, AVE, 和STOCHASTIC三种方法

pad (or pad_h and pad_w) [default 0]:指定在输入的每一遍加上多少个像素

stride (or stride_h and stride_w) [default1]:指定过滤器的步长

 

通过池化后的大小变化:

输入:n * c_i * h_i * w_i

输出:n * c_o * h_o * w_o,其中h_o = (h_i + 2 * pad_h - kernel_h) /stride_h + 1,w_o通过同样的方法计算。


1.3 Local Response Normalization (LRN)

类型:LRN

Local ResponseNormalization是对一个局部的输入区域进行的归一化(激活a被加一个归一化权重(分母部分)生成了新的激活b),有两种不同的形式,一种的输入区域为相邻的channels(cross channel LRN),另一种是为同一个channel内的空间区域(within channel LRN)

计算公式:对每一个输入除以

 

可选参数:

local_size [default 5]:对于cross channel LRN为需要求和的邻近channel的数量;对于within channel LRN为需要求和的空间区域的边长

alpha [default 1]:scaling参数

beta [default 5]:指数

norm_region [default ACROSS_CHANNELS]: 选择哪种LRN的方法ACROSS_CHANNELS 或者WITHIN_CHANNEL


2. Loss Layers

深度学习是通过最小化输出和目标的Loss来驱动学习。


2.1 Softmax

类型: SOFTMAX_LOSS

2.2 Sum-of-Squares / Euclidean

类型: EUCLIDEAN_LOSS


2.3 Hinge / Margin

类型: HINGE_LOSS

例子:

# L1 Normlayers {  name: "loss"  type: HINGE_LOSS  bottom: "pred"  bottom: "label"}# L2 Normlayers {  name: "loss"  type: HINGE_LOSS  bottom: "pred"  bottom: "label"  top: "loss"  hinge_loss_param {    norm: L2  }}

可选参数:

norm [default L1]: 选择L1或者 L2范数

输入:

n * c * h * wPredictions

n * 1 * 1 * 1Labels

输出

1 * 1 * 1 * 1Computed Loss


2.4 Sigmoid Cross-Entropy

类型:SIGMOID_CROSS_ENTROPY_LOSS

2.5 Infogain

类型:INFOGAIN_LOSS

2.6 Accuracy and Top-k

类型:ACCURACY 
用来计算输出和目标的正确率,事实上这不是一个loss,而且没有backward这一步。

3. 激励层(Activation / Neuron Layers)

一般来说,激励层是element-wise的操作,输入和输出的大小相同,一般情况下就是一个非线性函数。

3.1 ReLU / Rectified-Linear and Leaky-ReLU

类型: RELU

例子:

layers {  name: "relu1"  type: RELU  bottom: "conv1"  top: "conv1"}

可选参数:

negative_slope [default 0]:指定输入值小于零时的输出。

 

ReLU是目前使用做多的激励函数,主要因为其收敛更快,并且能保持同样效果。

标准的ReLU函数为max(x, 0),而一般为当x > 0时输出x,但x <= 0时输出negative_slope。RELU层支持in-place计算,这意味着bottom的输出和输入相同以避免内存的消耗。


3.2 Sigmoid

类型: SIGMOID

例子:

layers {  name: "encode1neuron"  bottom: "encode1"  top: "encode1neuron"  type: SIGMOID}
SIGMOID 层通过 sigmoid(x) 计算每一个输入x的输出,函数如下图。

3.3 TanH / Hyperbolic Tangent

类型: TANH

例子:

layers {  name: "encode1neuron"  bottom: "encode1"  top: "encode1neuron"  type: SIGMOID}

TANH层通过 tanh(x) 计算每一个输入x的输出,函数如下图。


3.3 Absolute Value

类型: ABSVAL

例子:

layers {  name: "layer"  bottom: "in"  top: "out"  type: ABSVAL}
ABSVAL层通过 abs(x) 计算每一个输入x的输出。


3.4 Power

类型: POWER

例子:

layers {  name: "layer"  bottom: "in"  top: "out"  type: POWER  power_param {    power: 1    scale: 1    shift: 0  }}

可选参数:
power [default 1]
scale [default 1]
shift [default 0]

POWER层通过 (shift + scale * x) ^ power计算每一个输入x的输出。


3.5 BNLL

类型: BNLL

例子:

layers {  name: "layer"  bottom: "in"  top: "out"  type: BNLL}

BNLL (binomial normal log likelihood) 层通过 log(1 + exp(x)) 计算每一个输入x的输出。


4. 数据层(Data Layers)

数据通过数据层进入Caffe,数据层在整个网络的底部。数据可以来自高效的数据库(LevelDB 或者 LMDB),直接来自内存。如果不追求高效性,可以以HDF5或者一般图像的格式从硬盘读取数据。


4.1 Database

类型:DATA

必须参数:

source:包含数据的目录名称

batch_size:一次处理的输入的数量

 

可选参数:

rand_skip:在开始的时候从输入中跳过这个数值,这在异步随机梯度下降(SGD)的时候非常有用

backend [default LEVELDB]: 选择使用 LEVELDB 或者 LMDB


4.2 In-Memory

类型: MEMORY_DATA
必需参数:
batch_size, channels, height, width: 指定从内存读取数据的大小
The memory data layer reads data directly from memory, without copying it. In order to use it, one must call MemoryDataLayer::Reset (from C++) or Net.set_input_arrays (from Python) in order to specify a source of contiguous data (as 4D row major array), which is read one batch-sized chunk at a time.


4.3 HDF5 Input

类型: HDF5_DATA
必要参数:
source:需要读取的文件名

batch_size:一次处理的输入的数量


4.4 HDF5 Output

类型: HDF5_OUTPUT
必要参数:
file_name: 输出的文件名

HDF5的作用和这节中的其他的层不一样,它是把输入的blobs写到硬盘


4.5 Images

类型: IMAGE_DATA
必要参数:
source:  text文件的名字,每一行给出一张图片的文件名和label
batch_size:  一个batch中图片的数量
可选参数:
rand_skip: 在开始的时候从输入中跳过这个数值,这在异步随机梯度下降(SGD)的时候非常有用
shuffle [default false]

new_height, new_width: 把所有的图像resize到这个大小


4.6 Windows

类型:WINDOW_DATA

4.7 Dummy

类型:DUMMY_DATA

Dummy 层用于development 和debugging。具体参数DummyDataParameter。


5. 一般层(Common Layers)

5.1 全连接层Inner Product

类型:INNER_PRODUCT
例子:
layers {  name: "fc8"  type: INNER_PRODUCT  blobs_lr: 1          # learning rate multiplier for the filters  blobs_lr: 2          # learning rate multiplier for the biases  weight_decay: 1      # weight decay multiplier for the filters  weight_decay: 0      # weight decay multiplier for the biases  inner_product_param {    num_output: 1000    weight_filler {      type: "gaussian"      std: 0.01    }    bias_filler {      type: "constant"      value: 0    }  }  bottom: "fc7"  top: "fc8"}

必要参数:

num_output (c_o):过滤器的个数

 

可选参数:

weight_filler [default type: 'constant' value: 0]:参数的初始化方法

bias_filler:偏置的初始化方法

bias_term [default true]:指定是否是否开启偏置项

 

通过全连接层后的大小变化:

输入:n * c_i * h_i * w_i

输出:n * c_o * 1 *1


5.2 Splitting

类型:SPLIT
Splitting层可以把一个输入blob分离成多个输出blobs。这个用在当需要把一个blob输入到多个输出层的时候。

5.3 Flattening

类型:FLATTEN
Flattening是把一个输入的大小为n * c * h * w变成一个简单的向量,其大小为 n * (c*h*w) * 1 * 1。

5.4 Concatenation

类型:CONCAT


例子:
layers {  name: "concat"  bottom: "in1"  bottom: "in2"  top: "out"  type: CONCAT  concat_param {    concat_dim: 1  }}

可选参数:

concat_dim [default 1]:0代表链接num,1代表链接channels

 

通过全连接层后的大小变化:

输入:从1到K的每一个blob的大小n_i * c_i * h * w

输出:

如果concat_dim = 0: (n_1 + n_2 + ... + n_K) *c_1 * h * w,需要保证所有输入的c_i 相同。

如果concat_dim = 1: n_1 * (c_1 + c_2 + ... +c_K) * h * w,需要保证所有输入的n_i 相同。

 

通过Concatenation层,可以把多个的blobs链接成一个blob。


5.5 Slicing

The SLICE layer is a utility layer that slices an input layer to multiple output layers along a given dimension (currently num or channel only) with given slice indices.

5.6 Elementwise Operations

类型:ELTWISE

5.7 Argmax

类型:ARGMAX

5.8 Softmax

类型:SOFTMAX

5.9 Mean-Variance Normalization

类型:MVN


6. 参考

Caffe

<think>首先,用户的问题是关于如何计算卷积神经网络CNN)中的参数数量。系统指令要求我使用中文回答,并确保所有数学表达式使用$...$格式,独立公式使用$$...$$格式。另外,我需要生成相关问题,并在回答中引用段落末尾添加引用标识。 用户提供了几个引用,这些是关于CNN参数计算的。我需要参考这些引用,但必须基于用户的问题来构建回答。用户的问题是:“我想计算卷积神经网络参数量 请问如何计算卷积神经网络中的参数数量”。 关键点: - 计算CNN参数数量。 - 引用中提到了一些公式和例子。 从引用中提取有用信息: - 引用[1]:提到参数数量计算的重要性。 - 引用[2]:讨论了参数数量和计算量(FLOPs)。 - 引用[3]:给出了一个例子,计算输出尺寸、权重参数数量和乘法计算次数。 - 引用[4]:提供了具体计算,如每个卷积核的参数个数:对于5x5卷积核,输入通道3,输出通道10,参数为(5*5*3 + 1)*10 = 760。 - 引用[5]:讨论了输出尺寸的计算:(N - F)/stride + 1。 回答结构: 1. **解释参数是什么**:在CNN中,参数主要包括卷积核的权重和偏置项。 2. **公式推导**:对于卷积层,参数数量取决于输入通道数、输出通道数、卷积核大小和是否包含偏置。 3. **一般公式**:对于一个卷积层: - 输入通道数:$C_{in}$ - 输出通道数:$C_{out}$ - 卷积核大小:$K \times K$ - 参数数量 = 权重数量 + 偏置数量 - 权重数量 = $C_{out} \times (C_{in} \times K \times K)$ - 偏置数量 = $C_{out}$(每个输出通道一个偏置) - 总参数数量 = $C_{out} \times (C_{in} \times K \times K) + C_{out}$ - 简化:$C_{out} \times (C_{in} \times K^2 + 1)$ 4. **使用$...$格式**:确保所有数学表达式用$...$包围。 5. **独立公式**:对于关键公式,使用$$...$$格式并单独成段。 6. **例子**:使用引用中的例子或创建一个简单例子来说明。 - 例如,引用[4]的例子:输入通道3,输出通道10,卷积核5x5,参数为$10 \times (3 \times 5 \times 5 + 1) = 10 \times 76 = 760$。 7. **其他层**:提到全连接层等其他层的参数计算,但用户焦点在卷积层。 - 全连接层:输入神经元数$N_{in}$,输出神经元数$N_{out}$,参数数量 = $N_{in} \times N_{out} + N_{out}$(权重加偏置)。 8. **生成相关问题**:在回答结束后,添加“§§相关问题§§”部分,列出相关问题。 9. **引用标识**:在回答中引用段落时,在末尾添加引用标识如[^1]。 回答大纲: - 介绍:解释CNN参数的重要性。 - 详细计算:推导卷积层的参数公式。 - 示例:给出一个具体例子。 - 其他层简要:简要提及其他层如池化层(通常无参数)、全连接层。 - 总结。 - 相关问题。 生成相关问题: 基于用户问题,类似示例中的问题: 1. 如何计算CNN中的计算量(FLOPs)? 2. 卷积层参数数量如何影响模型性能? 3. 有哪些减少CNN参数数量的方法? 4. 在CNN中,池化层有参数吗? 5. 如何计算残差网络中的参数数量? 确保回答真实可靠:基于标准CNN知识,引用提供的例子。</think>### 如何计算卷积神经网络中的参数数量 卷积神经网络CNN)的参数数量计算是模型设计和优化的关键步骤,直接影响模型的存储需求和训练效率[^1]。参数主要包括卷积核的权重(weights)和偏置项(biases),这些参数在训练过程中通过反向传播更新。下面我将逐步解释计算方法,重点关注卷积层(这是CNN的核心层),并提供公式和示例。 #### 1. **卷积层的参数数量计算** 卷积层是CNN参数最密集的部分。参数数量取决于输入通道数、输出通道数、卷积核大小以及是否包含偏置项。一般公式如下: - 设: - $C_{in}$:输入通道数(例如,RGB图像的$C_{in} = 3$) - $C_{out}$:输出通道数(即卷积核的数量) - $K$:卷积核大小(通常为$K \times K$的正方形核) - 每个卷积核的参数包括: - 权重数量:每个卷积核有$C_{in} \times K \times K$个权重(因为每个输入通道对应一个$K \times K$的核)。 - 偏置数量:每个输出通道有一个偏置项(通常为1个)。 - 因此,一个卷积核的参数数量为$C_{in} \times K^2 + 1$。 - 由于有$C_{out}$个卷积核,总参数数量为: $$ \text{参数数量} = C_{out} \times (C_{in} \times K^2 + 1) $$ 这个公式是计算卷积层参数的基础[^4][^5]。注意: - 如果卷积层不包含偏置项(某些实现中可省略),则公式简化为$C_{out} \times C_{in} \times K^2$。 - 步长(stride)和填充(padding)不影响参数数量,它们只改变输出特征图的尺寸,但不改变参数本身[^5]。 #### 2. **示例计算** 让我们通过一个具体例子来说明。假设有一个卷积层,输入为64张$256 \times 256$的RGB图像(输入尺寸为$64 \times 3 \times 256 \times 256$,其中64是批量大小,3是输入通道),卷积核大小为$5 \times 5$,输出通道数为6(即6个卷积核)[^3]。 - 输入通道数$C_{in} = 3$ - 输出通道数$C_{out} = 6$ - 卷积核大小$K = 5$ - 代入公式: $$ \text{参数数量} = 6 \times (3 \times 5^2 + 1) = 6 \times (3 \times 25 + 1) = 6 \times 76 = 456 $$ - 解释: - 权重部分:每个卷积核有$3 \times 5 \times 5 = 75$个权重(因为输入有3个通道,每个通道对应一个5x5核)。 - 偏置部分:每个输出通道1个偏置,共6个。 - 总参数:456个。 这个结果与引用中的例子一致[^4]。注意,批量大小(如64)不影响参数数量,因为参数是共享的,只在训练时用于梯度计算。 #### 3. **其他层的参数计算** CNN中还有其他层,但卷积层通常是参数的主要来源: - **全连接层(Fully Connected Layer)**:参数数量取决于输入和输出神经元数。设输入神经元数为$N_{in}$,输出神经元数为$N_{out}$,则参数数量为$N_{in} \times N_{out} + N_{out}$(权重加偏置)[^1]。 - **池化层(Pooling Layer)**:通常无参数(如最大池化或平均池化),因为它们是固定操作,不涉及可训练权重。 - **批量归一化层(Batch Normalization)**:有少量参数(每个通道的缩放因子和偏移量),计算为$2 \times C$,其中$C$是通道数[^2]。 - **激活层(如ReLU)**:无参数。 在计算整个CNN参数总量时,需要逐层求和。例如,一个简单CNN可能包括卷积层、池化层和全连接层,只累加有参数的层。 #### 4. **参数计算的意义和注意事项** - **为什么重要**:参数数量影响模型大小和计算效率。参数过多可能导致过拟合和存储开销,过少则可能欠拟合[^1]。 - **实际工具**:在实际中,您可以使用深度学习框架(如PyTorch或TensorFlow)的API自动计算参数总量。例如,在PyTorch中调用`model.parameters()`或使用`torchsummary`库。 - **优化提示**:减少参数的方法包括使用更小的卷积核(如3x3代替5x5)、深度可分离卷积(depthwise separable convolution),或增加步长以降低输出尺寸[^2]。 通过以上步骤,您可以准确计算任何CNN参数量。如果您有具体网络架构,我可以帮助逐步计算。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值