每一个过滤器的输出被堆叠在一路,形成就积图像的纵深维度。假设我们有一个 32*32*3 的输入。我们应用 5*5*3,带有 valid padding 的 10 个过滤器。输出的维度将会是 28*28*10。
如下图所示:

我们可以应用一个简单的公式来计算输出尺寸。输出图像的空间尺寸可以计算为([W-F + 2P] / S)+1。在这里,W 是输入尺寸,F 是过滤器的尺寸,P 是填充数量,S 是步幅数字。假如我们有一张 32*32*3 的输入图像,我们应用 10 个尺寸为 3*3*3 的过滤器,单步幅和零填充。
激活图是卷积层的输出。
池化层
有时图像太大年夜,我们须要削减练习参数的数量,它被请求在随后的卷积层之间周期性地引进池化层。池化的独一目标是削减图像的空间大年夜小。池化在每一个纵深维度上独自完成,是以图像的纵深保持不变。池化层的最常见情势是最大年夜池化。

让我们看看最大年夜池化在真实图片中的效不雅若何。

正如你看到的,我们卷积了图像,并最大年夜池化了它。最大年夜池化图像仍然保存了汽车袈溱街上的信息。如不雅你细心不雅察的话,你会发明图像的尺寸已经减半。这可以很大年夜程度上削减参数。
同样,其他情势的池化也可以在体系中应用,如平均池化和 L2 规范池化。
输出维度
懂得每个卷积层输入和输出的尺寸可能会有点难度。以下三点或许可以让你懂得输出尺寸的问题。有三个超参数可以控制输出卷的大年夜小。
1. 过滤器数量-输出卷的深度与过滤器的数量成正比。请记住该若何堆叠每个过滤器的输出以形成激活映射。激活图的深度等于过滤器的数量。
2. 步幅(Stride)-如不雅步幅是 1,那么我们处理图片的精细度就进入单像素级别了。更高的步幅意味着同时处理更多的像素,大年夜而产生较小的输出量。
3. 零填充(zero padding)-这有助于我们保存输入图像的尺寸。如不雅添加了单零填充,则单步幅过滤器的活动会保持在原图尺寸。
那么 W=32,F=3,P=0,S=1。输出深度等于应用的滤波器的数量,即 10,输出尺寸大年夜小为 ([32-3+0]/1)+1 = 30。是以输出尺寸是 30*30*10。
输出层
在独裁卷积和填充后,我们须要以类的情势输出。卷积和池化层只会提取特点,并削减原始图像带来的参数。然而,为了生成最终的输出,我们须要应用全连接层来生成一个等于我们须要的类的数量的输出。仅仅依附卷积层是难以达到这个请求的。卷积层可以生成 3D 激活图,而我们只须要图像是否属于一个特定的类如许的内容。输出层具有类似分类交叉熵的损掉函数,用于计算猜测误差。一旦前向传播完成,反向传播就会开端更新权重与误差,以削减误差和损掉。
4. 小结
正如你所看到的,CNN 由不合的卷积层和池化层构成。让我们看看全部收集是什么样子:
在这里,我们把步幅定为 2,池化尺寸也为 2。最大年夜化履行也应用在每个卷机输出的深度尺寸中。正如你所看到的,最大年夜池化操作后,4*4 卷积的输出变成了 2*2。

- 我们将输入图像传递到第一个卷积层中,卷积后以激活图情势输出。图片在卷积层中过滤后的特点会被输出,并传递下去。
- 每个过滤器都邑给出不合的特点,以赞助进行精确的类猜测。因为我们须要包管图像大年夜小的一致,所以我们应用同样的填充(零填充),不然填充会被应用,因为它可以赞助削减特点的数量。
- 随后参加池化层进一步削减参数的数量。
- 在猜测最终提出前,数据会经由多个卷积和池化层的处理。卷积层会赞助提取特点,越深的卷积神经收集会提取越具体的特点,越浅的收集提取越浅近的特点。
- 如前所述,CNN 中的输出层是全连接层,个中来自其他层的输入在这里被平豢?注送,以便将输出转换为收集所需的参数。
- 随后输出层会产生输出,这些信息会互比拟较清除缺点。损掉函数是全连接输出层计算的均方根损掉。随后我们管帐算梯度缺点。
- 缺点会进行反向传播,以赓续改进过滤器(权重)和误差值。
- 一个练习周期由单次正向和反向传递完成。
5. 在 KERAS 中应用 CNN 对图像进行分类
以下这些图片均来自数据集。

我们起首须要调剂这些图像的大年夜小,让它们外形雷同。这是处理图像之前平日须要做的,因为在拍┞氛时,让照下的图像都大年夜小雷同几乎弗成能。
为了简化懂得,我们在这里只用一个卷积层和一个池化层。留意:在 CNN 的应用阶段,这种简单的情况是不会产生的。
#import various packagesimport osimport numpy as npimport pandas as pdimport scipyimport sklearnimport kerasfrom keras.models import Sequentialimport cv2from skimage import io%matplotlib inline#Defining the File Pathcat=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 Imagesimages=[]label = []for i in cat:image = scipy.misc.imread(filepath+i)images.append(image)label.append(0) #for cat imagesfor i in dog:image = scipy.misc.imread(filepath2+i)images.append(image)label.append(1) #for dog images#resizing all the imagesfor i in range(0,23000):images[i]=cv2.resize(images[i],(300,300))#converting images to arraysimages=np.array(images)label=np.array(label)# Defining the hyperparametersfilters=10filtersize=(5,5)epochs =5batchsize=128input_shape=(300,300,3)#Converting the target variable to the required sizefrom keras.utils.np_utils import to_categoricallabel = to_categorical(label)#Defining the modelmodel = 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()
推荐阅读
一切大年夜应用办事监控说起小明地点的一家小型互联网创虻公司一向将应用运行在阿里云上。该应用采取通用的分布式 Nginx+App 架构为用户供给电商数据统计的 webservice 办事。应用运行至>>>详细阅读
本文标题:长文解密卷积神经网络体系结构
地址:http://www.17bianji.com/lsqh/36094.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示