Skip to content

Commit

Permalink
feat: more on cnn
Browse files Browse the repository at this point in the history
  • Loading branch information
tiankaima committed Aug 3, 2024
1 parent 2142b67 commit 27ffc02
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 3 deletions.
67 changes: 64 additions & 3 deletions docs/ml/dl/cnn/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ Convolutional Neural Network,卷积神经网络。

值得注意的是,与上面深度神经网络中对 MNIST 对数据集的处理不同,在 CNN 中我们不对数据进行展平处理,而是保持其原有的形状,以便卷积操作。

输入数据的形状通常为 $(N, H, W, C)$,其中 $N$ 为批大小,$H$ 和 $W$ 分别为高和宽,$C$ 为通道数
(对每层来说) 输入数据的形状通常为 $(N, C, H, W)$,其中 $N$ 为批大小,$C$ 为通道数,$H$ 和 $W$ 分别为高和宽。

## 卷积层 Convolutional Layer

在全连接层中,因为不能与先假设特征之间的先验结构,因此必须使用大量的学习参数。但是这样的办法处理图像是几乎不可能实现的。考虑一张 1MP (1 million pixels) 的图像,如果第一个隐藏层有 1000 个神经元,那么就有 1 billion 个连接。这样的连接数目是不可接受的。

!!! note ""

一个反驳的观点是,保留 1MP 是不必要的,只需要预先将图片降采样到更小的尺寸。但与下文中利用图像本身的结构相比,这种方法无疑会丢失大量的特征信息。
一个反驳的观点是,保留 1MP 是不必要的,只需要预先将图片降采样到更小的尺寸。但与下文中利用图像本身的结构相比,在降低到一个可用的尺寸前,这种方法无疑会丢失大量的特征信息。

### 卷积操作 Convolution Operation

Expand Down Expand Up @@ -79,4 +79,65 @@ $$

!!! warning "卷积?互相关?"

上面的定义实际上是互相关 _Cross-Correlation_ 而不是卷积 _Convolution_。这两者相差一个反转操作, 如果预先将核翻转定义 $(i,j) \rightarrow (-i, -j)$, 那么上面的定义就是卷积操作。
上面的定义实际上是互相关 _Cross-Correlation_ 而不是卷积 _Convolution_。这两者相差一个反转操作,如果预先将核翻转定义 $(i,j) \rightarrow (-i, -j)$, 那么上面的定义就是卷积操作。

考虑输入图像尺寸 $n_h \times n_w$, Kernel 尺寸 $k_h \times k_w$, 则输出图像尺寸为:

$$
(n_h - k_h + 1) \times (n_w - k_w + 1)
$$

### 填充 Padding

注意到这样的操作会「丢失边缘像素」: 与其他像素相比,边缘像素被计算的次数更少。为了解决这个问题,我们可以在输入图像的周围填充一圈 $0$, 这样输出图像的尺寸就与输入图像相同了。这样的做法被称作 _Padding_,填充的数量通常用 $p=(p_h\times p_w)$ 表示,那么输出图像尺寸为:

$$
(n_h - k_h + 2p_h + 1) \times (n_w - k_w + 2p_w + 1)
$$

> 注:这里的填充量 $p_h, p_w$ 都是指单侧填充量。
多数情况下,我们会设置 $2p_h = k_h -1, 2p_w = k_w - 1$ 以保持输出图像尺寸与输入图像尺寸相同,为了方便,卷积核的尺寸一般也设置成奇数,保证顶部 (底部)、左侧 (右侧) 填充量相同。

### 步幅 Stride

如果滑动窗口不再以 $1$ 的步长滑动,而是以 $s$ 的步长滑动,那么输出图像尺寸为:

$$
\left\lfloor \frac{n_h - k_h + 2p_h}{s} \right\rfloor + 1 \times \left\lfloor \frac{n_w - k_w + 2p_w}{s} \right\rfloor + 1
$$

如果 $2p_h = k_h -1, 2p_w = k_w - 1$,那么输出图像尺寸为:

$$
\left\lfloor \frac{n_h - k_h + 1}{s} \right\rfloor \times \left\lfloor \frac{n_w - k_w + 1}{s} \right\rfloor
$$

进一步,如果 $k_h \vert n_h, k_w \vert n_w$,那么输出图像尺寸为:

$$
\frac{n_h}{k_h} \times \frac{n_w}{k_w}
$$

### 维数问题 {#dimension}

上面的讨论中我们仅处理了一个通道的图像,接下来我们考虑多通道的情况。

!!! warning ""

在下面的讨论中,只需要把张量理解成一个多维数组即可。

考虑输入形状 $(N, C, H, W)$, 在其上面使用一个 $(C', C, k_h, k_w)$ 的卷积核,输出形状为 $(N, C', H', W')$,其中 $H', W'$ 由上面的公式决定。

为详细说明这一点,我们以几个例子来说明:

- $C=1, C'=1$: 卷积核:$(1, 1, k_h, k_w)$,输出形状为 $(N, 1, H', W')$。
- $C=3, C'=1$: 卷积核:$(1, 3, k_h, k_w)$,输出形状为 $(N, 1, H', W')$。

相当于对每个通道的图像分别进行卷积操作,然后将结果相加,这实际上与一个 $n\times 3$ 的矩阵乘以一个 $3\times 1$ 的矩阵的操作是一样的。

- $C=3, C'=3$: 卷积核:$(3, 3, k_h, k_w)$,输出形状为 $(N, 3, H', W')$。

相当于 $N \times 3$ 的矩阵乘以一个 $3 \times 3$ 的矩阵。

有时也称 $(1, C, k_h, k_w)$ 的卷积核为 过滤器 _Filter_, 一个 Filter 对应一个输出通道,每个 Filter 中包含一个或多个卷积核,分别对应输入通道,并相加。
4 changes: 4 additions & 0 deletions docs/ml/dl/nn/bp.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,7 @@ $$
$$

其中 $\eta$ 是学习率 _learning rate_

!!! warning ""

注意 $\displaystyle\frac{\partial g^K}{\partial \theta}$ 就是 $\displaystyle\frac{\partial g^k}{\partial W^k_{a b}}$, $g^k \equiv g^K$, 区别仅仅在自变量上。

0 comments on commit 27ffc02

Please sign in to comment.