当前位置: 首页 > 科技观察

LongTextDecryptionConvolutionalNeuralNetworkArchitecture_0

时间:2023-03-13 06:29:01 科技观察

介绍老实说,有一段时间我无法真正理解深度学习。看了相关的研究论文和文章,感觉深度学习极其复杂。我试图了解神经网络及其变体,但我仍在努力。然后有一天,我决定一步一个脚印,从基础开始。我分解技术操作的步骤并手动执行这些步骤(和计算),直到我理解它们是如何工作的。这既费时又伤脑筋,但结果却是惊人的。现在,我不仅对深度学习有了全面的了解,而且基于它也有了很好的想法,因为我的基础很扎实。随意应用神经网络是一回事,了解它是什么以及它如何发生则完全是另一回事。今天,我将与您分享我的经验,展示我是如何开始使用卷积神经网络并最终弄明白的。我将进行一般性介绍,以便您深入了解CNN的工作原理。在这篇文章中,我将讨论CNN背后的架构,它最初是为解决图像识别和分类问题而设计的。同时,我也会假设你对神经网络有基本的了解。目录1.机器如何查看图片?2.如何帮助神经网络识别图像?3.定义卷积神经网络卷积层池化层输出层4.总结5.使用CNN对图像进行分类1.机器是如何看图片的?人脑是一台非常强大的机器,每秒可以看到(捕捉)多张图片,并在不知不觉中完成对这些图片的处理。但机器不是这样。机器处理图像的第一步是理解,理解如何表达图像,然后读取图像。简单来说,每个图像都是按特定顺序排列的一系列点(像素)。如果更改像素的顺序或颜色,图像会相应更改。例如,存储和读取上面写有数字4的图像。基本上,机器将图像分解成像素矩阵,为每个lox存储颜色代码。在下面的表示中,值1是白色,256是最深的绿色(为简单起见,我们的示例仅限于一种颜色)。以这种格式存储图像信息后,下一步就是使神经网络可以理解排序和模式。2.如何帮助神经网络识别图像?表示像素的数值按照特定的方式排序。假设我们尝试使用全连接网络来识别图像,我们该怎么做呢?全连接网络可以通过展平将图像视为一个数组,并使用像素值作为特征来预测图像中的值。需要明确的是,网络很难理解下图中发生的事情。即使是人类也很难理解上图所表达的意思是数字4,我们完全失去了像素的空间排列。我们可以做什么?可以尝试从原始图像中提取特征,从而保留空间排列。Case1这里我们使用一个权重来乘以初始像素值。现在用肉眼更容易认出这是“4”了。但是在将其交给全连接网络之前,需要对其进行展平,这样我们才能保留图像的空间排列。案例2现在我们可以看到将图像展平完全破坏了它的对齐方式。我们需要想办法将图像馈送到网络而不展平,同时还要保留空间排列,也就是说,我们需要馈送像素值的2D/3D排列。我们可以尝试一次取图像的两个像素值,而不是一个。这可以让网络深入了解相邻像素的特征。由于一次使用两个像素,因此需要一次使用两个权重值。希望您能注意到图像有3列而不是4列值。由于我们现在一次移动两个像素(移动之间共享像素),因此图像变小了。虽然图像变小了,但我们还是可以大致理解这是“4”。此外,重要的是要意识到我们正在采用两个连续的水平像素,因此只考虑水平对齐。这是我们从图像中提取特征的一种方式。我们可以看到左边和中间的部分,但是右边的部分看起来不太清楚。主要是因为两个问题:1.图片的左右角是权重相乘一次得到的。2.左边仍然保留,因为权重值高;由于重量稍轻,右侧有些丢失。现在我们有两个问题,需要两个解决方案。案例3遇到的问题是图片的左右角只按权重传递一次。我们需要做的是让网络像任何其他像素一样考虑角点。对于这个问题,我们有一个简单的解决方案:在重量运动的两边都置零。你可以看到通过添加零,来自角落的信息被重新训练。图像也变大。这可以用于我们不想缩小图像的情况。Case4我们这里要解决的问题是右上角的权重值越小,像素值越低,越难识别。我们所能做的就是取多个权重值并将它们组合起来。(1,0.3)的权重值给我们一个输出表,而(0.1,5)的权重值也会给我们一个输出表。两个图像的组合版本将为我们提供更清晰的画面。所以我们所做的只是简单地使用多个权重而不是一个,从而重新训练有关图像的更多信息。最终结果将是上面两张图片的组合版本。案例5到目前为止,我们已经尝试通过使用权重来组合水平像素。但大多数时候我们需要同时保持水平和垂直两个方向的空间布局。我们采用水平和垂直组合像素的二维矩阵权重。另外,请记住,随着重量在水平和垂直方向上移动,输出将在水平和垂直方向上降低一个像素。特别感谢JeremyHoward启发我创作这些图像。那么我们该怎么办?上面我们所做的是尝试利用图像的空间排列来提取图像的特征。为了理解图像,网络理解像素的排列方式非常重要。我们上面所做的正是卷积网络所做的。我们可以获取输入图像,定义一个权重矩阵,然后对输入进行卷积以从图像中提取特殊特征,而不会丢失其空间排列信息。这种方法的另一个好处是它减少了图像的参数数量。如您所见,卷积图像的像素比原始图像少。3.定义一个卷积神经网络我们需要三个基本元素来定义一个基本的卷积网络1.卷积层2.池化层(可选)3.输出层卷积层在这一层中,实际发生的事情和我们在案例中看到的是一样的5以上。假设我们有一个6*6的图像。我们定义了一个权重矩阵来从图像中提取某些特征。我们将权重初始化为3*3矩阵。权重现在应该与图像组合,所有像素至少被覆盖一次,以产生卷积输出。上面的429是逐元素计算权重矩阵和输入图像的3*3高亮部分的乘积的值得到的。现在6*6的图像被转换成4*4的图像。将权重矩阵想象成用于粉刷墙壁的刷子。用这把刷子先在水平方向上画墙,然后向下移动它水平地画下一行。当权重矩阵沿图像移动时再次使用像素值。实际上,这允许跨卷积神经网络共享参数。下面我们以一张真实的图片为例。权重矩阵在图像中的行为类似于从原始图像矩阵中提取特定信息的过滤器。一种权重组合可用于提取边缘信息,另一种可用于提取特定颜色,下一种可能用于模糊不需要的噪声。首先学习权重,然后可以最小化损失函数,类似于多层感知器(MLP)。因此,需要通过学习参数从原始图像中提取信息,帮助网络做出正确的预测。当我们有多个卷积层时,初始层倾向于提取更一般的特征。随着网络结构越来越深,权重矩阵提取的特征越来越复杂,更适用于眼前的问题。步幅和填充的概念就像我们在上面看到的,过滤器或权重矩阵一次在整个图像上移动一个像素。我们可以将其定义为一个超参数来表达我们希望权重矩阵如何在图像中移动。如果权重矩阵每次平移一个像素,我们称之为步幅为1。我们看一下步长为2时的情况。可以看到随着我们增加步长值,图像的尺寸不断变小。在输入图像周围填充零边界可以解决这个问题。我们还可以在高步幅值的图像周围添加多于一层的零边界。我们可以看到在用0边框层填充图像后如何保留图像的原始形状。由于输出图像与输入图像大小相同,因此称为samepadding。这是samepadding(意味着我们只考虑输入图像的有效像素)。中间4*4像素相同。在这里,我们使用边框保留了更多信息,并且还保留了图像的原始大小。多重过滤和激活图需要记住权重的深度维度与输入图像的深度维度相同。权重扩展到输入图像的整个深度。因此,与单个权重矩阵的卷积产生具有单个深度维度的卷积输出。在大多数情况下,不是使用单个过滤器(权重矩阵),而是应用相同维度的多个过滤器。每个滤波器的输出叠加在一起形成卷积图像的深度维度。假设我们有一个32*32*3的输入。我们使用5*5*3、10个具有有效填充的过滤器。输出维度将为28*28*10。如下图所示:激活图是卷积层的输出。Poolinglayers有时图像太大,我们需要减少训练参数的数量,这就需要在后续的卷积层之间周期性地引入pooling层。池化的唯一目的是减少图像的空间大小。池化是针对每个深度维度独立完成的,因此图像的深度保持不变。最常见的池化层形式是最大池化。在这里,我们将步幅设置为2,池化大小设置为2。最大化也应用于每个滚动机器输出的深度维度。可以看到,经过maxpooling操作后,4*4卷积的输出变成了2*2。让我们看看最大池化如何处理真实图像。如您所见,我们对图像进行了卷积并对其进行了最大池化。最大池图像仍然保留了汽车在街上的信息。如果你仔细观察,你会发现图像的大小已经减半了。这可以在很大程度上减少参数。同样,系统中也可以应用其他形式的池化,例如平均池化和L2范数池化。输出维度了解每个卷积层的输入和输出维度可能有点棘手。以下三点或许能让你明白输出大小的问题。控制输出量大小的三个超参数。1.滤波器数量——输出体积的深度与滤波器数量成正比。记住如何堆叠每个过滤器的输出以形成激活图。激活图的深度等于过滤器的数量。2.Stride——如果stride为1,那么我们图像处理的精细度就会进入单像素级别。更高的步幅意味着同时处理更多的像素,从而导致更小的输出量。3.零填充——这有助于我们保留输入图像的尺寸。如果添加单个零填充,则单个步幅滤波器的移动将保持在原始图像大小。我们可以应用一个简单的公式来计算输出大小。输出图像的空间维度可以计算为([W-F+2P]/S)+1。这里,W是输入大小,F是滤波器大小,P是填充量,S是步幅数。假设我们有一个32*32*3的输入图像,我们使用10个大小为3*3*3的过滤器,单步幅和零填充。那么W=32,F=3,P=0,S=1。输出深度等于应用的过滤器数量,即10,输出大小为([32-3+0]/1)+1=30。所以输出尺寸为30*30*10。输出层经过多层卷积和填充后,我们需要以类的形式输出。卷积层和池化层只是提取特征,减少原图带来的参数。但是,要生成最终输出,我们需要应用全连接层来生成等于我们需要的类数的输出。仅靠卷积层很难达到这个要求。卷积层可以生成3D激活图,我们只需要图像是否属于特定类之类的信息。输出层具有用于计算预测误差的分类交叉熵损失函数。前向传播完成后,反向传播开始更新权重和偏差以减少错误和损失。4.总结如您所见,CNN由不同的卷积层和池化层组成。让我们看看整个网络是什么样的:我们将输入图像传递到第一个卷积层,该层被卷积并输出为激活图。将卷积层中图像过滤后的特征输出并传递下去。每个过滤器都会提供不同的功能,以帮助进行正确的类别预测。由于我们需要保持图像大小一致,因此我们使用相同的填充(零填充),否则使用填充,因为它可以帮助减少特征的数量。添加后续池化层以进一步减少参数数量。在最终做出预测之前,数据通过多个卷积层和池化层进行处理。卷积层将有助于提取特征。越深的卷积神经网络会提取越具体的特征,越浅的网络会提取越浅的特征。如前所述,CNN中的输出层是一个全连接层,其中来自其他层的输入被展平并发送,以便将输出转换为网络所需的参数。输出层然后产生一个输出,并将这些信息相互比较以排除错误。损失函数是由全连接输出层计算的均方根损失。然后我们计算梯度误差。错误被反向传播以不断改进过滤器(权重)和偏差值。一个训练周期由一次向前和向后传递完成。5、在KERAS中使用CNN对图像进行分类我们来试试看,输入猫狗的图片让电脑识别。这是图像识别和分类的经典问题,机器需要做的是看到图像并了解猫和狗的不同身体特征。这些特征可以是轮廓,也可以是猫须等,卷积层会抓取这些特征。让我们对数据集进行测试。下面的图片都来自数据集。我们首先需要调整这些图像的大小,使它们具有相同的形状。这通常在处理图像之前完成,因为在拍摄照片时几乎不可能让它们都具有相同的尺寸。为了简化理解,我们这里只使用一个卷积层和一个池化层。注意:这种简单的情况不会发生在CNN的应用阶段。#导入各种包importosimportnumpyasnpimportpandasaspdimportscipyimportsklearnimportkerasfromkeras.modelsimportSequentialimportcv2fromskimageimportio%matplotlibinline#DefiningtheFilePathcat=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/"#加载图像images=[]label=[]foriincat:image=scipy.misc.imread(filepath+i)images.append(image)label.append(0)#forcatimagesfor我在狗中:image=scipy.misc.imread(filepath2+i)images.append(image)label.append(1)#fordogimages#resizingalltheimagesforiinrange(0,23000):images[i]=cv2.resize(images[i],(300,300))#convertingimagestoarraysimages=np.array(images)label=np.array(label)#定义超参数filters=10filtersize=(5,5)epochs=5batchsize=128input_shape=(300,300,3)#Convertingthetargetvariabletorequiredsizefromkeras.utils.np_utilsimportto_categoricallabel=to_categorical(label)#定义模型model=Sequential()model.add(keras.layers.InputLayer(input_shape=input_shape))model.添加(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()在这个模型中,我只用了一个卷积层和池化层,可训练参数为219,801。好奇如果我在这种情况下使用MLP,会有多少参数。通过添加更多的卷积层和池化层,可以进一步减少参数的数量。我们添加的卷积层越多,提取的特征就越具体和复杂。在这个模型中,我只使用了一个卷积层和一个池化层,可训练参数的数量是219,801。如果你想知道在这种情况下使用MLP可以得到多少,可以通过添加更多的卷积层和池化层来减少参数的数量。更多的卷积层意味着提取的特征更具体和复杂。结束语希望这篇文章能让你了解卷积神经网络。本文不深入CNN的复杂数学。如果你想提高你的理解,你可以尝试构建你自己的卷积神经网络来了解它是如何工作和预测的。本文转自机器之心,原文来自Analyticsvidhya,作者DISHASHREEGUPTA。