📜  使用Python卷积简介

📅  最后修改于: 2020-04-28 01:17:08             🧑  作者: Mango

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

特征学习
特征工程或特征提取是从输入数据中提取有用模式的过程,这将有助于预测模型更好地理解问题的真实本质。良好的特征学习将以某种方式呈现模式,从而以一种机器学习本身不可能或太昂贵的方式显着提高所应用机器学习算法的准确性和性能。特征学习算法找到了常见的模式,这些模式对于区分所需的类并自动提取它们很重要。完成此过程后,即可将其用于分类或回归问题。

让我们考虑一个流行的图像分类问题,即面部和非面部对象的图像分类。在计算机视觉的早期,科学家试图通过手工编码人类面部的可能特征(例如形状,眼睛,鼻子,嘴唇等)的检测算法来解决该问题。这种方法通常会产生较差的结果,因为可能会出现面部许多品种,甚至不可能占很大一部分特征。只是光照或方向的简单改变就可以带来图像的改变,从而算法不再能够检测到脸部。

1998年,Yann Lecun引入了卷积神经网络的概念,该概念能够以约99%的精度对手写字符的图像进行分类。卷积神经网络的最大优势在于,它们非常擅长于在每个级别之后增长的图像中查找特征,最终导致高级特征。最终层(可以是一个或多个)使用所有这些生成的特征进行分类或回归。

卷积
卷积是在图像上执行的操作,用于从图像中提取特征,方法是在图像上滑动像滑动窗口一样使用称为内核的较小张量。根据卷积内核中的值,我们可以从图像中拾取特定的模式。在下面的示例中,我们将演示使用适当的内核检测图像中的水平边缘和垂直边缘。

import numpy as np
import matplotlib.pyplot as plt
# 让img1成为没有功能的图像
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, '是用于检测水平边缘的内核')
kernel_vertical = np.array([np.array([2, -2]), np.array([2, -2])])
print(kernel_vertical, '是用于检测垂直边缘的内核')
# 我们将通过逐元素相乘,然后求和,将内核应用于图像
def apply_kernel(img, kernel):
    return np.sum(np.multiply(img, kernel))
# 可视化img1
plt.imshow(img1)
plt.axis('off')
plt.title('img1')
plt.show()
# 检查image1中的水平和垂直特征
print('水平边缘置信度分数:', apply_kernel(img1,
                                            kernel_horizontal))
print('垂直边缘置信度分数:', apply_kernel(img1,
                                            kernel_vertical))
# 可视化img2
plt.imshow(img2)
plt.axis('off')
plt.title('img2')
plt.show()
# 检查image2中的水平和垂直特征
print('水平边缘置信度分数:', apply_kernel(img2,
                                            kernel_horizontal))
print('垂直边缘置信度分数:', apply_kernel(img2,
                                            kernel_vertical))
# 可视化img3
plt.imshow(img3)
plt.axis('off')
plt.title('img3')
plt.show()
# 检查image3中的水平和垂直特征
print('水平边缘置信度分数:', apply_kernel(img3,
                                            kernel_horizontal))
print('垂直边缘置信度分数:', apply_kernel(img3,
                                            kernel_vertical))

输出:
[ [ 2 2]
[-2 -2] ] 是用于检测水平边缘的内核
[ [ 2 -2]
[ 2 -2] ] 是用于检测垂直边缘的内核

水平边缘置信度分数: 0
垂直边缘置信度分数: 0

水平边缘置信度分数: 800
垂直边缘置信度分数: 0

水平边缘置信度分数: 0
垂直边缘置信度分数: 800