TensorFlow by Google CNN卷积神经网络 Machine Learning Foundations: Ep #3 - Convolutions and pooling
Posted 架构师易筋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorFlow by Google CNN卷积神经网络 Machine Learning Foundations: Ep #3 - Convolutions and pooling相关的知识,希望对你有一定的参考价值。
1. 什么是卷积?
bit.ly/convolutions-fun
在下一个实验中,您将探索如何使用卷积增强您的计算机视觉示例。但什么是卷积?在本实验中,您将探索它们是什么以及它们如何工作,然后在实验 4 中,您将看到如何在您的神经网络中使用它们。
与卷积一起,您将使用称为“池化”的东西,它压缩您的图像,进一步强调特征。您还将了解池化在本实验中的工作原理。
1.1 之前 DNN 的局限性
在上一个实验中,您看到了如何使用 Fashion MNIST 数据集训练时尚单品的图像分类器。这给了你一个非常准确的分类器,但有一个明显的限制:图像是 28x28,灰度,项目在图像中居中。
例如,这里有几张 Fashion MNIST 中的图片
您创建的 DNN 只是从原始像素中学习毛衣的构成以及在这种情况下靴子的构成。但是考虑一下它如何对这张图像进行分类?
虽然很明显这张图片中有靴子,但分类器会由于多种原因而失败。首先,当然,它不是 28x28 灰度,但更重要的是,分类器是在面向左侧的靴子的原始像素上训练的,而不是构成靴子的特征。
这就是卷积非常强大的地方。卷积是一种过滤器,它通过图像、处理它并提取显示图像共性的特征。在本实验中,您将看到它们是如何工作的,但要处理图像以查看是否可以从中提取特征!
生成卷积非常简单——您只需扫描图像中的每个像素,然后查看它的相邻像素。您将这些像素的值乘以过滤器中的等效权重。
所以,例如,考虑这个:
在这种情况下,指定了 3x3 卷积。
当前像素值为 192,但您可以通过查看相邻值并将它们乘以过滤器中指定的值来计算新像素值,并将新像素值作为最终数量。
让我们通过在 2D 灰度图像上创建基本卷积来探索卷积的工作原理。首先,我们可以通过从 scipy 获取“上升”图像来加载图像。这是一张漂亮的内置图片,有很多角度和线条。
让我们从导入一些 python 库开始。
import cv2
import numpy as np
from scipy import misc
i = misc.ascent()
接下来,我们可以使用 pyplot 库来绘制图像,以便我们知道它的样子。
import matplotlib.pyplot as plt
plt.grid(False)
plt.gray()
plt.axis('off')
plt.imshow(i)
plt.show()
我们可以看到这是一个楼梯间的图像。这里有很多功能我们可以玩,看看我们是否可以隔离它们——例如有很强的垂直线。
图像存储为一个 numpy 数组,因此我们可以通过复制该数组来创建转换后的图像。让我们还获取图像的尺寸,以便我们稍后对其进行循环。
i_transformed = np.copy(i)
size_x = i_transformed.shape[0]
size_y = i_transformed.shape[1]
现在我们可以创建一个 3x3 数组的过滤器。
# This filter detects edges nicely
# It creates a convolution that only passes through sharp edges and straight
# lines.
#Experiment with different values for fun effects.
filter = [ [0, 1, 0], [1, -4, 1], [0, 1, 0]]
# A couple more filters to try for fun!
# filter = [ [-1, -2, -1], [0, 0, 0], [1, 2, 1]]
# filter = [ [-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
# If all the digits in the filter don't add up to 0 or 1, you
# should probably do a weight to get it to do so
# so, for example, if your weights are 1,1,1 1,2,1 1,1,1
# They add up to 10, so you would set a weight of .1 if you want to normalize them
weight = 1
现在让我们创建一个卷积。我们将迭代图像,留下 1 个像素的边距,并将当前像素的每个邻居乘以过滤器中定义的值。
即当前像素在其上方和左侧的邻居将乘以过滤器中的左上角项等。然后我们将结果乘以权重,然后确保结果在 0-255 范围内
最后,我们将新值加载到转换后的图像中。
for x in range(1,size_x-1):
for y in range(1,size_y-1):
convolution = 0.0
convolution = convolution + (i[x - 1, y-1] * filter[0][0])
convolution = convolution + (i[x, y-1] * filter[0][1])
convolution = convolution + (i[x + 1, y-1] * filter[0][2])
convolution = convolution + (i[x-1, y] * filter[1][0])
convolution = convolution + (i[x, y] * filter[1][1])
convolution = convolution + (i[x+1, y] * filter[1][2])
convolution = convolution + (i[x-1, y+1] * filter[2][0])
convolution = convolution + (i[x, y+1] * filter[2][1])
convolution = convolution + (i[x+1, y+1] * filter[2][2])
convolution = convolution * weight
if(convolution<0):
convolution=0
if(convolution>255):
convolution=255
i_transformed[x, y] = convolution
现在我们可以绘制图像以查看卷积的效果!
# Plot the image. Note the size of the axes -- they are 512 by 512
plt.gray()
plt.grid(False)
plt.imshow(i_transformed)
#plt.axis('off')
plt.show()
因此,请考虑以下过滤器值及其对图像的影响。
使用 -1,0,1,-2,0,2,-1,0,1
为我们提供了一组非常强大的垂直线:
使用 -1, -2, -1, 0, 0, 0, 1, 2, 1
为我们提供水平线:
为自己探索不同的价值!
2. 池化
除了使用卷积,池化还可以极大地帮助我们检测特征。目标是减少图像中的信息总量,同时保持检测到的特征。
有多种不同类型的池化,但在本实验中,我们将使用一种称为 MAX 池化。
这里的想法是迭代图像,并查看像素及其右侧、下方和右侧的直接邻居。取其中最大的(因此称为 MAX 池化)并将其加载到新图像中。因此,新图像将是旧图像大小的 1/4——X 和 Y 上的尺寸通过此过程减半。您会看到尽管进行了这种压缩,但这些功能仍然得到了维护!
此代码将显示 (2, 2) 池化。运行它以查看输出,您将看到虽然图像是原始大小的 1/4,但保留了提取的特征!
new_x = int(size_x/2)
new_y = int(size_y/2)
newImage = np.zeros((new_x, new_y))
for x in range(0, size_x, 2):
for y in range(0, size_y, 2):
pixels = []
pixels.append(i_transformed[x, y])
pixels.append(i_transformed[x+1, y])
pixels.append(i_transformed[x, y+1])
pixels.append(i_transformed[x+1, y+1])
pixels.sort(reverse=True)
newImage[int(x/2),int(y/2)] = pixels[0]
# Plot the image. Note the size of the axes -- now 256 pixels instead of 512
plt.gray()
plt.grid(False)
plt.imshow(newImage)
#plt.axis('off')
plt.show()
在下一个实验中,您将看到如何将卷积添加到您的 Fashion MNIST 神经网络以使其更高效——因为它将基于特征而不是原始像素进行分类。
参考
https://www.youtube.com/watch?v=PCgLmzkRM38
以上是关于TensorFlow by Google CNN卷积神经网络 Machine Learning Foundations: Ep #3 - Convolutions and pooling的主要内容,如果未能解决你的问题,请参考以下文章
Google I/O 2017推出的Tensorflow Lite有啥意义
Google I/O 2017推出的Tensorflow Lite有啥意义
独家 |《TensorFlow实战》作者黄文坚:四大经典CNN网络技术原理
TensorFlow by Google 使用排序 APIMachine Learning Foundations: Ep #9 - Using the Sequencing APIs
TensorFlow by Google Machine Learning Foundations: Ep #8 - Tokenization for Natural Language Process