Python|深度学习其实并不难:卷积神经网络的简单介绍

点击上方关注 , All in AI中国
关于CNN ,
第1部分:卷积神经网络的介绍
CNN是什么?:它们如何工作 , 以及如何在Python中从头开始构建一个CNN 。
在过去的几年里 , 卷积神经网络(CNN)引起了人们的广泛关注 , 尤其是因为它彻底的改变了计算机视觉领域 。 在这篇文章中 , 我们将以神经网络的基本背景知识为基础 , 探索什么是CNN , 了解它们是如何工作的 , 并在Python中从头开始构建一个真正的CNN(仅使用numpy) 。
准备好了吗?让我们开看看吧
1. 动机CNN的经典用例是执行图像分类 , 例如查看宠物的图像并判断它是猫还是狗 。 这看起来是一个简单的任务 , 那为什么不使用一个普通的神经网络呢?
好问题!
原因1:图像很大
现在用于计算机视觉问题的图像通常是224x224或更大的 。 想象一下 , 构建一个神经网络来处理224x224彩色图像:包括图像中的3个彩色通道(RGB) , 得到224×224×3 = 150,528个输入特征!在这样的网络中 , 一个典型的隐含层可能有1024个节点 , 因此我们必须为第一层单独训练150,528 x 1024 = 1.5 +亿个权重 。 我们的网络将是巨大的 , 几乎不可能训练的 。
我们也不需要那么多权重 。 图像的好处是 , 我们知道像素在相邻的上下文中最有用 。 图像中的物体是由小的局部特征组成的 , 比如眼睛的圆形虹膜或一张纸的方角 。 从第一个隐藏层中的每个节点来说 , 查看每个像素看起来不是很浪费吗?
原因二:立场可以改变
如果你训练一个网络来检测狗 , 你希望它能够检测狗 , 不管它出现在图像的什么地方 。 想象一下 , 训练一个网络 , 它能很好地处理特定的狗的图像 , 然后为它提供相同图像的略微移位的版本 。 狗不会激活相同的神经元 , 因此网络会有完全不同的反应!
我们很快就会看到CNN如何帮助我们解决这些问题 。
2.数据集在这篇文章中 , 我们将解决计算机视觉的"Hello , World!":MNIST手写数字分类问题 。这很简单:给定图像 , 将其分类为数字 。
Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
MNIST数据集中的每个图像都是28x28 , 并包含了一个以中心为中心的灰度数字 。
说实话 , 一个正常的神经网络实际上可以很好地解决这个问题 。 你可以将每个图像视为一个28x28 = 784维的向量 , 将其提供给一个784-dim的输入层 , 堆叠几个隐藏层 , 最后的输出层包含10个节点 , 每个数字对应一个节点 。
因为MNIST数据集包含小图像居中 , 所以我们不会遇到上述的大小或移动问题 。 然而 , 在这篇文章的整个过程中请记住 , 大多数现实世界中的图像分类问题并没有这么简单 。
那么 , 现在你已经有足够的积累了 。 让我们正式进入CNN的世界!
3.卷积什么是卷积神经网络?
它们基本上只是使用卷积层的神经网络 , 即基于卷积数学运算的Conv层 。Conv图层由一组滤镜组成 , 你可以将其看作是数字的二维矩阵 。这里有一个例子3x3过滤器:
Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
我们可以使用一个输入图像和一个过滤器通过将过滤器与输入图像进行卷积来生成一个输出图像 。 这包括

  1. 将过滤器覆盖在图像的某个位置上 。
  2. 在过滤器中的值与其在图像中的对应值之间执行元素级乘法 。
  3. 总结所有元素产品 。 这个和是输出图像中目标像素的输出值 。
  4. 对所有位置重复 。
旁注:我们(以及许多CNN实现)实际上在技术上使用的是互相关而不是卷积 , 但它们做的几乎是一样的 。 我不会在这篇文章中详细讨论它们之间的区别 , 因为这并不重要 。
这四步描述有点抽象 , 我们来做个例子 。 看下这个微小的4x4灰度图像和这个3x3滤镜:
Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
图像中的数字表示像素强度 , 其中0为黑色 , 255为白色 。 我们将卷积输入图像和过滤器产生一个2x2输出图像:
Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
首先 , 让我们将滤镜叠加在图片的左上角:
Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
接下来 , 我们在重叠图像值和过滤器值之间执行逐元素乘法 。以下是结果 , 从左上角开始向右 , 然后向下:
Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
接下来 , 我们总结所有的结果 。 这是很容易: