Skip to content

Commit

Permalink
Add kernel dimension info
Browse files Browse the repository at this point in the history
  • Loading branch information
HarleysZhang committed Dec 11, 2020
1 parent 58acd64 commit 852d791
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 13 deletions.
33 changes: 21 additions & 12 deletions 深度学习/深度学习基础.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@

> 图像张量的形状有两种约定,**通道在前**(channel-first)和**通道在后**(channel-last)的约定,常用深度学习框架使用的**数据张量形状**总结如下:
>
> Pytorch/Caffe: (N, C, H, W);TensorFlow/Keras: (N, H, W, C)。
> Pytorch/Caffe: (`N, C, H, W`);TensorFlow/Keras: (`N, H, W, C`)。
+ 注意:举例理解就是`Pytorch` 的卷积层和池化层的输入 `shape` 格式为 **(N,C,H,W)**`Keras` 的卷积层和池化层的输入 `shape` 格式为 **(N,H,W,C)**
+ 注意:对于 `Pytorch、Keras` 的卷积层和池化层函数,其** padding 参数值都默认为不填充像素**,默认值为 `0``valid`
Expand All @@ -64,9 +64,9 @@ class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return

**主要参数解释**

+ `kernel_size`(int or tuple) - max pooling的窗口大小
+ `stride`(int or tuple, optional) - max pooling的窗口移动的步长**默认值是 kernel_size**
+ `padding`(int or tuple, optional) - **默认值为 0,即不填充像素**输入的每一条边补充0的层数
+ `kernel_size`(int or tuple) - max pooling 的窗口大小
+ `stride`(int or tuple, optional) - max pooling 的窗口移动的步长**默认值是 kernel_size**
+ `padding`(int or tuple, optional) - **默认值为 0,即不填充像素**输入的每一条边补充 0 的层数
+ `ceil_mode` - **默认值为 False**,上述公式默认向下取整,如果等于 True,计算输出信号大小的时候,会使用向上取整。

> Pytorch 中池化层默认的 ceil mode 是 false,而 caffe 只实现了 ceil mode= true 的计算方式。
Expand Down Expand Up @@ -114,7 +114,7 @@ class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=

