K-Nearest Neighbor在图像处理的几个问题
1 欧式距离不能处理Boxed Shifttd Tinted
2 Curse of dimensionality维度灾难
¥
支付方式
请使用微信扫一扫 扫描二维码支付
请使用支付宝扫一扫 扫描二维码支付
K-Nearest Neighbor在图像处理的几个问题
1 欧式距离不能处理Boxed Shifttd Tinted
2 Curse of dimensionality维度灾难
http://cs.standard.edu/people/karpathy/convnetjs/demo/cifar10.html
记号:
X输入样本 32*32*3 = 10*3072
F 10*1
W权重 Parameters, Weights 3072*1
线性是指的是单层神经网络,而不是真的线性,在图像中提取了背景虚化的类别,RGB的区分
改变坐标轴会改变L1
但是 不会L2
L1:在各个坐标有个实际意义时候表现更好
k是超参数 是学不到的
不能总是调整 超参数 使得训练结果最好
也不能使得验证结果最好
也就是你不不能瞎几把调
还有一种方法:交叉验证(小数据集中使用)
把训练集分成4组,交叉验证
knn分类局限性:1、就是用数据将把样本空间分成几块
如果维度太高,那数据太少肯定不行,数据必
须密集
2、L1 L2距离并不能真实地反应两张图的差别
Piazza
Google Calidate
Google Cloud
CV的挑战:
1IIIumination
2 Deformation
3 Occlusion
4 Clutter
5 Instraclass Variation
线性分类学习图片在一个高维空间线性决策边界问题,高维空间对应了图片能取到的像素密度值
数据驱动方法
交叉验证
SVM Loss Function: Hinge Loss
Sum(Max(0, Sj - Sy+1))
Sj 是预测的分数
强化学习的优化方式类似SVM,只关注正确分类的分数,而且不需要分数是否可导
Loss Fuction的意义:
量化不同的错误到底有多坏,模型不再范类似的错误
奥卡姆剃须刀:选择最简单的
通过分析SVM损失函数,来解释其他所有的损失函数
# Double check taht the loss is reasonable: def init_two_layer_model(input_size,hidden_size,output_size): # initialize a model model={} model['W1']=0.0001*np.random.randn(input_size,hidden_size) model['b1']=np.zeros(hidden_size) model['W2']=0.0001*np.random.randn(hidden_size,output_size) model['b2']=np.zeros(output_size) return model model=init_two_layer_model(32*32*3,50,10) #input size,hidden size,number of classes loss,grad=two_layer_net(X_train,model,y_train,0.0) # 0.0 denotes disable regularization print loss """ 如果我们加上了正则项,loss会变大一点,这是完整性 """ """ 往往需要先确保可以过拟合非常小部分的训练数据""" model=init_two_layer_model(32*32*3,50,10) # trainer=ClassfierTrain() X_tiny=x_train[:20] # take examples y_tiny=y_train[:20] best_model,stats=trainer.train(X_tiny,y_tiny,X_tiny,y_tiny, model,two_layer_net, num_epochs=200,reg=0.0, updat='sgd',learning_rate_decay=1, sample_batchs=False, learning_rate=1e-3,verbose=True)
1. loss not going down:
learning rate too low
2. 即使损失没怎么变化,但正确率却很快上升到了20%,为什么?
虽然这里的分布依然很分散,因为我们的损失项很接近,但是当我们移动这些分布时,都朝着正确的方向在轻微的移动,我们的权重参数在朝着正确的方向改变,现在准确率可能发生突变,因为我们正选取最大的准确率,所以准确率会得到一个很大的提升,虽然损失还是很分散。
3.loss exploding:
learning rate too high
1.我们想要找到与最小损失对应的参数W,我们想要最小化损失函数,为了做到这一点,我们就要找到L在W方向上的梯度
2.反向传播技术递归的调用链式法则来计算图中的每个变量的梯度,当我们涉及非常复杂的函数时,这些方法就很有用
3.相对于节点的输入,我们也可以计算出他们相对应的梯度是节点的直接输出,我们来看看在反向传播算法中发生了什么,我们从图的后面开始,然后使用我们的方法从最后的地方一直到开始的地方,当我们到达每一个节点时,每一个节点都会得到一个从上游返回的梯度,这个梯度是对这个节点的输出的求导,等到我们在反向传播到达这个节点时,我们就计算出了最终损失L关于z的梯度
4.ppt中绿色的数字是前向传播的结果,红色的是反向传播得到的梯度值,链式法则告诉我们梯度等于上游梯度值乘以本地梯度值(就是该节点的导数)当我们遇到加法运算的节点时,加法运算中对每个输入的梯度正好是1.当我们遇到乘法节点时,这种节点对于某一输入的梯度值,恰好是另一输入的值
5.max门:可以想象成一个梯度路由器,加法节点回传相同的梯度给进来的两个分支,max门将获取梯度,并且将其路由到它其中的一个分支,因为如果我们查看前向传递,可以看到只有最大值能被传递到计算图的剩余部分,所以只有这个最大值真正影响到我们函数计算的唯一值
6.在本次课程中谈到的是如何在我们的函数中计算对于任何变量的梯度,然后我们一旦得到了这些梯度,我们就可以将我们刚才所学到的知识应用到上一节关于优化的课里面,在给定的梯度的情况下,我们沿着梯度方向上前进一步,就可以更新我们的权重,也就是我们的参数
7.PPT中的例子:首先输入一个含有4096个元素的输入,中间的运算节点是对每个元素求最大值的运算,我们要求的f是x中每个元素和0之间的最大值,最后的输出也是一个包含4096元素的向量
8.雅克比矩阵:每一行都是偏导数,矩阵的每一个元素,是输出向量的每个元素对输入向量每个元素分别求偏导的过程,这个矩阵是4096*4096,他是一个对角矩阵,因为是对每个元素的分别运算,比如输入里的第一个元素只和输出的第一个元素有联系,所以我们并不需要把整个矩阵全部写出来,我们只需要求输出向量关于x的偏导,然后把结果作为梯度填进去
9.向量的梯度总是和原向量保持相同的大小,每个梯度的元素代表着这个特定元素对最终函数影响的大小
10.总结:当你使用神经网络时,它们都将会非常的庞大和复杂,将所有参数的梯度公式写下来是不现实的,所以为了得到这些梯度,应该使用反向传播,而且,这算是神经网络的其中一个核心技术,就是用反向传播来计算参数梯度. 计算和图表结构都非常真实,每个节点也都实际存在,所以正推时,我们希望得到计算结果,并存储所有将会在后面的地图计算中用到的中间值,然后在反向计算中,我们使用链式法则,使用上游梯度,将它与本地梯度相乘,计算在输出节点方向上的梯度,然后将它传递给下一个连接的节点