CS231N--图像分类总结

图像分类总结

  • 所谓的图像分类就是将图像集作为输入,用已有的”分类方法“将输入的图像进行”标注“(也就是分类)

  • 在计算机中图片就是许多个数字组成的数组,也就是将一个图片映射为一个数组,将该数组标注上输入图片的标签,本课程中是用三维数组来表示一个图片 的 (宽X高X3,其中3代表红,绿,蓝)

  • 在上次课程中老师也指出了各种干扰因素,例如:遮挡物、背景、角度等条件,计算机是很难分辨的

  • 数学驱动方法

    也就是让机器向人一样学习,给定一些数据集,训练机器识别图片

    于是有了下边的分类流程

    • 输入
    • 学习
    • 评价
  • 分类器

    • Nearest Neighbor分类器

    只找一个像素最相近的图片将其归类

    • k-Nearest Neighbor

    找最相似的k个图片将图片归类

    k值通过调优来选择,这里通过部分测试集调优

Lecture3

Loss functions and Optimization

线性分类

  • 线性分类器

    f(xi,W,b)=Wxi+b

    上述公式中,假设每个图像数据都被拉长为一个长度为D的列向量,大小为[D*1] ( xi 表示第i个图像的所有像素信息) ,其中大小为[K * D]的矩阵W和大小为[K * 1] 的列向量b为该函数的参数。

    W 称为权重

    b称为偏差向量

  • 给定的 (xi,yi) 是给定不变的,但是参数w和b可以改变,通过设置这些参数,使最终的测试情况和训练时的真实情况相近

  • eg:

    3个分类(红色代表猫,绿色代表狗,蓝色代表船),该例子忽略RGB通道

    这里假设图像只有四个像素,将所有的像素映射到一各列向量上,也就是 xi

    与W相乘后加b,图中最后的结果是图像为一只狗,因此该W、b的值并不准确,需要调整。

  • 偏差和权重合并

损失函数

​ 该函数能够根据分类评分和训练集图像数据实际分类的一致性,衡量某个具体参数集的质量好坏。

​ 损失函数有多种版本和不同的实现方式

​ 如果根据参数集做出来的分类预测与真实情况比较一致,那么计算出来的损失函数值就很低

SVM损失函数

Li=jyimax(0,sjsyi+1)

通过给定的训练集可以计算出训练样本的损失值

def L_i_vectorized(x,y,W):
    scores = W.dot(x)
    margin = np.maximum(0, scores - scores[y] + 1)
    margins[y] = 0
    loss_i = np.sum(margins)
    return loss_i

Softmax Classifier

Softmax的输出(归一化的分类概率)更加直观

函数映射公式保持不变,与SVM相同

但将这些评分值视为每个分类的未归一化的对数概率,并将折叶损失替换为交叉熵损失

Li=log(esyijesj)

fj(z)=ezjkezk 称为softmax函数

输入值为一个向量,向量中元素为任意实数的评分值,函数对其进行压缩,输出一个向量,其中每个元素值在0~1之间,且所有元素和为1

SVM vs. Softmax

两个分类器计算了相同的分值向量,但是SVM将分值向量看作分类评分,Softmax将这些数值看作对数概率

SVM分类器更加直观

损失函数可视化

​ 损失函数一般都定义在高纬度的空间中,因此为了让其可视化,可以将高维空间在一个维度或者两个维度的方向上进行切片,从而得到如下图所示的可视化损失函数

可以将其视为热力图,越靠近红色表示损失值越大,反之,越靠近蓝色表示损失值越小

最优化

​ 寻找能使得损失函数值最小化的参数W的过程

  • 初始方案

    随机搜索,也就是随机尝试不同的权重,看哪个效果最好

    bestloss = float("inf")
    for num in xrange(1000):
    W = np.random.randn(10, 3073) * 0.0001
    loss = L(X_train, Y_train, W)
    if loss < bestloss:
        bestloss = loss
        bestW = W
    print ('in attempt %d the loss was %f,best %f' % (num, loss, bestloss)) 

    通过尝试得出效果最佳的权重用来跑测试集

    scores = Wbest.do(Xte_cols)
    Yte_predict = np.argmax(scores, axis = 0)
    np.mean(Yte_predict == Yte)
  • 迭代优化

    从随机搜索开始,迭代器有

  • 跟随梯度

    计算出最陡峭的方向,该方向就是损失函数的梯度

    但是此时又应该考虑步长,这也是其中一个重要的超参数

梯度下降

while True:
    weights_grad = evaluate_gradient(loss_fun, data, weights)
    weights += - step_size * weights_grad
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值