# CNN

## 卷积层的原理

> 在图像处理中，卷积核矩阵的数值是根据经验人工设计的
>
> 卷积神经网络就是通过自动学习的手段来得到各种有用的卷积核

## 感受野的概念

> 卷积核在一次卷积操作时对原图像的作用范围称为感受野，不同的卷积层有不同的感受野。 网络前面的卷积层感受野小，用于提取图像细节的信息；后面的卷积层感受野更大，用于提取更大范围的、高层的抽象信息

## 多通道卷积

> 卷积层每个**卷积核的通道数必须和输入特征图像的通道数相同** 本层**输出图像的通道数等于本层的卷积核数**

![](/files/-LqCiMFuWmnoX2CrKhco)

## 为什么图像要弃用神经网络

> 以手写识别的数据你MNIST举例，每个图像的是一个长宽均为28，channel为1的单色图像，使用全连接的网络结构 网络有28 *28 =784个神经元（RGB3色的话还要*3），hidden层如果使用了15个神经元 需要的参数个数：28 *28* 15 \* 10 + 15 + 10=117625个 这个数量级到现在为止也是一个很恐怖的数量级，所以不现实

## 卷积层

> 会定义一个权重矩阵，也就是我们说的W（称作卷积的核kernel、也有称过滤器filter） 这个权重矩阵的大小一般为`3 * 3` 或者`5 * 5`，但是在LeNet里面还用到了比较大的`7 * 7` 在输入矩阵上使用权重矩阵进行滑动，每滑动一步，将所覆盖的值与矩阵对应的值相乘 将结果求和并作为输出矩阵的一项，依次类推直到全部计算完成

如图，输入是一个 `5 * 5`的矩阵，通过使用一次`3 * 3`的卷积核计算得到的计算结果是一个`3 * 3`的新矩阵， 那么新矩阵的大小是如何计算的呢？

> n为我们输入的矩阵的大小、卷积核大小 f、边界填充p、步长s，则输出大小为：$$\frac{n-f+2p}{s} +1$$ 向下取整

![](/files/-LokoRcFufpsG54Q2u08)

> 通常，在每一个卷积层中都会设置多个核，每个核代表着不同的特征，这些特征就是需要传递到下一层的输出，而我们训练的过程就是训练这些不同的核

## 激活函数

由于卷积的操作也是线性的，所以也需要进行激活，一般情况下，都会使用relu。

## 池化层（pooling）

池化层是CNN的重要组成部分，通过`减少卷积层之间的连接，降低运算复杂程度`，池化层的操作很简单，就想`相当于是合并`，我们输入一个过滤器的大小，与卷积的操作一样，也是一步一步滑动，但是过滤器覆盖的区域进行合并，只保留一个值。 合并的方式也有很多种，例如我们常用的`两种取最大值maxpooling，取平均值avgpooling`

池化层的`输出大小公式`也`与卷积层一样`，由于没有进行填充，所以`p=0`，可以简化为 $$\frac{n-f}{s} +1$$

## dropout层

dropout是2014年 Hinton 提出防止过拟合而采用的trick，增强了模型的泛化能力 `Dropout（随机失活）`是指在深度学习网络的训练过程中，按照`一定的概率将一部分神经网络单元暂时从网络中丢弃`，相当于从原始的网络中找到一个更瘦的网络，说的通俗一点，就是随机将一部分网络的传播掐断，听起来好像不靠谱，但是通过实际测试效果非常好。 原文[Dropout: A Simple Way to Prevent Neural Networks from Overfitting](http://jmlr.org/papers/v15/srivastava14a.html)

## 全连接层

全链接层`一般是作为最后的输出层使用`，`卷积的作用是提取图像的特征`，最后的全连接层就是要通过这些特征来进行计算，`输出我们所要的结果`了，`无论是分类，还是回归`。

我们的特征都是使用矩阵表示的，所以再传入全连接层之前还需要对特征进行压扁，将他这些特征变成一维的向量，如果要进行分类的话，就是`用sofmax`作为输出，如果要是回归的话就直接使用linear即可。

## 完整的反向传播算法

![](/files/-LqCiMG-68fn1PzFEla0)

## 模型编程

* pytorch
  * [AlexNet](/pytorch/ji-suan-ji/pytorch/cnn-xi/alexnet.md)
  * [GoogLeNet](/pytorch/ji-suan-ji/pytorch/cnn-xi/googlenet.md)
  * [RestNet](/pytorch/ji-suan-ji/pytorch/cnn-xi/restnet.md)
  * [VGG](/pytorch/ji-suan-ji/pytorch/cnn-xi/vgg.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://im-qianuxn.gitbook.io/pytorch/ji-suan-ji/shen-du-xue-xi-li-lun/cnn.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
