Architecture of Convolutional Neural Networks (CNNs) demystified翻译

原文链接:https://www.analyticsvidhya.com/blog/2017/06/architecture-of-convolutional-neural-networks-simplified-demystified/

介绍
坦白来说,曾经有一段时间我并不真正理解深度学习。我会看着关于深度学习的研究论文和文章,觉得这是一个非常复杂的课题。我试着理解神经网络及其各种类型,但它看起来仍然很难。

后来有一天,我决定一步一步走。我决定从基础做起,在基础上再接再厉。我决定,分解这些技术中应用的步骤,并手动执行这些步骤(和计算),直到我了解它们是如何工作的。这需要时间和巨大的努力,但结果却是惊人的。

现在,我不仅能理解深度学习的领域,我还能把内容可视化,想出更好的方法,因为我对基本原理很清楚。无意识地应用神经网络是一回事,理解背后发生了什么和事情是如何发生的则是另一回事。

今天,我要和大家分享这个秘诀。我将向你们展示我是如何利用卷积神经网络,并研究它们,知道我理解它们。我将带你走过这段旅程,让你深入了解CNN的工作原理。

如果你想以课程形式学习CNN的架构和工作,你也可以报名参加这个免费课程:Convolutional Neural Networks from Scratchhttps://courses.analyticsvidhya.com/courses/convolutional-neural-networks-cnn-from-scratch?utm_source=blog&utm_medium=architecture-of-convolutional-neural-networks-simplified-demystified

在这篇文章中,我将讨论卷积神经网络背后的体系结构,它是用来解决图像识别和分类问题的。

我假设你对神经网络的工作原理有基本的了解。如果你不确定你是否理解神经网络,希望你在继续阅读之前把这篇文章https://www.analyticsvidhya.com/blog/2017/05/neural-network-from-scratch-in-python-and-r/通读一遍。

目录
1.机器如何看图像?

2.我们如何帮助神经网络识别图像?

3.卷积神经网络的定义
(1)卷积层
(2)池化层
(3)输出层

4.组合

5.利用CNN对图像进行分类

 
 

1.机器如何看图像?
人脑是一台非常强大的机器。我们每秒钟都会看到(捕捉)多个图像,并对它们进行处理,而没有意识到处理是如何完成的。但是,机器不是这样的。图像处理的第一步是了解如何表示一个图像,以便机器能够读取它?

简单地说,每个图像都是按特殊顺序排列的点(像素)阵。如果改变像素的顺序或颜色,图像也会随之改变。让我们举个例子。比如说,你想存储和读取一个写有数字4的图像。

机器基本上会把这个图像分解成一个像素矩阵,并将每个像素的颜色代码存储在代表位置。在下面的表示中,数字1是白色,256是最深的绿色(为了简单起见,我将示例限制为只有一种颜色)。
一旦你以这种格式存储了图像,下一个挑战就是让我们的神经网络理解排列和模式。

 
 

2.我们如何帮助神经网络识别图像?
通过以某种方式排列像素来形成数字。
假设我们尝试使用全连接的网络来识别它?它是怎么做的?

一个全连接的网络将这幅图像作为一个阵列,通过将其展平并将像素值作为特征来预测图像中的数字。网络很难理解到底发生了什么。

即使是人类也不可能识别出这是数字4的表示。我们完全失去了像素的空间排列。

我们能做什么?让我们尝试从原始图像中提取特征,以便保留空间排列。

方法1:
这里我们使用了一个权重来乘以初始像素值。
肉眼很容易辨认出这是4。但同样要把这张图片发送到一个全连接的网络,我们必须把它展平。我们无法保留图像的空间排列。

方法2:
现在我们可以看到,将图像展平会完全破坏其像素排列。我们需要设计一种方法,将图像送到一个网络中,而不需要将它们展平并保留其空间排列。我们需要发送二维/三维像素值排列。

让我们尝试一次获取图像的两个像素值,而不是仅获取一个像素值。这将使网络对相邻像素的外观有一个非常好的了解。现在我们一次取两个像素,我们也要取两个权重值。

