机器学习基础:第3部分-卷积和池化

亚历克斯 亚历克斯2020年5月26日遵循
机器学习基础:第3部分-卷积和池化

在前面的第2部分-计算机视觉的第一步,你建立了一个可以识别衣服的神经网络。

现在你已经看到了计算机视觉的时尚例子,你可能已经注意到计算机视觉在这些例子中的一个很大的限制。那就是你只能在图片中有一项,然后它必须居中,它必须是明确的。例如,鞋子必须朝左。一种称为卷积神经网络的神经网络类型可以在这里提供帮助。我们得花点时间来准备。在这一部分中,我们将讨论卷积是什么,以及它们如何与池化结合使用,以帮助计算机理解图像的内容。

把这一切都整合起来还需要一段时间。但是在你开始使用卷积之前让我们先理解卷积是什么。卷积背后的思想与带滤波器的图像处理非常相似。如果你以前用过Photoshop之类的东西,它有滤镜来做一些事情,比如锐化图像或添加动态模糊。所以,虽然效果很复杂,但背后的过程却相当简单。让我们来看看它的实际情况。

机器学习基础:第3部分-卷积和池化在左边,我有一个来自时尚MNIST数据集的靴子图像。在右边,我有图像中9个像素的表示。我把中心1称为我的当前像素,其他的都是它的邻居。我定义了一个过滤器,它是一组与我的像素及其邻居形状相同的值。例如,如果我在一个3x3像素网格的每个方向上都有一个邻居,那么我的过滤器中也会有一个3x3像素网格。过滤器中的每个值都可以称为权重。因此,为了计算我的像素的新值,我所要做的就是将每个相邻像素乘以它们的权重,我的当前像素乘以它的权重,然后将它们全部相加。我要对图像中的每一个像素做这个处理。结果将是一个转换后的图像。

举个例子,如果你看左边的图片机器学习基础:第3部分-卷积和池化如果我在中间使用滤镜,我就会得到右边的图片。这个滤镜导致了对垂直线的巨大强调。它们现在真的很流行。同样,这个滤镜也会强调水平线。机器学习基础:第3部分-卷积和池化你可能在想,这和计算机视觉有什么关系?最终,试图理解一件商品是什么,不只是像我们在时尚例子中所做的那样,将原始像素与标签相匹配。但是如果我们可以从图像中提取特征,然后当一个图像有这组特征时,它就是这个类,或者如果它有那组特征它就是那个类?这就是卷积神经网络的核心。他们将图像处理成原始特征,然后找到与标签匹配的特征集。他们使用过滤器来做到这一点。就像神经元学会了权重和偏差来加到我们需要的东西一样,卷积将通过初始随机化学习适当的过滤器,然后使用损失函数和优化器来调整它们以获得更好的结果。

举个例子,看看这些图片。机器学习基础:第3部分-卷积和池化你可以看到它们是如何被过滤器改变的。这些过滤器学会了如何隔离和抽象其中的特征。例如,你可以看到,像我们的水平线检测器这样的东西能够检测出这些图像中的共性。而且都是鞋子。这条线就是鞋底。

但如果你用相同的滤镜来考虑这些图像,它们会得到不同的结果。机器学习基础:第3部分-卷积和池化如果很多像素被水平线滤镜照亮,我们可以把它描述为唯一的检测器。

你可能经常听到这个短语——“探测器”。但它最终指的是一个过滤器,可以提取一个可以用来确定一个类的特征。我第一次听到这个词是在猫和狗的分类器中,我们稍后会看到,当时有人可视化了一个耷拉着的耳朵探测器,它能确定某物是狗而不是猫。

在前面的图片中,你可能已经注意到的另一件事是图像的分辨率也在下降。这是通过所谓的池化来实现的。这里的想法很简单。如果有一种方法可以提取特征,同时去除无关信息,我们实际上可以学得更快。

现在,让我们看看它是如何工作的。这个概念其实很简单。想象这是像素的一块。机器学习基础:第3部分-卷积和池化为了简单起见,我将它们设置为单色。然后我们以2x2为单位看它们,然后我们只保留最大的值机器学习基础:第3部分-卷积和池化在这个例子中是192。然后我们对下一个2x2重复这个过程,保留最大的,也就是144;下一个是255;下一个是168。机器学习基础:第3部分-卷积和池化然后,我们将这四个结果放在一起,生成一个新的2x2块。这包含了之前4x4块的2x2分量中最大的值。

我们现在已经把文件缩小了75%,也许——只是也许——我们保留了重要的信息。我们来看看这到底是什么样子。这是我们之前过滤过的图像,用来检测垂直线。机器学习基础:第3部分-卷积和池化左边是池化之前的样子。右边是我们刚才演示过的池化后的情况。

请注意,信息不仅仅是被维护的。你可以说这也被强调了。池化也是减少模型必须处理的信息量的一种重要方式。如果你仔细想想,假设你想学习100个过滤器。这意味着你将不得不跟踪101个版本的图像——原始图像加上应用滤镜后的效果。如果你有成千上万的图像,你很快就会开始消耗内存。这只是一层。如果在这下面有另一层也学会了100个过滤器呢?这意味着你的前100个图像中的每一个也将有100个产品,为你需要训练的每一个图像提供10,000个图像。任何能够在保留这些信息的同时减小尺寸的技术显然都是非常有价值的。