$$\left\lfloor\frac{W_{in} + 2 \times \text{padding}[0] - \text{dilation}[0]\times (\text{kernel_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor$$

> Caffe 框架输入输出数据的尺寸也是`(N, C, H, W)`)。
> `Pytorch/Caffe` 框架输入输出数据的尺寸都是`(N, C, H, W)`),卷积核尺寸都为(`C_out, C_in, H, W`)。
**主要参数解释**

Expand Down Expand Up @@ -153,17 +153,25 @@ print(output.shape) # 输出shape: torch.Size([20, 16, 24, 49])
keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
```

2D 卷积层 (例如对图像的空间卷积)。输入输出尺寸格式要求和池化层函数一样。**输入尺寸:(N,H,W,C)**
2D 卷积层 (例如对图像的空间卷积)。输入输出尺寸格式要求和池化层函数一样。**输入尺寸:(N,H,W,C)**,卷积核尺寸:(`H, W, C_in, C_out`

**当使用该层作为模型第一层时,需要提供 input_shape 参数**(整数元组,不包含 batch 轴),例如,`input_shape=(128, 128, 3)` 表示 `128x128``RGB` 图像,在 `data_format="channels_last"` 时。

**主要参数解释**
+ `filters`: 整数,输出空间的维度 (**即卷积中滤波器的输出数量**)。

+ `kernel_size`: 一个整数,或者 2 个整数表示的元组或列表, 指明 2D 卷积窗口的宽度和高度。 可以是一个整数,为所有空间维度指定相同的值。
+ `strides`: 一个整数,或者 2 个整数表示的元组或列表, 指明卷积沿宽度和高度方向的步长。 可以是一个整数,为所有空间维度指定相同的值。 指定任何 stride 值 != 1 与指定 dilation_rate 值 != 1 两者不兼容。
+ `padding`: `"valid"``"same"` (大小写敏感),默认`valid`

+ `strides`: 一个整数,或者 2 个整数表示的元组或列表, 指明卷积核模板沿宽度和高度方向的移动步长。 可以是一个整数,为所有空间维度指定相同的值。 指定任何 stride 值 != 1 与指定 dilation_rate 值 != 1 两者不兼容,默认取值 1,即代表会不遗漏的滑过输入图片(`Feature Map`)的每一个点。

+ `padding`: `"valid"``"same"` (大小写敏感),默认`valid`,这里的 "same"代表给边界加上 Padding 让卷积的输出和输入保持同样("same")的尺寸。

+ `data_format`: 字符串, `channels_last (默认)``channels_first` 之一,表示输入中维度的顺序。 `channels_last` 对应输入尺寸为 `(batch_size, height, width, channels)`, channels_first 对应输入尺寸为 `(batch_size, channels, height, width)`。 它默认为从 `Keras` 配置文件 `~/.keras/keras.json` 中 找到的 `image_data_format` 值。 如果你从未设置它,将使用 `channels_last`

+ `dilation_rate`: 一个整数或 2 个整数的元组或列表, 指定膨胀卷积(空洞卷积 `dilated convolution`)的膨胀率。 可以是一个整数,为所有空间维度指定相同的值。 当前,指定任何 dilation_rate 值 != 1 与 指定 stride 值 != 1 两者不兼容。



### 5.3,总结
`Pytorch` 的 Conv2d 函数不要求提供 输入数据的大小 `(H,W)`,但是要提供输入深度,`Keras``Conv2d` 函数第一层要求提供 `input_shape` 参数 `(H,W,C)`,其他层不需要。

Expand Down Expand Up @@ -192,6 +200,7 @@ $$L = -\sum_{c=1}^{M}y_{c}log(p_{c})或者H(p,q)=-\sum p(x)logq(x)$$
从数学上来理解就是,为了让学到的模型分布更接近真实数据的分布,我们需要最小化模型数据分布与训练数据之间的 `KL 散度`,而因为训练数据的分布是固定的,因此最小化 `KL 散度`等价于最小化交叉熵,而且交叉熵计算更简单,所以机器/深度学习中常用交叉熵 `cross-entroy` 作为分类问题的损失函数。
### 7.2,优化算法理解
`Adam``AdaGrad``RMSProp`优化算法具有自适应性。

## 八,感受野理解
感受野理解(`Receptive Field`)是指后一层神经元在前一层神经元的感受空间,也可以定义为卷积神经网络中每层的特征图(`Feature Map`)上的像素点在原始图像中映射的区域大小,即如下图所示:

Expand Down Expand Up @@ -448,15 +457,15 @@ L1 范数(`L1 norm`)是指向量中各个元素绝对值之和,也有个
+ 更多回答,参考此[链接](http://theorangeduck.com/page/neural-network-not-working)

## 二十三,VGG使用2个3*3卷积的优势在哪里?
(1). **减少网络层参数**用两个3\*3卷积比用1个5\*5卷积拥有更少的参数量,只有后者的2∗3∗3/5∗5=0.72。但是起到的效果是一样的,两个3*3的卷积层串联相当于一个5*5的卷积层,感受野的大小都是5×5,即1个像素会跟周围5*5的像素产生关联。把下图当成动态图看,很容易看到两个3×3卷积层堆叠(没有空间池化)有5×5的有效感受野
(1). **减少网络层参数**用两个 3\*3 卷积比用 1 个 5\*5 卷积拥有更少的参数量,只有后者的 2∗3∗3/5∗5=0.72。但是起到的效果是一样的,两个 3×3 的卷积层串联相当于一个 5×5 的卷积层,感受野的大小都是 5×5,即 1 个像素会跟周围 5×5 的像素产生关联。把下图当成动态图看,很容易看到两个 3×3 卷积层堆叠(没有空间池化)有 5×5 的有效感受野

![2个3*3卷积层](../images/2个3_3卷积层.png)

(2). **更多的非线性变换**2个3*3卷积层拥有比1个5*5卷积层更多的非线性变换(前者可以使用两次ReLU激活函数,而后者只有一次),使得卷积神经网络对特征的学习能力更强。
(2). **更多的非线性变换**2 个 3×3 卷积层拥有比 1 个 5×5 卷积层更多的非线性变换(前者可以使用两次 ReLU 激活函数,而后者只有一次),使得卷积神经网络对特征的学习能力更强。

***paper中给出的相关解释***三个这样的层具有7×7的有效感受野。那么我们获得了什么?例如通过使用三个3×3卷积层的堆叠来替换单个7×7层。首先,我们结合了三个非线性修正层,而不是单一的,这使得决策函数更具判别性。其次,我们减少参数的数量:假设三层3×3卷积堆叠的输入和输出有C个通道,堆叠卷积层的参数为3×(3×3C) = `27C` 个权重;同时,单个7×7卷积层将需要7×7×C = `49C` 个参数,即参数多81%。这可以看作是对7×7卷积滤波器进行正则化,迫使它们通过3×3滤波器(在它们之间注入非线性)进行分解。
***paper中给出的相关解释***三个这样的层具有 7×7 的有效感受野。那么我们获得了什么?例如通过使用三个 3×3 卷积层的堆叠来替换单个 7×7 层。首先,我们结合了三个非线性修正层,而不是单一的,这使得决策函数更具判别性。其次,我们减少参数的数量:假设三层 3×3 卷积堆叠的输入和输出有 C 个通道,堆叠卷积层的参数为 3×(3×3C) = `27C` 个权重;同时,单个 7×7 卷积层将需要 7×7×C = `49C` 个参数,即参数多 81%。这可以看作是对 7×7 卷积滤波器进行正则化,迫使它们通过 3×3 滤波器(在它们之间注入非线性)进行分解。

**此回答可以参考TensorFlow实战p110,网上很多回答都说的不全**
**此回答可以参考 TensorFlow 实战 p110,网上很多回答都说的不全**

### 23.1,1*1卷积的主要作用

Expand Down
2 changes: 1 addition & 1 deletion 深度学习/神经网络模型复杂度分析.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@

### 卷积层参数量

**卷积层权重参数量** = $K^2\times C_i\times C_o + C_o$。
**卷积层权重参数量** = $ C_i\times K^2\times C_o + C_o$。

$C_i$ 为输入特征图通道数,$K$ 为过滤器(卷积核)尺寸,$C_o$ 为输出的特征图的 `channel` 数(也是 `filter` 的数量),算式第二项是偏置项的参数量 。(一般不写偏置项,偏置项对总参数量的数量级的影响可以忽略不记,这里为了准确起见,把偏置项的参数量也考虑进来。)

Expand Down

0 comments on commit 852d791

Please sign in to comment.