我希望你注意到,现在的图像从最初的4列排列变成了3列排列。图像变小了,因为我们现在一次移动两个像素(像素在每次移动中共享)。我们把图像缩小了,我们仍然可以在很大程度上理解它是4。另外,需要认识到的一个重要事实是,我们取两个连续的水平像素,因此这里只考虑水平排列。

这是从图像中提取特征的一种方法。我们可以很好地看到左边和中间的部分,但是右边不是很清楚。这是因为以下两个问题:

图像的左边和右边仅乘以一次权重。

左侧部分仍然保留,因为权重值较高,而右侧部分由于权重值较低而略有损失。

现在我们有两个问题,我们也要有两个解决办法。

方法3:
我们遇到的问题是图像的左、右两侧只经过一次权重。我们需要做的是,我们需要网络把边界点当做其他像素点一样考虑。

我们有一个简单的解决办法。沿权重移动的两侧放置零。

你可以看到,通过添加零,可以保留边界点的信息。图像的大小也更大。这可以用于我们不希望图像尺寸减小的情况。

方法4:
我们这里要解决的问题是,右边的权重值更小,导致右边的像素值也更小,因此很难识别。我们所能做的是,我们一次使用多个权重值并将它们放在一起。

权重为(1,0.3)时,有如下结果:

权重为(0.1,1.5)时,有如下结果:

这两幅图片的组合版本会给我们一个非常清晰的画面。因此,我们所做的只是简单地使用多个权值,而不是仅仅一个权值来保留有关图像的更多信息。最终输出将是上述两个图像的组合版本。

 
方法5:

到目前为止,我们一直在使用权重,试图把水平像素放在一起。但在大多数情况下,我们需要保持水平和垂直方向的空间排列。我们可以将权重变成一个二维矩阵,该矩阵将水平方向和垂直方向上的像素放在一起。另外,请记住,由于我们同时采用了权重的水平和垂直移动,因此输出在水平和垂直方向上都少一个像素。
所以我们该怎么做呢?
我们在上面所做的是,我们试图通过使用图像的空间排列从图像中提取特征。对于一个网络来说,要想了解一个图像,理解像素是如何排列的极其重要。我们上面所做的正是卷积神经网络所做的。我们可以对输入图像定义一个权重矩阵,然后对输入进行卷积,在不丢失图像空间排列信息的前提下,从图像中提取特定的特征。

这种方法的另一个好处是减少了图像中的参数数量。正如你在上面看到的,与原始图像相比,卷积图像的像素较少。这大大减少了我们需要为网络训练的参数数量。

 
 
3.定义一个卷积神经网络
定义一个基本的卷积神经网络,我们需要三个基本组成部分:
(1)卷积层
(2)池化层
(3)输出层
让我们详细地了解每一部分。

3.1卷积层
在这一层中,所发生的操作正是我们在上面的方法5中看到的。假设我们有一个6x6的图像。我们定义了一个权重矩阵,从图像中提取特定的特征。
我们将权重初始化为3x3矩阵。这个权值现在应该在图像上移动,使得所有的像素至少被覆盖一次,从而给出一个卷积输出。上面的值429是通过将通过权重矩阵和输入图像的高亮显示的3×3部分的元素相乘获得的值相加而获得的。


6x6图像现在转换为4x4图像。把权重矩阵想象成刷子刷墙。刷子先水平地刷墙壁,然后下移,水平地刷下一排。当权重矩阵沿图像移动时,像素值会被多次使用。这基本上实现了卷积神经网络中的参数共享。

让我们看看这在真实图像中是什么样子。
权重矩阵类似于从原始图像矩阵中提取特定信息的滤波器。某一个权重组合可能是提取边缘,而另一个权重组合可能是提取特定颜色,而另一个权重组合可能只是模糊不需要的噪声。

神经网络学习权重,使损失函数最小化,类似于MLP。因此,权值从原始图像中提取特征,帮助网络进行正确的预测。当我们有多个卷积层时,初始层提取更一般的特征,而随着网络的深入,由权值矩阵提取的特征越来越复杂,越来越针对当前的问题。

步幅和填充的概念
正如我们在上面看到的,滤波器或权重矩阵,在整个图像上移动,一次移动一个像素。我们可以将其定义为一个超参数,以确定权重矩阵在图像中的移动方式。如果权重矩阵一次移动1个像素,我们称之为1的步长。让我们看看步幅为2是什么样子。

