美文网首页
TensorFlow2.0--卷积

TensorFlow2.0--卷积

作者: 无剑_君 | 来源:发表于2020-06-20 11:20 被阅读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,并且尽管图像中的数据更少,但检测到的功能已得到增强。

    相关文章

      网友评论

          本文标题:TensorFlow2.0--卷积

          本文链接:https://www.haomeiwen.com/subject/beuwxktx.html