现在我们已经了解了卷积是什么,它是如何工作的,以及它如何与池化齐头并进,让我们花点时间来看看如何为它们编码。

那么让我们来看看一些实际的卷积。我想谈谈,举个例子,如果你要给一只鞋分类而不是你在时尚MNIST上看到的那只。其中一种方法就是卷积。在这一部分,你只需要做一个快速的实验,看看卷积滤波器是如何工作的。

因此,我们将从导入一些必需的Python库开始。

Import cv2 Import numpy as np from scipy Import misc I = misc.ascent()

这些库中内置的一个东西是这个图像叫做提升.所以我们可以用pyplot来画它,这样我们就能看到它的样子。

进口matplotlib。pyplotas plt plt.grid(False) plt.gray() plt.axis('off') plt.imshow(i) plt.show()

这是一个人走上楼梯。机器学习基础:第3部分-卷积和池化我现在把它复制到a中numpy数组,这样你就可以操作它。

I_transformed = np.copy(i) size_x = I_transformed .copy(i)形状[0]size_y = i_transform . Shape [1]

这里我定义了一些不同的过滤器。

这个过滤器可以很好地检测边缘。它创建了一个卷积,只通过锐利的边缘和直线。尝试不同的数值以获得有趣的效果。#filter =[[0, 1,0],[1, - 4,1],[0, 1,0]] #更多的过滤器来尝试乐趣!过滤器=[(1、2、1)(0,0,0),[1、2、1]]#过滤器=[[1,0,1],[2 0 2],[1,0,1]]#如果所有的数字滤波器不添加0或1,你#应该做一个重量,才能这样做#所以,例如,如果你的重量是1,1,1,2,1 - 1,1,1 #他们加起来10,所以你会设置一个重量的1。如果你想正常体重= 1

还记得我们展示的3x3滤波器吗?我只是将它们实现为三个数组,每个数组有三个元素。

我做的另一件事是给它加了一个权值这样所有的数字加起来应该是1。但如果它们加起来大于这个数,那么你可以把它们乘上一个因子来归一化。例如,如果它们加起来是10,您可以将权重设置为0.1,这样最终结果就会归一化回1。

对于range(1,size_y-1)中的x:卷积= 0.0卷积=卷积+ (i[x-1, y-1] * filter[0][0])卷积=卷积+ (i[x, y-1] * filter[0][1])卷积=卷积+ (i[x, 1, y-1] * filter[1][2])卷积=卷积+ (i[x-1, y] * filter[1][0])卷积=卷积+ (i[x, y] * filter[1][1])卷积=卷积+ (i[x, y] * filter[1][2])卷积=卷积+ (i[x-1, y+1] * filter[2][0])卷积=卷积+ (i[x, 1, y] * filter[1][0])卷积=卷积+ (i[x, 1, y] * filter[2][0])卷积=卷积+ (i[x, 1, y] * filter[2][0])(i[x+1, Y +1] * filter[2][1]) convolution= convolution + (i[x+1, Y +1] * filter[2][2]) convolution= convolution * weight if(卷积255):convolution=255 i_transformed[x, Y] = convolution

现在这只是一个简单的循环遍历图像并将相关像素及其相邻像素乘以过滤器中的相关项。一旦它完成了,我们可以绘制它来看看结果。

#绘制图像。注意轴的大小——它们是512 * 512 plt.gray() plt.grid(False) plt.imshow(i_transformed) #plt.axis('off') plt.show()

机器学习基础:第3部分-卷积和池化你可以看到滤镜强调了图像的垂直线。

例如,如果您更改为不同的过滤器,如这个

Filter = [[-1, 0,1], [-2, 0,2], [-1, 0,1]]]

机器学习基础:第3部分-卷积和池化

我们会看到强调水平线的那个。

因此,您可以考虑遵循过滤器值,并查看它们对图像的影响,或者您可以自己试验。

举个例子,这是一个简单池的实现。

new_x = int(size_y/2) new_y = int(size_y/2)0 ((new_x, new_y)) for x in range(0, size_x, 2): for y in range(0, size_y, 2): pixels = [] pixels。追加(i_transformed[x, y])像素。追加(i_transformed[x+1, y])像素。追加(i_transformed[x, y+1])像素。append(i_transformed[x+1, y+1]) pixels.sort(reverse=True) newImage[int(x/2),int(y/2)] = pixels[0] #绘制图像。注意轴的大小——现在是256像素而不是512像素plt.gray() plt.grid(False) plt.imshow(newImage) #plt.axis('off') plt.show()

机器学习基础:第3部分-卷积和池化如果你看这个轴,这个轴现在是256x256。如果我们看一下原始图像,它是512x512。这是经过滤波后的原始图像。

因此,您已经了解了过滤器如何卷积图像,提供了卷积层的基础,以及池化如何在保持图像特征的同时减小图像大小。

在下一部分中,您将开始在代码中实现卷积和池化,并将看到它们如何改进流行MNIST分类器。在那之后,你将采取一些更现实的和更具挑战性的图像。你可以学习卷积如何帮助你对它们进行分类。

接下来:第四部分-卷积神经网络编码

如果您在文本中发现了错误,请通过选择错误并按Ctrl-Enter向作者发送消息。

评论(0)

    暂无评论

你必须登录才能发表评论。

登录/报名

页面生成于0.014610052108765
Baidu
map