29. 深度学习进阶 - 卷积的原理

频道:生活应用 日期: 浏览:84

卷积应用_用卷积解释一种生活现象_卷积在生活应用

Alt文字

嗨,你好。我是茶桁架。

完成学习RNN后,让我们从今天开始介绍CNN。

CNN是现代机器深度学习的非常核心内容,例如,我们进行图像分类,图像分割,图像分割等。

卷积应用_用卷积解释一种生活现象_卷积在生活应用

Alt文字

实际上,这些过程是您允许计算机自动识别的内容,不仅可以识别图像中的内容,还可以识别图像中这些东西的位置。该复杂操作实际上是基于CNN的变体。必须赋予计算机识别图像的能力。

例如,一辆大型无人驾驶汽车需要确定行人在哪里。

卷积应用_用卷积解释一种生活现象_卷积在生活应用

Alt文字

例如,安全摄像机必须能够检测到我们的位置。

卷积在生活应用_用卷积解释一种生活现象_卷积应用

Alt文字

这些事情背后是计算机视觉问题。

在大约195或60年的时间里,哈佛大学进行了一项研究,在猫的大脑上安装了一些电极,让猫看前一张幻灯片,然后切换幻灯片的内容,然后观察猫的大脑在哪里积极的。

卷积在生活应用_用卷积解释一种生活现象_卷积应用

Alt文字

我发现了两个特征。第一个具有一层。例如,如果我改变了颜色,它将仅在这些层中活跃,并且它将在远离眼睛的地方活动。如果线被更改并且颜色不变,则另一层面积将处于活动状态。对于不同的特定更改,不同的层实际上是不同的。

第二个发现是,您越接近眼睛,越明显的级别的变化越低,例如线的颜色。眼睛的距离越远,线条和颜色没有改变,但是眼睛变大或更小,那么这些地方就会更加明显。

换句话说,第一个是分层的,第二个是在不同层的抽象中不同的,并且对什么具有不同的敏感性。

沿着这种思路,人们当时提出了一些方法。当时,人们正在做计算机视觉,但主流不是机器学习。但是人们想出这样的过滤器:

filter = np.array([
[1, 0, -1],
[1, 0, -1],
[1, 0, -1]
])

此类过滤器是故意和主观提出的。他们将此过滤器应用于图像一一。

卷积在生活应用_用卷积解释一种生活现象_卷积应用

Alt文字

例如,我们的图像是abcdefghijkl,然后将其乘以4*4的矩阵,然后将其添加,例如,这给出了新内容。每个人都称此操作卷积操作。

请参阅一个示例:

import numpy as np
image = np.array([
[10, 10, 10, -3, -3, -3],
[10, 10, 10, -3, -3, -3],
[10, 10, 10, -3, -3, -3],
[10, 10, 10, -3, -3, -3],
[10, 10, 10, -3, -3, -3],
[10, 10, 10, -3, -3, -3],
])
plt.imshow(image)
plt.show()

卷积应用_用卷积解释一种生活现象_卷积在生活应用

Alt文字

我们可以看到,该矩阵的前三列都是10列,最后两列都是0,而生成的最后一个图像具有清晰的边界,并带有两种不同的颜色。

现在,我们在此图像矩阵中添加过滤器,并遵循上述方法:

卷积在生活应用_用卷积解释一种生活现象_卷积应用

Alt文字

左上角3*3的小矩阵的计算结果为0。

同样开元ky888棋牌官网版,如果我们以后进行计算,第二个结果是39,第三个结果是39 ...您可以以后自行进行计算,最终的计算结果是:

[[0, 39, 39, 0],
[0, 39, 39, 0],
[0, 39, 39, 0]]

我们可以看到,当分段的小矩阵中的数据相同时,值为0。如果矩阵的图像部分之间的差异不是很大,则它也接近0,这意味着差异很小。如果小矩阵的左侧和右侧相反,则两侧之间的差异是最大的,无论最终添加值是正值还是负值,它应该是绝对值下的最大值。这个地方实际上是图像的垂直边缘。

然后,如果我们更改过滤器,请将其更改为以下内容:

[[1, 1, 1],
[0, 0, 0],
[-1, -1, -1]]

如果是这样,计算结果是图像水平方向的边缘的绝对值是最大的。

基于此原理,我们可以找到图像的所有垂直和水平边缘并将其取出。

整个过程称为卷积:卷积。卷积是在两件事一起工作的时候。它首先出现在信号处理中,两个信号将它们合并。

卷积操作的目的是什么?卷积操作用于提取图片的某些功能并捕获图片特征。上个世纪后期,计算机视觉的老科学家提出了大量内核,当时被称为操作员,现在称为卷积内核。

卷积的操作是给出图片,然后给出一个卷积内核,将每个值乘以与卷积内核相同的窗口,然后添加。

如果我们在现实生活中有一张图片,那么图片通常是三维的,通常是红色,绿色和蓝色(RGB),然后我们让这张图片和该过滤器乘以。

这三层中的每一层都会用过滤器繁殖。假设这三层是:

[[a11, a12, a13],[a21, a22, a23],[a31, a32, a33]],
[[b11, b12, b13],[b21, b22, b23],[b31, b32, b33]]
[[c11, c12, c13],[c21, c22, c23],[c31, c32, c33]]

然后假设过滤器是:

[[f11, f12, f13], [f21, f22, f23], [f31, f32, f33]]

卷积应用_卷积在生活应用_用卷积解释一种生活现象

Alt文字

然后,该过滤器将分别对这三层执行卷积操作,并且生成的卷积结果为V1,V2开yunapp体育官网入口下载手机版,V3,然后将这三个结果添加在一起,并将生成新的层。

让我们看一下以下图片:

卷积应用_卷积在生活应用_用卷积解释一种生活现象

