📜  使用Python进行卷积简介

📅  最后修改于: 2022-05-13 01:54:53.403000             🧑  作者: Mango

使用Python进行卷积简介

卷积卷积神经网络背后的关键特征之一。有关 CNN 的工作细节,请参阅卷积神经网络简介。

特征学习
特征工程或特征提取是从输入数据中提取有用模式的过程,这将有助于预测模型更好地理解问题的真实性质。一个好的特征学习将以一种显着提高应用机器学习算法的准确性和性能的方式呈现模式,而这种方式对于机器学习本身来说是不可能或过于昂贵的。特征学习算法找到对区分所需类别很重要的常见模式并自动提取它们。在此过程之后,它们已准备好用于分类或回归问题。
让我们考虑一个流行的图像分类问题,人脸图像和非人脸对象的图像分类。在计算机视觉的早期,科学家们试图通过手工编码人脸的可能特征(如形状、眼睛、鼻子、嘴唇等)的检测算法来解决这个问题。这种方法通常会产生很差的结果,因为人脸可能会出现在品种繁多,甚至无法解释大部分特征。只需简单地改变照明或方向即可导致图像发生变化,从而使算法不再能够检测到人脸。
1998 年,Yann Lecun 引入了卷积神经网络的概念,它能够以大约 99% 的准确率对手写字符的图像进行分类。卷积神经网络的巨大优势在于,它们非常擅长在图像中发现在每一层之后都会增长的特征,最终产生高层次的特征。最后的层(可以是一个或多个)使用所有这些生成的特征进行分类或回归。
卷积
卷积是在图像上执行的一种操作,用于从图像中提取特征,应用称为内核的较小张量,如图像上的滑动窗口。根据卷积核中的值,我们可以从图像中提取特定模式。在下面的示例中,我们将演示使用适当的内核检测图像中的水平和垂直边缘。

Python3
import numpy as np
import matplotlib.pyplot as plt
  
# let img1 be an image with no features
img1 = np.array([np.array([200, 200]), np.array([200, 200])])
img2 = np.array([np.array([200, 200]), np.array([0, 0])])
img3 = np.array([np.array([200, 0]), np.array([200, 0])])
  
kernel_horizontal = np.array([np.array([2, 2]), np.array([-2, -2])])
print(kernel_horizontal, 'is a kernel for detecting horizontal edges')
  
kernel_vertical = np.array([np.array([2, -2]), np.array([2, -2])])
print(kernel_vertical, 'is a kernel for detecting vertical edges')
  
# We will apply the kernels on the images by
# elementwise multiplication followed by summation
def apply_kernel(img, kernel):
    return np.sum(np.multiply(img, kernel))
  
# Visualizing img1
plt.imshow(img1)
plt.axis('off')
plt.title('img1')
plt.show()
  
# Checking for horizontal and vertical features in image1
print('Horizontal edge confidence score:', apply_kernel(img1, 
                                            kernel_horizontal))
print('Vertical edge confidence score:', apply_kernel(img1, 
                                            kernel_vertical))
  
# Visualizing img2
plt.imshow(img2)
plt.axis('off')
plt.title('img2')
plt.show()
  
# Checking for horizontal and vertical features in image2
print('Horizontal edge confidence score:', apply_kernel(img2, 
                                            kernel_horizontal))
print('Vertical edge confidence score:', apply_kernel(img2, 
                                            kernel_vertical))
  
# Visualizing img3
plt.imshow(img3)
plt.axis('off')
plt.title('img3')
plt.show()
  
# Checking for horizontal and vertical features in image3
print('Horizontal edge confidence score:', apply_kernel(img3, 
                                            kernel_horizontal))
print('Vertical edge confidence score:', apply_kernel(img3, 
                                            kernel_vertical))



输出: