diff --git a/docs/ml/dl/cnn/index.md b/docs/ml/dl/cnn/index.md index 070d7ec..0bd2f1b 100644 --- a/docs/ml/dl/cnn/index.md +++ b/docs/ml/dl/cnn/index.md @@ -19,7 +19,7 @@ Convolutional Neural Network,卷积神经网络。 值得注意的是,与上面深度神经网络中对 MNIST 对数据集的处理不同,在 CNN 中我们不对数据进行展平处理,而是保持其原有的形状,以便卷积操作。 -输入数据的形状通常为 $(N, H, W, C)$,其中 $N$ 为批大小,$H$ 和 $W$ 分别为高和宽,$C$ 为通道数。 +(对每层来说) 输入数据的形状通常为 $(N, C, H, W)$,其中 $N$ 为批大小,$C$ 为通道数,$H$ 和 $W$ 分别为高和宽。 ## 卷积层 Convolutional Layer @@ -27,7 +27,7 @@ Convolutional Neural Network,卷积神经网络。 !!! note "" - 一个反驳的观点是,保留 1MP 是不必要的,只需要预先将图片降采样到更小的尺寸。但与下文中利用图像本身的结构相比,这种方法无疑会丢失大量的特征信息。 + 一个反驳的观点是,保留 1MP 是不必要的,只需要预先将图片降采样到更小的尺寸。但与下文中利用图像本身的结构相比,在降低到一个可用的尺寸前,这种方法无疑会丢失大量的特征信息。 ### 卷积操作 Convolution Operation @@ -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 中包含一个或多个卷积核,分别对应输入通道,并相加。 diff --git a/docs/ml/dl/nn/bp.md b/docs/ml/dl/nn/bp.md index 374362e..dba67de 100644 --- a/docs/ml/dl/nn/bp.md +++ b/docs/ml/dl/nn/bp.md @@ -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$, 区别仅仅在自变量上。