编者按:和数据科学研究生Adel Nehme一起,探索卷积神经网络(机器视觉和图像识别领域最重要的深度学习技术之一)背后的直觉。
随着AI的突破持续吸引公众注意,人们开始不加区别地使用“人工智能”、“机器学习”、“深度学习”等术语。然而,了解这些术语的区别,有助于把握AI技术的发展趋势。
人工智能同心圆
我们可以把这三个术语想象成三个同心圆,其中人工智能包含了机器学习,机器学习又包含了深度学习。
简单来说,有一些任务,传统上认为需要通过人类认知活动才能完成,开发执行这些任务的计算机系统,即为人工智能。
而机器学习则是创建从大规模数据集中学习模式,并提供洞见的系统。机器学习本身可以分为三大类:
监督学习(supervised learning),理解一组数据点和标签之间的关系,并在未标注的数据点上给出预测。例如,分类是否会出现不良贷款,预测未来股价。
无监督学习(unsupervised learning)则直接基于数据集的相似特征识别有意义的模式。例如,根据购物行为的相似程度聚类消费者。
强化学习(reinforcement learning)让智能体在定义良好的环境中选择可能的行动,并最大化目标函数(奖励)。我们可以把自动驾驶看成一个强化学习问题,在公路上(环境)自动行驶的汽车(智能体),最大化其目标——不要出事故(奖励)。
最后,深度学习是一种机器学习技术,该技术利用大规模数据和多层神经网络以理解数据集的模式。最近在计算机视觉和语音识别等领域的AI突破都是由深度学习研究以及算力的日常商品化驱动的。
深度学习有众多架构和技术,以适应不同的使用场景,其中一种主要的架构和技术是卷积神经网络。卷积神经网络,受到哺乳动物视觉脑皮层方面的研究的启发,参考了哺乳动物使用不同层次的神经元感知世界的方式。可以将这一模型想象成视觉皮层的模型,专门设计的不同神经元组识别不同的形状。每个神经元组看到相应目标后激活,并和其他神经元组互相交流,以发展出感知目标的总体理解。
这一系统可以解释为分层的神经元组,检测输入刺激的低层特性,并互相交流,以发展对目标的高层检测。
第一组神经元结构识别低层特征(例如,脸部的轮廓)
第二组神经元结构识别颜色和形状(例如,肤色和颌骨转角)
第三组神经元结构识别细节(例如,耳朵、鼻子、眼睛)
第四组神经元结构整体识别整个目标(例如,脸部和对应之人)
简单来说,看到给定目标后,系统中的不同神经元组因目标的不同方面而激活,并互相交流以形成整体图景。
Yann Lecun从这一视觉脑皮层的层次模型中汲取了灵感,研发了卷积神经网络:
局部连接:每层共享一个连接,以互相传递所学特征。
层次结构:在不同网络层之间有一个很明显的层次结构——从低层特征(例如,鼻子,眼睛)到高层特征(脸部、具体的人)。
空间不变性:模型可以适应输入的平移等变换,仍然能够完成识别。(人类能够识别颠倒或经过其他变换的图像。)
因此,卷积神经网络的架构如下图所示:
典型的卷积神经网络架构
其中,输入数据为四维矩阵(样本数字,高,宽,频道)。其中频道对应色彩,彩图有3个频道(R、G、B),而灰度图像只有1个频道。
输入数据将连接到一个隐藏层(卷积层),应用多个任意尺寸(通常为3x3或5x5)的过滤器至图像。可以将过滤器想象为一个大小为3x3(或5x5)的小手电,照在输入图像上,尝试提取特征映射。基于特征映射,算法可以理解数据中的局部特征(眼、耳……),不管其位置如何(平移不变性)。如下图所示:
池化是一个降采样操作,通过应用任意尺寸(步长)的窗口,在窗口中根据用户指定,提取和、最大值、平均值,以降低提取的特征映射的维度。在下面的示意图中,我们使用的是最大池化,在特征映射的2x2窗口中提取最大值。这一技术有助于在保留信息的前提下降低维度。
最后是传统的全连接层,对卷积习得的表示进行softmax操作,并输出预测。简单来说,全连接层包含观察到特定模式后会“点亮”的节点。
从直觉上说,卷积神经网络将图像作为输入,尝试使用一系列数学运算(卷积、池化)辨认不同的小特征(局部连接),不管其位置如何(空间不变性),以理解整个图像的内容。这些数学运算牵涉到建模图像为一系列数字,其中每个数字表示像素亮度(假设输入为灰度图像)。
我们的数据集是72x72网格中的一组几何图形(三角形、圆形、矩形)。由于这些是灰度图像,因此它们只有一个频道。下面是一些样本:
我们将使用python的Keras包实现一个卷积神经网络,该网络在分类这些形状时可以达到98%精确度。
导入依赖:
import numpy as np
import keras
from keras import Sequential, optimizers
from keras.layers import Dense, Activation
from keras.callbacks import EarlyStopping
from sklearn.metrics import confusion_matrix, accuracy_score
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dropout
from keras.utils import np_utils
生成训练数据集和测试数据集:
[X_train, Y_train] = generate_dataset_classification(1000, 20, True)
[X_test, Y_test] = generate_test_set_classification()
根据keras的要求转换标签至类别矩阵,并重整训练集中图像的形状:
Y_train = keras.utils.to_categorical(Y_train, 3)
X_train = X_train.reshape(1000,72,72,1)
构建模型:
conv_model = Sequential()
conv_model.add(Conv2D(16, (5,5), activation = 'relu', input_shape = (72,72,1)))
conv_model.add(MaxPooling2D((2,2)))
conv_model.add(Conv2D(16, (5,5), activation = 'relu'))
conv_model.add(MaxPooling2D((2,2)))
conv_model.add(Conv2D(16, (5,5), activation = 'relu'))
conv_model.add(MaxPooling2D((2,2)))
conv_model.add(Flatten())
conv_model.add(Dense(3, activation = 'sigmoid'))
编译、训练模型:
conv_model.compile(optimizer = 'Adam', loss = 'categorical_crossentropy')
conv_model.fit(X_train, Y_train, validation_split = 0.3, epochs = 100, batch_size = 32)
重整测试集数据的形状,在测试集上进行预测,并评估精确度:
X_test = X_test.reshape(300,72,72,1)
predictions = conv_model.predict_classes(X_test)
print("精确度评分为 {} %".format(accuracy_score(Y_test, predictions) * 100))
结果:
精确度评分为 97.33333333333334 %
卷积神经网络代表了图像识别中的重大突破。卷积神经网络在自动驾驶汽车,人脸识别系统,医学诊断等场景都有广泛应用。然而,值得注意的是,卷积神经网络仍有提升的空间,而卷积网络的适用领域也出现了一些新技术,比如胶囊网络。
原文地址:https://towardsdatascience.com/understanding-convolutional-neural-networks-221930904a8e