学习:

数据驱动方法

一张图像在计算机的眼中就是一堆数字矩阵,大小为长x宽x通道数,其中每个数字在0~255之间代表像素。
图像即训练数据,而在分类任务中,图像的种类即label标签。
图像分类存在的问题与挑战:角度,光照,形变和遮挡,图片背景混乱,类内差异等

过去的尝试:
硬编码:计算图像边缘然后将边角进行分类,然后写一些规则对猫进行分类

现在:数据驱动方法(比深度学习更加广义):

  1. 收集大量的图片和标签数据集
  2. 使用机器学习来训练一个分类器
  3. 在新的图片上对分类器进行评估CIFAR-10数据集:
    拥有10种类别(:airplane:, :car:,:bird:,:cat:, :deer:, :dog:, :frog:, :horse:, :ship:, :truck:)
    5w训练图片,1w测试图片

距离度量方法:

L1范数:$ d_1 (I_1, I_2) = \sum_p \lvert I_1^p - I_2^P\rvert$

L2范数:$d_2(I_1, I_2 = \sqrt{\sum_p(I_1^p - I_2^p)^2}$

L1范数取决于你选择的坐标系统,当你转动坐标系统时将会改变它们之间的L1距离,而L2范式不会受此影响
因此,如果你输入的特征向量中的值对你的任务有一些重要的意义,则L1更适合一些
而对于比较通用的向量而言,L2会更自然一些

在实际演示中,分别使用L1,L2范数的结果中,L1的结果更受坐标轴的影响,而L2中只需要将坐标轴放在较为自然的地方即可

K-NN: K-最近邻算法

NN算法复杂度:
训练时O(1), 预测时O(N)
缺点:

  1. 实用中由于部署设备不同,我们更希望分类器在预测时快,训练时慢是可以的
  2. 最邻近算法根据最近的点来计算决策边缘,这非常容易受到噪声等因素的影响

NN与KNN的区别:
KNN会投票与其最近的多个点,从而使得周围的决策边缘变得平滑,即对噪声产生更大的鲁棒性。

设置超参数

分别提到四种想法:

  1. 使用在数据集中准确率最好的超参数

    这样是不行的,因为会造成严重的过拟合,面对未知数据的性能会非常差

  2. 将数据分割成训练和测试集,并使用在测试集中性能最好的超参数

    这样也是不好的,因为这样的超参数容易使分类器只在测试集中性能良好

  3. 将数据分成训练集,验证集和测试集,使用多组超参数在训练集中运行,并在验证集上进行验证, 并且使用在验证集中表现最好的,放入测试集中运行,看看效果(要保证验证集和测试集完全分隔)

    这样得到的数据才是应该写入报告的测试结果,才能展现出训练的算法在未知数据中的表现

  4. 交叉验证法:(小数据集中常见),将数据集分成多个小份,每次换超参数时使用不同的一份作为验证集

KNN算法在图像分类中很少用到的原因:

  1. 它在测试时运算时间较长,与我们的需求不符

  2. L1,L2范数的衡量标准建立在向量上的距离函数不太适合表示图像视觉上的相似度

    例子中分别遮挡,平移和改变颜色了图片后,L2范数值不变,所以并不是很适合用于表示图像之间视觉感知的差异

  3. 维度灾难,KNN算法需要的数据分布较为密集,这就对数据集的要求较高,对于图片而言就需要图片的数量较多,当分布处于较高维度时需要的样本量呈指数倍增长

作业:

1. 图像分类数据和label分别是什么,图像分类存在的问题与挑战

一张图像在计算机的眼中就是一堆数字矩阵,大小为长*宽*通道数,其中每个数字在0~255之间代表像素。
图像即训练数据,而在分类任务中,图像的种类即label标签。
图像分类存在的问题与挑战:角度,光照,形变和遮挡,图片背景混乱,类内差异等

2. 使用python加载一张彩色图片,观察像素值

图片原图为:

import matplotlib.pyplot as plt
img_v = plt.imread('prettygirl.jpg')
plt.imshow(img_v)
print(img_v)

像素值全为0~255的整数值,并且坐标相邻的值容易相等

3. L1范数,L2范数数学表达式,这两种度量分别适用于什么情况

L1范数d1(I1,I2)=pI1pI2P d_1 (I_1, I_2) = \sum_p \lvert I_1^p - I_2^P\rvert

L2范数d2(I1,I2=p(I1pI2p)2d_2(I_1, I_2 = \sqrt{\sum_p(I_1^p - I_2^p)^2}

L1范数取决于你选择的坐标系统,当你转动坐标系统时将会改变它们之间的L1距离,而L2范式不会受此影响
因此,如果你输入的特征向量中的值对你的任务有一些重要的意义,则L1更适合一些
而对于比较通用的向量而言,L2会更自然一些

4. 描述近邻算法KNN, NN算法的复杂度,为什么很少在图像中使用,以及它存在的问题

NN算法复杂度:
训练时O(1), 预测时O(N)

NN与KNN的区别:
KNN会投票与其最近的多个点,从而使得周围的决策边缘变得平滑,即对噪声产生更大的鲁棒性。

KNN算法在图像分类中很少用到的原因:

  1. 它在测试时运算时间较长,与我们的需求不符

  2. L1,L2范数的衡量标准建立在向量上的距离函数不太适合表示图像视觉上的相似度

    例子中分别遮挡,平移和改变颜色了图片后,L2范数值不变,所以并不是很适合用于表示图像之间视觉感知的差异

  3. 维度灾难,KNN算法需要的数据分布较为密集,这就对数据集的要求较高,对于图片而言就需要图片的数量较多,当分布处于较高维度时需要的样本量呈指数倍增长

5. 了解cifar-10数据集

CIFAR-10数据集:
拥有10种类别(:airplane:, :car:,:bird:,:cat:, :deer:, :dog:, :frog:, :horse:, :ship:, :truck:)
5w训练图片,1w测试图片

6. 超参数怎么选择合适(数据集如何划分)

分别提到四种想法:

  1. 使用在数据集中准确率最好的超参数

    这样是不行的,因为会造成严重的过拟合,面对未知数据的性能会非常差

  2. 将数据分割成训练和测试集,并使用在测试集中性能最好的超参数

    这样也是不好的,因为这样的超参数容易使分类器只在测试集中性能良好

  3. 将数据分成训练集,验证集和测试集,使用多组超参数在训练集中运行,并在验证集上进行验证, 并且使用在验证集中表现最好的,放入测试集中运行,看看效果(要保证验证集和测试集完全分隔)

    这样得到的数据才是应该写入报告的测试结果,才能展现出训练的算法在未知数据中的表现

  4. 交叉验证法:(小数据集中常见),将数据集分成多个小份,每次换超参数时使用不同的一份作为验证集