TensorFlow2.0--卷积

一、什么是卷积?

必须在深度学习场景中使用卷积才能创建卷积神经网络。
使用Fashion MNIST数据集为时尚商品训练图像分类器。为您提供了一个非常准确的分类器,但存在明显的限制:图像为28x28灰度,并且项目位于图像的中心。
例如,这是Fashion MNIST中的几个图像


image

您创建的DNN(深度神经网络)只是从原始像素中了解了什么构成了一件毛衣,以及什么构成了一件靴子。但是,考虑如何对图像进行分类?


image

虽然很明显此启动程序无法,但是分类器由于多种原因而失败。首先,不是28x28灰度,而是更重要的是,分类器是针对左侧靴子的原始像素而不是构成靴子实际功能的功能进行训练的。要解决此问题,可以使用卷积。

1、 使用卷积

卷积是通过图像的滤镜,对其进行处理并提取出在图像中具有共同性的特征。在本实验中,您将通过处理图像以查看是否可以从中提取特征来了解它们的工作原理!
这个过程非常简单。您只需扫描图像中的每个像素,然后查看其相邻像素。您可以将这些像素的值乘以过滤器中的等效权重。
因此,例如,请考虑以下因素:


image

在这种情况下,将指定一个3x3卷积矩阵。
当前像素值为192,但是您可以通过查看邻居值,然后将它们乘以过滤器中指定的值,然后将新像素值作为最终值,来计算得到新的像素值。

2. 导入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()
image

我们可以看到这是楼梯间的图像。这里有很多功能可供我们查看是否可以分隔它们-例如,有很强的垂直线。

该图像存储为numpy数组,因此我们只需复制该数组即可创建转换后的图像。我们还要获取图像的尺寸,以便稍后进行循环。

i_transformed = np.copy(i)
size_x = i_transformed.shape[0]
size_y = i_transformed.shape[1]

3. 创建卷积

在之前的实验室中,您看到了如何使用包含三层的深度神经网络(DNN)进行时尚图像识别-输入层(以输入数据的形式),输出层(以所需的输出的形式)和一个隐藏层。您尝试了几种会影响最终精度的参数,例如:隐藏层的大小不同和训练时期的数量。
运行它,并记下最后打印出的测试精度。

# 这个过滤器能很好地检测边缘
# 它产生仅通过尖锐边缘和直线的卷积。
# 试用不同的值以获得更好的效果。
# filter = [ [0, 1, 0], [1, -4, 1], [0, 1, 0]] 
# 还有更多过滤器可以尝试!
filter = [ [-1, -2, -1], [0, 0, 0], [1, 2, 1]]
#filter = [ [-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
 # 如果过滤器中的所有数字加起来不等于0或1,那么您可能应该对其进行加权
# 例如,如果你的权重是1,1,11,2,11,1,1
# 它们加起来是10,所以如果要规范化它们,可以将权重设置为.1
weight  = 1

现在让我们计算输出像素。我们将遍历图像,保留1个像素的边距,然后将当前像素的每个相邻像素乘以滤镜中定义的值。
这意味着当前像素在其上方和左侧的邻居将与滤镜中的左上方项目等相乘。然后将结果乘以权重,然后确保结果在0-255范围内。
最后,我们将新值加载到转换后的图像中。

for x in range(1,size_x-1):
  for y in range(1,size_y-1):
      output_pixel = 0.0
      output_pixel = output_pixel + (i[x - 1, y-1] * filter[0][0])
      output_pixel = output_pixel + (i[x, y-1] * filter[0][1])
      output_pixel = output_pixel + (i[x + 1, y-1] * filter[0][2])
      output_pixel = output_pixel + (i[x-1, y] * filter[1][0])
      output_pixel = output_pixel + (i[x, y] * filter[1][1])
      output_pixel = output_pixel + (i[x+1, y] * filter[1][2])
      output_pixel = output_pixel + (i[x-1, y+1] * filter[2][0])
      output_pixel = output_pixel + (i[x, y+1] * filter[2][1])
      output_pixel = output_pixel + (i[x+1, y+1] * filter[2][2])
      output_pixel = output_pixel * weight
      if(output_pixel<0):
        output_pixel=0
      if(output_pixel>255):
        output_pixel=255
      i_transformed[x, y] = output_pixel

4. 检查结果

现在我们可以绘制图像,以查看通过该滤镜的效果!

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

image

因此,请考虑以下滤镜值及其对图像的影响。
使用[-1,0,1,-2,0,2,-1,0,1]为我们提供了非常强大的垂直线集:


image

使用[-1,-2,-1,0,0,0,1,2,1]给我们水平线:


image

另外,请尝试使用其他大小的滤镜,例如5x5或7x7。

5. 了解池化

除了使用卷积,池化还可以极大地帮助我们检测特征。目标是减少图像中的信息总量,同时保持所检测到的特征存在。
有许多不同类型的池,但是在本实验中,我们将使用一种称为MAX池的池。
这里的想法是遍历图像,并考虑像素及其在右侧,下方和下方的直接邻居。取其中最大的一个(因此称为MAX pooling)并将其加载到新映像中。因此,新图片将是旧图片的1/4:


image

此代码将显示(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]
 
# 绘制图像。请注意轴的大小-现在是256像素而不是512像素
plt.gray()
plt.grid(False)
plt.imshow(newImage)
#plt.axis('off')
plt.show()
image

请注意该图的轴-图像现在为256x256,是原始大小的1/4,并且尽管图像中的数据更少,但检测到的功能已得到增强。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352