如你所见,随着步幅值的增加,图像的大小不断减小。用零填充可以解决这个问题。我们还可以在图像周围添加多个零层,以防出现更高的步长值。

我们可以看到在用零填充图像后,图像的初始形状是如何保留的。这称为same padding,因为输出图像的大小与输入图像的大小相同。

这被称为same padding(这意味着我们只考虑输入图像的有效像素)。中间的4x4像素是一样的。在这里,我们保留了来自边界的更多信息,也保留了图像的大小。

多滤波器和激活图
要记住的一点是,权重的深度维度将与输入图像的深度维度相同。权重延伸到输入图像的整个深度。因此,与单个权重矩阵的卷积将产生具有深度为1的卷积输出。在大多数情况下,我们不使用单个滤波器(权重矩阵),而是将相同维度的多个滤波器应用在一起。

每个滤波器的输出叠加在一起,形成卷积图像的深度维。假设我们有一个大小为32x32x3的输入图像。我们使用10个大小为553的过滤器,并使用有效的填充。输出的尺寸为28x28x10。


3.2池化层
有时当图像太大时,我们需要减少参数的数目。然后我们在随后的卷积层之间周期性地引入池化层。池化的唯一目的是减少图像的空间大小。池化在每个深度维度上独立完成,因此图像的深度保持不变。最常用的池化形式是最大池化。

在这里,我们将步幅设为2,而池化大小也设为2。最大运算应用于卷积输出的每个深度维度。如你所见,在最大池化操作之后,4x4卷积输出变成了2x2。

让我们看看最大池化在真实图像上的效果。

如你所见,我已经采取了卷积图像,并对它应用了最大池化。最大池图像仍然保留着‘它是街道上的一辆车’的信息。如果你仔细看,图像尺寸已经减半。这在很大程度上有助于减少参数。

类似地,也可以应用其他形式的池化,如平均池化或L2标准池化。

输出维度
理解每个卷积层的输入和输出维度可能会有点混乱。我决定用这几行文字来让你学会确定输出维度。三个超参数将控制输出的大小:

1.滤波器数量:输出的深度将等于使用的滤波器数量。还记得我们是如何把每个过滤器的输出叠加起来形成一个激活图的吗?激活图的深度将等于滤波器的数量。

2.步幅:当我们设置步幅为1时,我们在一个像素上来回移动。使用更高的步长值,我们一次移动大量像素的位置,从而产生更小的输出量。

3.零填充:这有助于保持输入图像的大小。如果添加单个零填充,则单跨步滤波器移动将保留原始图像的大小。

我们可以用一个简单的公式来计算输出尺寸。输出图像的大小可以计算为([W-F+2P]/S)+1。这里,W是输入大小,F是滤波器的大小,P是应用的填充数,S是步幅。假设我们有一个大小为32x32x3的输入图像,我们应用10个大小为3x3x3的滤波器,具有单步幅,没有零填充。

这里W=32,F=3,P=0,S=1。输出深度将等于应用的滤波器数量,即10个。

输出的大小为([32-3+0]/1)+1=30。因此输出体积为30x30x10。

3.3输出层
经过多层卷积和填充之后,我们需要以类的形式输出。卷积层和池化层只能从原始图像中提取特征并减少参数数量。但是,要生成最终输出,我们需要应用一个全连接的层来生成与我们需要的类数相等的输出。仅用卷积层就很难达到。卷积层生成三维激活图,而我们只需要输出该图像是否属于某个特定的类。输出层具有分类交叉熵等损失函数,用于计算预测误差。一旦前向传递完成,反向传播开始更新权重和偏差,以减少误差和损失。

 
 

4.组合:整个神经网络是什么样的?
正如你现在看到的,CNN是由各种卷积层和池化层组成的。让我们看看卷积神经网络是什么样子。
我们将输入图像传递到第一个卷积层。卷积输出作为激活图。在卷积层应用的滤波器从输入图像中提取相关特征,以进一步传递。

每个滤波器应提供不同的特征,以帮助正确地预测类别。如果我们需要保留图像的大小,我们使用same padding,否则使用有效的填充,有助于减少特征的数量。

