本文为 AI 研习社编译的技术博客,原标题 :
Introduction to Convolutional Neural Networks (CNN) with TensorFlow
作者 | Marco Peixeiro
翻译 | Dddda 编辑 | 酱番梨、板烧汉堡杀手
原文链接:
https://towardsdatascience.com/introduction-to-convolutional-neural-networks-cnn-with-tensorflow-57e2f4837e18
由Stephanie Cook 拍摄
深度学习已经使得计算机视觉向前跨了一大步:从刷脸解锁手机到安全自动驾驶车辆。
卷积神经网络(CNN)是计算机视觉应用的基础框架。在这篇文章中,你将会学到 CNNs 的基础和计算机视觉的基础(例如卷积,填充,卷积步长和池化层)。我们将使用TensorFlow 来建立CNN做图片识别。
蜘蛛侠辨别蜘蛛侠理解卷积
卷积操作是卷积神经网络的构建基块,就是名字显示的。
目前,在计算机视觉领域,图像已经被处理为RGB(Red Green Blue)的得矩阵。这个概念在之前的推文中已经介绍过了。
为了完成卷积操作,我们需要一张图片和一个过滤器。因此,我们考虑用一个6*6的矩阵来表示图片的一部分。
6*6 矩阵过滤器我们使用一下的矩阵:
3 *3过滤层然后,卷积就是将滤波器叠加到图像矩阵上,将滤波器值与图像矩阵值的乘积相加,从而生成一个4*4的卷积层。
用语言很难表述清楚,这里有非常生动的动图来解释卷积:
卷积操作根据以上定义执行图像矩阵卷积,使用过滤器,你就能得到以下的矩阵:
4*4 输出层我们如何来理解这个输出层呢?
把每个值都考虑为一种颜色,或者像素有多暗(正值就表示为亮,负值就表示为暗),你就可以把输出层理解为:
输出层的理解因此,也就意味着特殊的过滤器具有检测图像的垂直边缘。
我们如何使用正确的过滤器?
一个很本质的问题,你可能会意识到有无数种过滤器你能运用到图片上。
结果就是,过滤器矩阵值是可以根据模型的目标进行训练的参数。因此,你可以选择实现特定应用的过滤器或者你可以使用向后传播方法来决定你的过滤器的最优值
计算机视觉填充
之前,我们已经见证了3*3的过滤层和6*6的图像卷积,会生成一个4*4的矩阵。这是因为对于一个6*6的图像,有4*4个可能的位置来过滤。
因此,每个卷积之后,图像收缩,也就意味着只能执行有限次的卷积操作,一直到图像再也不能收缩为止。此外,位于图像角落的像素仅使用一次,这会导致神经网络的信息丢失。
为了解决上述问题,使用填充。填充包括在输入图像周围添加边框,如下所示:
使用一层填充的图像正如你所看到的,添加的边界通常使用0来填充。 现在,图像角落的像素将会被多次使用来计算输出,有效的防止信息丢失。此外,这种方式能够让我们在输出中保持输入矩阵的形状。
例如我们的6*6的输入图像,如果我们添加在边界添加一层填充,我们将会得到一个8*8的矩阵。使用一个3*3的过滤器,我们会得到一个6*6的输出。
一个简单的公式能够帮我们计算输出的形状:
n代表输入的形状,p是填充大小,f是过滤层的形状。重申一次,我们有:
6*6的输入
填充1
3*3过滤器
因此,输出的形状应该是:6+2(1)-3+1=6。因此,输出层是6*6的矩阵,就像输入层图像。
填充也不是必须的。然而,使用填充的时候,通常是使用输出层和输入层的大小相同。这将会产生两种卷积。
当不使用填充的时候,这个叫“有效卷积”。否则,就称为“相同卷积”。为了决定填充大小来保持输入图像的维度,简单的把上面的公式等于n。在计算出p之后,你会得到:
你可能已经注意到f应该是奇数来使填充成为一个整数。因此,这已经是一个常识在计算机视觉领域。
步长卷积
之前,我们已经见证了步长为1时候的卷积。这就意味着过滤器水平和竖直方向每次移动步长都是1。
当移动步长大于1的时候,就是步长卷积。在以下的动图中,步长是2:
现在考虑步长的影响,输出的矩阵计算公式变为:
S是步长通常,如果得到的计算值不是一个整数的话,我们将向下取一个最近的整数。
池化层
池层是另一种减小图像解释尺寸以加快计算速度的方法,它使检测到的特征更加健壮。
解释池化最好使用一张图片。以下就是最大池化的例子:
2*2过滤最大池化正如看到的,我们选择一个2*2过滤器步长2。等同于将输入等分为4个正方形,我们取每个正方形的最大值,使用这个最大值作为输出。
平均池化也可以被执行,但是最流行的方式还是最大值池化。
为什么使用卷积神经网络?
我们现在已经有了很强的卷积神经网络的基础。但是为什么深度学习实践者要使用这个模型呢?
不像全连接层,卷积层有相对较少的一组参数需要学习。这是因为:
参数共享
连接的稀疏性
参数共享是特征检测器例如垂直方向边缘检测器,在许多的图像部分都是有用的。稀疏连接是指只有很少的一些特征与输出值有关。
例如上文中的最大池化,左上角的值对于输出仅仅取决于输入图像的2*2左上角的方形。
因此,我们可以训练在较少的数据集来减需要学习的参数,这些使得CNNs是一个非常强大的工具。
使用TensorFlow建立CNN
有了足够多的理论,让我们使用CNN来建立一个手写符号识别的过程。我们重新使用之前用的项目,来检测以下是否CNN能够达到更好的效果。
像以往一样,notebook在这里可以使用
第一步:预处理图像
再倒入了必要的包之后,我们加载数据集并且预处理图像:
第二步:创建容器
我们创建容器来储存特征和目标:
第三步:初始化参数
我们使用Xavier来初始化参数:
第四步:定义向后传播
现在,我们来定义向后传播,这是CNN的基础框架。我们将使用三层网络两个卷积层和一个全连接层:
第五步:计算代价方程
最终,我们将定义一个方程来计算代价:
第六步:整合模型
现在,我们已经整合了以上的所有生成了一个CNN网络。我们现在将会使用一个小数据集来做梯度下降训练:
https://gist.github.com/marcopeix/96a8b95cfd338bd1cb2a1613ab3e7cbb#file-tensorflow_cnn-py
现在我们来使用模型看训练的结果:
在我的案例中,我仅仅在只有CPU的电脑上训练CNN,得到了一个非常差的结果。如果使用带有CPU和GPU的电脑上,你将会得到一个好的结果。
祝贺!你现在已经知道了CNNs和计算机视觉的知识。尽管还有很多需要学,更多的技术将会介绍作为基石。
在下一次的推文中,我将会介绍使用核的残差网络,敬请期待。
想要继续查看该篇文章相关链接和参考文献?
点击【借助 TensorFlow 工具来学习 CNN 和计算机视觉】即可访问:
https://ai.yanxishe.com/page/TextTranslation/1701
社长今日推荐:AI入门、大数据、机器学习免费教程
35本世界顶级原本教程限时开放,这类书单由知名数据科学网站 KDnuggets 的副主编,同时也是资深的数据科学家、深度学习技术爱好者的Matthew Mayo推荐,他在机器学习和数据科学领域具有丰富的科研和从业经验。
网友评论