与上一章K-NN相比,更理想的方法是定义一个机器学习模型,该模型可以在训练期间从我们的输入数据中学习模式(需要我们在训练过程中花费更多时间),但具有被少量模型定义的好处无论训练规模如何,都可以轻松用于表示模型的参数。这种类型的机器学习称为参数化学习。参数化学习是现代机器学习和深度学习算法的基石。
数据:数据包括数据点(即来自图像的原始像素强度、提取的特征等)及其相关的类标签。通常,我们用多维设计矩阵来表示我们的数据。
评估函数:评分函数接受我们的数据作为输入并将数据映射到类标签。例如,给定我们的一组输入图像,评分函数获取这些数据点,函数f(我们的评分函数),然后返回预测的类标签。
损失函数:损失函数量化了我们预测的类标签与我们的真实标签的一致性程度。这两组标签之间的一致性越高,我们的损失越低(并且我们的分类准确度越高,至少在训练集上)。我们在训练机器学习模型时的目标是最小化损失函数,从而提高我们的分类精度。
权重和偏差:权重矩阵(通常表示为W)和偏置向量b称为我们实际要优化的分类器的权重或参数。根据我们的评分函数和损失函数的输出,我们将调整权重和偏差的值,以提高分类准确性。
1.2线性分类:从图像到标签定义一个评分函数f,将图像映射到类标签分数。完成此评分的一种方法是通过简单的线性映射:Xi在这个例子里是一个列向量(32×32×3图像展平为3072个整数的列),权重矩阵W(3072×3),偏差b为3×1;
在取W和xi之间的点积后,我们加入偏置向量b——结果就是我们的实际评分函数。我们的评分函数在右侧产生三个值:分别与狗、猫和熊猫标签相关的分数。
我们可以控制的唯一参数(就参数化学习而言)是我们的权重矩阵W和我们的偏置向量b。因此,我们的目标是利用我们的评分函数和损失函数来优化(即以系统的方式修改)权重和偏差向量,从而提高我们的分类准确性。
我们如何优化权重矩阵取决于我们的损失函数,但通常涉及某种形式的梯度下降。我们将在本章后面回顾损失函数。
1.3参数化学习和线性分类的优势利用参数化学习有两个主要优点:
1.完成模型训练后,我们可以丢弃输入数据,只保留权重矩阵W和偏置向量b。这大大减少了我们模型的大小,因为我们需要存储两组向量(相对于整个训练集)。
2.新的测试数据分类速度快。为了执行分类,我们需要做的就是取W和xi的点积,然后添加偏差b(即应用我们的评分函数)。这样做比需要将每个测试点与每个训练示例进行比较要快得多,就像在k-NN算法中一样。
1.4一个简单的Python线性分类器这个例子的目的不是展示我们如何从头到尾训练模型(我们将在后面的章节中介绍,因为在我们准备从头开始训练模型之前,我们还有一些基础要介绍),但为了简单展示我们如何初始化权重矩阵W、偏置向量b,然后使用这些参数通过简单的点积对图像进行分类。
让我们继续开始这个例子。我们的目标是编写一个Python脚本,将下图正确分类为“狗”。这个简单的例子并没有进行任何学习,而是提前测试好了参数,写再程序内的,只是为了描述权重矩阵W和偏置向量b。在实践中,不会人为初始化W和b值,而是当从头开始训练我们自己的机器学习模型时,通过优化算法(例如梯度下降)来优化和学习W和b。
创建一个文件linear_example.py,代码如下:
# import the necessary packages
import numpy as np
import cv2
# initialize the class labels and set the seed of the pseudorandom
# number generator so we can reproduce our results
labels = ["dog", "cat", "panda"]
np.random.seed(1)
# randomly initialize our weight matrix and bias vector -- in a
# *real* training and classification task, these parameters would
# be *learned* by our model, but for the sake of this example,
# let's use random values
W = np.random.randn(3, 3072)
b = np.random.randn(3)
# load our example image, resize it, and then flatten it into our
# "feature vector" representation
orig = cv2.imread("beagle.png")
image = cv2.resize(orig, (32, 32)).flatten()
# compute the output scores by taking the dot product between the
# weight matrix and image pixels, followed by adding in the bias
scores = W.dot(image) + b
# loop over the scores + labels and display them
for (label, score) in zip(labels, scores):
print("[INFO] {}: {:.2f}".format(label, score))
# draw the label with the highest score on the image as our
# prediction
cv2.putText(orig, "Label: {}".format(labels[np.argmax(scores)]),
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# display our input image
cv2.imshow("Image", orig)
cv2.waitKey(0)
运行脚本,如下结果:
$ python linear_example.py [INFO] dog: 7963.93 [INFO] cat: -2930.99 [INFO] panda: 3362.47二、损失函数的作用
为了通过我们的评分函数真正“学习”从输入数据到类标签的映射,我们需要讨论两个重要的概念:1.损失函数;2.优化方法
2.1什么是损失函数在最基本的层面上,损失函数量化了给定预测器在对数据集中的输入数据点进行分类时的“好”或“坏”程度。在CIFAR-10数据集上训练的两个独立模型随时间绘制的损失函数可视化如图8.4所示。损失越小,分类器在对输入数据和输出类标签之间的关系建模方面做得越好(尽管有一点我们可以过度拟合我们的模型——训练数据过于紧密,我们的模型失去了泛化能力,我们将在第17章详细讨论这种现象)。相反,我们的损失越大,需要做的工作就越多,以提高分类精度。
2.2多类SVM损失1、简化的评分函数:
2、第i个图像(数据点)的第j个类别的预测分数:
3、损失函数:对所有不正确的类(i≠j)求和,当损失Li=0时,给定的xi被正确分类。
4、把损失值推广到整个训练数据集,我们对所有的Li取平均数:
5、常见的另一个相关损失函数是平方hinge损失:
2.3交叉熵损失和Softmax分类器
1、交叉熵损失函数:
2、推导过程:
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
在图像分类的背景下,我们的输入数据是我们的图像数据集。评分函数为给定的输入图像生成预测。损失函数然后量化一组预测对数据集的好坏。最后,权重矩阵和偏置向量使我们能够真正从输入数据中“学习”——这些参数将通过优化方法进行调整和调整,以试图获得更高的分类精度。