然后添加池化层以进一步减少参数的数量

输出预测结果之前,还有几个卷积层和池化层。卷积层有助于提取特征。随着网络的深入,提取的特征更具体,而浅层网络提取的特征更加一般化。

如前所述,CNN中的输出层是全连接的层,其中来自其他层的输入被展平并传递,以便将输出转换成网络所期望的类的数目。

然后通过输出层生成输出,并比较以计算误差。在全连接输出层定义了一个损耗函数来计算均方损耗。然后计算误差梯度。

再将误差反向传播,以更新滤波器(权重)和偏差值。

一次前向传播和反向传播完成一个训练周期。

 
 
5.在Keras中用CNN分类图像
让我们举一个例子,我们输入几张猫和狗的图片,然后用CNN把这些图片分类到它们各自的动物类别中。这是图像识别和分类的经典问题。机器需要做的是看到图像,并通过各种特征来了解它是猫还是狗。

这些特征可以是提取边缘,或提取猫的胡须等。卷积层将提取这些特征。让我们来看看数据集。

以下是数据集中一些图像的示例。
在这里插入图片描述


我们首先需要调整这些图像的大小,使它们尺寸相同。这是我们在处理图像时通常需要做的事情,因为在捕获图像时,不可能使所有图像都保持相同大小。

为了简单起见,我只使用了一个卷积层和一个池化层,这在我们尝试进行预测时通常不会发生。使用的数据集可以从这里下载http://files.fast.ai/data/dogscats.zip

#import various packages

import os
import numpy as np
import pandas as pd
import scipy
import sklearn
import keras
from keras.models import Sequential
import cv2
from skimage import io
%matplotlib inline

#Defining the File Path

cat=os.listdir("/mnt/hdd/datasets/dogs_cats/train/cat")
dog=os.listdir("/mnt/hdd/datasets/dogs_cats/train/dog")
filepath="/mnt/hdd/datasets/dogs_cats/train/cat/"
filepath2="/mnt/hdd/datasets/dogs_cats/train/dog/"

#Loading the Images

images=[]
label = []
for i in cat:
    image = scipy.misc.imread(filepath+i)
    images.append(image)
    label.append(0) #for cat images

for i in dog:
    image = scipy.misc.imread(filepath2+i)
    images.append(image)
    label.append(1) #for dog images

#resizing all the images

for i in range(0,23000):
    images[i]=cv2.resize(images[i],(300,300))

#converting images to arrays

images=np.array(images)
label=np.array(label)

# Defining the hyperparameters

filters=10
filtersize=(5,5)

epochs =5
batchsize=128

input_shape=(300,300,3)

#Converting the target variable to the required size

from keras.utils.np_utils import to_categorical
label = to_categorical(label)

#Defining the model

model = Sequential()

model.add(keras.layers.InputLayer(input_shape=input_shape))

model.add(keras.layers.convolutional.Conv2D(filters, filtersize, strides=(1, 1), padding='valid', data_format="channels_last", activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Flatten())

model.add(keras.layers.Dense(units=2, input_dim=50,activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(images, label, epochs=epochs, batch_size=batchsize,validation_split=0.3)

model.summary()

在这个模型中,我只使用了一个卷积层和一个池化层,可训练的参数是219801。想一下如果我在这种情况下使用MLP会有多少参数。你可以通过添加更多的卷积层和池化层来进一步减少参数的数量。我们添加的卷积层越多,提取的特征就越具体和复杂。

项目
现在,是时候大胆尝试并实际使用其他一些真实的数据集了。你准备好接受挑战了吗?通过以下实际项目,加速你的深度学习之旅:
https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-apparels/?utm_source=architecture-of-convolutional-neural-networks-simplified-demystified&utm_medium=blog
https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-digits/?utm_source=architecture-of-convolutional-neural-networks-simplified-demystified&utm_medium=blog

 
 

总结
我希望通过这篇文章,能够给你提供一个有关卷积神经网络的直观理解。我没有涉及CNN的复杂数学推导。如果你喜欢了解这样的东西-请继续关注,还有更多的东西等着你。试着建立你自己的CNN网络,了解它是如何运作的,并对图像进行预测。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值