图像识别方法有很多,包括传统的逻辑回归、Adaboost、卷积神经网络、Transformer等。现代图像识别算法的准确率已经超过人类的水平了,但是关于这些算法如何完成图像识别却仍是一个问题。关于如何解释一个算法的研究被称为可解释的机器学习,本文将选取逻辑回归和卷积神经网络两个算法,来研究图像识别的原理。
首先来聊聊逻辑回归算法,逻辑回归是一个非常简单的线性模型,在某些简单任务中非常高效。而且可解释性也非常强,因此先讨论逻辑回归图像识别的原理。
逻辑回归是线性回归加上sigmoid函数,其表达式如下:
y=11+e−(WXT+b)y=\frac{1}{1+e^{-(WX^T+b)}}y=1+e−(WXT+b)1
其中X、W是向量。其中y的取值会在0-1之间,当y大于等于0.5时,X会被判断为类别1,否则判断为类别0。逻辑回归的训练就是要找到最优的W和b。
对于图片分类来说,X就是图片,并且要求是一维向量(不考虑mini batch)。但是图片本身是二维或者三维的,因此逻辑回归在进行图片分类时,会把图片转换成一维向量。这么做有个明显问题,就是没有考虑图片的空间信息。这点会在卷积神经网络中改进。
在sklearn中提供了逻辑回归的实现,使用下面代码可以完成逻辑回归。
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_digits
X, y = load_digits(n_class=2, return_X_y=True)
lr = LogisticRegression()
lr.fit(X, y)
这里使用8×8的数字0和数字1的图片作为训练集,训练逻辑回归模型。在训练完成后,可以通过下面的属性获取W和b:
print(lr.coef_.shape)
print(lr.intercept_.shape)
# 输出
# (1, 64)
# (1,)
W的数量和图片像素数量是一样的。
在逻辑回归中,起至关重要的是权重W。它与像素一一对应,表示了某个像素在分类时起何种作用。数字1对应类别1,数字0对应类别0。
如果想正确分类,那么0对应区域应该会有负权重,这样才能保证遇到0时输出结果会偏小。而1对应区域应该会有较大的权重,这样才能保证遇到1时输出较大的结果。
这里以一个比数字识别更简单的问题来举例,两类数据如下:
两类数据有个明显区别,及类别0的白色区域(物体)集中在右上角,而类别1的白色区域集中在左下角。如果下给你正确分类,那么权重的大致分布如下:
即右上角权重偏大,左下角权重偏小。权重本身是一维的,但是我们可以把它reshape成和图片一样的形状,上面的图片就是这么得到的。
现在我们对lr.coef_来reshape并展示,代码如下:
img = lr.coef_.reshape((8, 8))
plt.imshow(img)
plt.show()
展示结果如下:
从结果来看外面有一圈暗色,即低权重,这部分是数字0的分布区域。而中间有一束亮色,即高权重,这部分是数字1的分布区域。当1和0分布区域重合时,会得到接近0的权重。
相比逻辑回归,卷积神经网络要复杂得多。解释起来也要更麻烦,但是还是有办法解释的。首先来看看卷积神经网络的原理。
卷积神经网络的原理就是提取特征,然后分类。后面的分类与逻辑回归是非常像的,这里着重解释特征提取。
一次卷积操作可以分为下面几个步骤:
下面详细解释每一步。
因为卷积会导致图片缩小,因此需要在图片外圈填充一圈0,这一操作叫做padding。其操作为:
原图形状为5×5,填充后形状为7×7。
第二步则是卷积操作,也是卷积神经网络的关键。卷积操作需要有一个卷积核,卷积核是一个数字矩阵。在数字图像处理中,卷积核是人为设计的,而在卷积神经网络中,卷积核是学习而来的。
卷积的具体操作为将卷积核与图片左上角区域做点积,得到第一个结果。操作如下图:
而后将区域往右移动一(由stride参数决定)个像素,同样计算点积,得到第二个结果:
后续则是移动区域,重复上述操作,最后得到卷积结果,即特征图。结果如下:
特征图时一个十字,观察原图(Padding前的图)可以发现以(3,2)和(4,3)为中心的区域是十字形,而特征图中这两处正好是5(最大值)。
其实这就是卷积的作用,卷积结果越大,说明在某个区域与卷积核越像。在图片中,包含大量特征,因此实际情况中会使用大量的卷积核。
Pooling有许多种,这里以MaxPooling为例。其操作就是选取指定区域,然后把区域最大值作为结果。Pooling并非必要操作,而是一种节约资源的举措。下面是具体操作:
对比Pooling前后的特征图,Pooling前可以找到某一特征的准确位置,而Pooling后可以找到某一特征的大致位置。
卷积核的大小通常为3×3、5×5、7×7这种小尺寸,能够提取的特征也是非常小的。那么卷积神经网络是如何知道图片中是否存在一个复杂物体的呢?这就要通过卷积层的堆叠了。
我们在原图上进行卷积时,提取的是微小的特征,也就是纹理、边缘等特征。这些特征无法获取图像的宏观信息,因此需要站在更广的范围观察图片。即对Pooling后的图片进行卷积。
以3×3的卷积、2×2的Pooling为例,第一次卷积只能捕抓3×3范围的特征,而Pooling后的特征图一个像素代表原图2×2的区域,因此第二次卷积能捕抓6×6范围的特征。也就是说第二次卷积有更大的感受野。
下面用一个简单的例子来解释卷积神经网络如何识别数字。这里以数字1和2为例,下面是两个图片:
首先我们设计第一层卷积的卷积核,下面是根据图片设计的几个卷积核:
使用上面5个卷积核对原图进行卷积,各自可以得到5个特征图。下面是数字1卷积后的结果:
然后我们观察数字1图片中各个特征的位置,比如特征1(第一个卷积核对应的特征)出现在靠近左上角位置。特征二则出现在靠近中间位置,依次往后推到,由此我们可以设计第二层卷积的卷积核。第二层卷积核的通道数需要与特征图数量一致,为了简单,第二层我们先设计一个卷积核。具体如下:
这里是一个由5通道的卷积核。每个通道表示图片中某个位置有何种特征,多种特征组合起来就成了一个数字了。
对于数字2来说,情况也是类似的。首先使用第一层卷积对图片进行卷积操作,得到与图片1不同的特征图。结果如下:
由此设计出第二层的第二个卷积核:
通过同样的方式就可以知道图片中是否有数字二了。
那么网络如何区分数字1和数字二呢?这个非常简单,第二层我们设计了两个卷积核,如果不做padding,那么第二层会输出两个向量。比如输入图片1,会得到下面的结果:
[[2, 6, 3, 4, 4],
[4, 0, 3, 3, 4]]
而输入图片2,则会得到:
[[2, 4, 3, 3, 4],
[4, 0, 3, 4, 4]]
其中第一个向量是为数字1设计的,粗略来看,第一个向量的元素和越大则图片越像数字1,第二个向量的元素和越大则图片越像数字2。不过这并非绝对的。在实作时,我们会在后面拼接全连接。而逻辑回归可以看作是一个简单的全连接,因此网络后面部分可以用逻辑回归的方式进行解读。
通过上面的例子,我们详细剖析了多层卷积是如何工作的。在上面的基础上我们可以继续扩展,当卷积层数更高时,我们可以识别猫狗这种更为复杂的特征。
阅读量:749
点赞量:0
收藏量:0