Alt文字

该图显示了一层的情况,将滤波器大小的矩阵卷入一个点,并且该操作不仅适用于一个层,而且适用于整个纵向体积中的所有层。这

用卷积解释一种生活现象_卷积在生活应用_卷积应用

Alt文字

在底部是我们图片的RGB分层。将其用过滤器乘以后,将其卷入到一个点。然后,Map1,Map2,在向上...原因是每层具有不同的过滤器计算,因此这里有很多过滤器,然后计算分别产生了这样的覆盖层。

执行下一个操作时也是如此。这些地图的垂直通过仍将通过过滤器操作卷入一个点。

让我们根据上面的简单图形进行演示:

def conv(image, filter):
h = filter.shape[0]
w = filter.shape[1]

for i in range(image.shape[0]):
for j in range(image.shape[1]):
window = image[i: i+h, j: j+w]
print(window)
filter = np.array([
[1, 0, -1],
[1, 0, -1],
[1, 0, -1]
])

conv(image, filter)

---
[[10 10 10]
[10 10 10]
[10 10 10]]
...
[[-3]
[-3]
[-3]]
...
[[10 -3 -3]]
[[-3 -3 -3]]
[[-3 -3]]
[[-3]]

输入图片的数据,获取过滤器的高度和宽度,然后让过滤器从顶部到底部从沿图片向左向右移动。

我们可以看到,当我们跑到中间时,将出现一系列[[-3],[-3],[-3]]。因为我会一直在边缘上运行,如果您想进行卷积,那么大小必须始终与过滤器相同,因此我们需要在此处减去过滤器。只是不要运行以下内容。

...
for i in range(image.shape[0] - h+1):
for j in range(image.shape[1] - w+1):
...

就是这样。

每当我们实际上从从上到下从左到右逐一切出窗户。

当我们乘以窗口并过滤然后添加它们时,我们可以得到什么结果?

for i ...:
for j ...
...
result = np.sum(filter * window)
print(result)

---
0
39
...
39
0

这是计算卷积的结果。

然后,我们可以将其更改为矩阵表单,然后将其打印出来以查看它是什么:

def conv(image, filter):
r_height = image.shape[0] - h+1
r_width = image.shape[1] - w+1
result = np.zeros(shape=(r_height, r_width))
for i ...:
for j ...:
result[i][j] = np.sum(filter * window)
return result

result = conv(image, filter)
plt.imshow(result)
plt.show()
---
array([[ 0., 39., 39., 0.],
[ 0., 39., 39., 0.],
[ 0., 39., 39., 0.],
[ 0., 39., 39., 0.]])

卷积应用_用卷积解释一种生活现象_卷积在生活应用

Alt文字

之所以成为这样的原因是因为原始图像中有一个边缘,现在此图像显示了图像的边缘突出显示。

这样的图像可能不是很容易理解的。我将用我的头像进行此示例:

卷积在生活应用_卷积应用_用卷积解释一种生活现象

Alt文字

myself = Image.open('./assets/chaheng.jpg').convert('L')
...
plt.imshow(result, cmap='gray')

更明显的是,我将图像更改为灰度。

卷积应用_卷积在生活应用_用卷积解释一种生活现象

Alt文字

我们可以在卷积后看到效果,并且显然显示边缘。但是我们还注意到垂直边缘很明显,但是水平边缘尚不清楚。让我们沿水平方向执行卷积。我们首先需要添加一种处理多个过滤器的方法,将原始Cons方法更改为Single_conv,这意味着处理一个:

def single_conv(...):
...

def conv(image, filters):
results = [single_conv(image, f) for f in filters]
return results

然后,我们的呼叫需要更改传递的参数:

results = conv(image, [h_filter, w_filter])

由于我们要通过两个过滤器,因此我们需要定义另一个水平过滤器并将其传递在一起:

# 原来的filter
h_filter = np.array([...])

# 新定义的横向filter
w_filter = np.array([
[1, 1, 1],
[0, 0, 0],
[-1, -1, -1]
])

接下来,我们打印出原始图像,垂直卷积结果和水平卷积结果:

plt.subplot(1, 3, 1)
plt.imshow(image)
plt.subplot(1, 3, 2)
plt.imshow(results[0])
plt.subplot(1, 3, 3)
plt.imshow(results[1])

plt.show()

卷积在生活应用_用卷积解释一种生活现象_卷积应用

Alt文字

原始图像变成这种颜色的原因是开元棋官方正版下载,当我在pil中阅读图像时,我将其变成了灰度。我们可以看到边缘上的第二和第三张图片之间的明显区别。一个就像从左边传来的灯,另一个就像从顶部传来的灯。

中间和右侧实际上提高了边缘。由于卷积内核不同,中间的图显然是用更准确的垂直边缘提取的,右侧的图形用更准确的水平方向提取。

这就是为什么我们在以前看到的图片中看到了这么多地图的原因:

卷积应用_卷积在生活应用_用卷积解释一种生活现象

Alt文字

它的每一层都是从其他过滤器中提取的。如此多的过滤器的原因是,从每个过滤器中提取的特性不同。

让我们看一下我们刚刚定义的方法:

def single(image, filter):
...

输入卷积输入输入通道时,我们调用图像参数。目前,如果我们的图像为RGB,则是三维,则输入通道等于3。

过滤器的数量称为输出通道。原因是过滤器尽可能多,我们的结果将尽可能厚。例如,如果我们有4个过滤器,则输出结果有四层。然后,您可以继续使用过滤器来卷积结果,并且本回合中的输入通道一次等于输出通道一次,即4。

这是卷积的原则。

好的,这就是这堂课的全部。在下一堂课中,让我们继续学习卷积,看看如何将其应用于神经网络。

网友留言(0)

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。