1. 理解基础图像分类、数据驱动方法和流程
understand the basic Image Classification pipeline and the data-driven approach (train/predict stages)
1.1 图像分类(Image Classification)
图像分类问题,即输入一张图像,将图像从已有分类中,进行分类,给出分类标签
计算机看到的图像和人所看到的图像是不一样的,计算机看到的只是一连串的数据
一张图片,在计算机里表示为一个三维数组(长、高、三个颜色通道RGB)
计算机视觉算法在图像识别方面的困难:
- 视角变化 (Viewpoint variation): 同一个物体,摄像机从不同角度观察到是不一样的表现
- 大小变化 (Scale variation): 物体可视大小会变化
- 形变 (Deformation): 很多物体的形状会改变
- 遮挡 (Occlusion): 物体可能会被遮挡,只有一小部分可见(可能只有几个像素)
- 光线条件 (Illumination conditions): 光照对像素的影响很大
- 背景干扰 (Background clutter): 背景会影响辨认物体
- 类内差异 (Intra-class variation): 同一类物体之间也会有很大的差异
1.2 数据驱动方法(data-driven approach)
- 收集大量图像数据,并将图像数据分好类
- 使用机器学习去训练图像分类器
- 使用测试图像去评估图像分类器
代码中有两个部分,训练和预测:
def train (train_images, train_labels):
return model
def predict (model, test_images)
return test_labels
2. 理解如何分割训练集得到验证集,来对超参数调优
understand the train/val/test splits and the use of validation data for hyperparameter tuning.
先通过Nearest Neighbor分类器来得到超参数的概念
2.1 Nearest Neighbor分类器
为了不用费劲去找到大量的图片并对其分类,使用一个图像分类数据集:CIFAR-10
CIFAR-10数据集中有60000张32*32的图像,每张图像属于10种分类标签的一种,分为50000张训练集和10000张测试集
Nearest Neighbor算法会用测试图片和训练集中每一张图片去比较,选择最相似的那张训练集中的图片的标签作为自己的标签
比较方法: 将 长32 高32 颜色通道为3 的像素块逐个比较,将差异值加起来
2.2 距离选择
逐个像素块比较有很多方法:
- L1距离(Mangattan distance):
d_1(I_1,I_2) = \sum_p |I_1^p-I_2^p|
即取每个像素差值的绝对值之和
- L2距离 (Euclidean distance):
d_2(I_1,I_2) = \sqrt{\sum_p (I_1^p-I_2^p)^2}
即取每个像素差值平方的和再开方
2.3 k-Nearest Neighbor分类器
刚才Nearest Neighbor分类器只用最相似的一张图片的标签作为测试图像的标签,如果选出k张与测试图像最相近的训练集中图像,选择当中标签最多的,便是k-Nearest Neighbor分类器
k-Nearest Neighbor分类器的抗干扰性更好,使测试更泛化,但是如何选择k值?
到底是选择3张最近似图像,还是5张,7张
2.4 超参数调优
==类似L1、L2、k这些参数,称为超参数==
我们需要得到使算法性能更加良好的超参数,则需要来调整超参数
首先规定一点:不能用测试集来调优,如果使用测试集调优,算法实际的应用便不能达到预期效果
选取验证集:
- 可以从训练集中分出一部分作为验证集,比如50000张训练集分成49000张训练集和1000张验证集
- 如果训练集数量较小,还可以使用交叉验证方法,把训练集平分成5份,4份用来训练,1份用来验证,循环测试5次取平均值
3. 使用numpy库来写高效的向量化代码
develop proficiency in writing efficient vectorized code with numpy
4. 实现一个(kNN)分类器
implement and apply a k-Nearest Neighbor (kNN) classifier
- 包含相关库
import random
import numpy as np
import matplotlib.pyplot as plt
from six.moves import cPickle as pickle
import os
import platform
- 读出训练集和测试集工具函数
def load_pickle(f):
version = platform.python_version_tuple() #将当前python版本输出成一个元祖 3.6.3 = ('3', '6', '3')
if version[0] == '2