desc | |
矩阵计算 |
要开始逐步 去尝试接收矩阵计算
在逻辑等价上,矩阵计算 与 for循环 是等价的
for 循环是矩阵运算的标量化,是低效的
高效计算的基础是大量使用矩阵运算
|
规范你的编程 |
1. 用库来规范自己的科学计算行为,你用的矩阵操作,在 numpy scipy 上都有
2. 用库来规范你的预处理,preprocess
3. 用库来规范你的文本预处理 nltk
这体现你的工程能力,规范能力
而不是 没有图谱路线的,乱操作,没有章法,重复coding
这也可以理解为 data process 中的 框架,就像 UI 中的框架
|
列表推导式 |
list comprehension
dict comprehension
即:[x for x in a if x%2==0]
即:[x:x**2 for x in a if x%2==0]
评价:python处理字符简直就是神器
|
model 中 损失函数的地位 |
不同的model 本质 就是不同的损失函数 【观点】
以为 数据预处理完毕以后,直接用的是 损失函数,而不是model的过程,那个是 推导出来的,即上的只有 损失函数,损失函数 stand for the model
|
图像相似度匹配的传统方法 |
图像分类下有一个KNN算法(较简单的),可以用来分类,对其改进的有ANN(近似最近邻)
因为KNN 需要存储 N个样本的feature vector,而且计算量 也是 (全连接图)
ANN 使得 KNN 工业可用,即:计算速度、内存等降低了
ANN 可以海量了,是 KNN的 拓展,可以视为 工业化的 KNN
基于KNN 的图像相似度匹配:(K=1)
其基本思路就是 直接计算两个 矩阵的差,使用的是 曼哈顿距离,即 直接element-wise 的差的绝对值相加 作为 cost,而这种方法不涉及 梯度下降,直接在 像素上面操作,计算量很大,是最 naive 的不用 神经网络的图像匹配了
# 谢文奇的那个 100个国家的国旗的方法,就可以用这个,唯一的门槛 就是把 image 导出成数组
opencv+numpy直接把图片导出成数组了
基于KNN 的图像分类:
每一次都是用测试集的一张图片去比对训练集中每一张图片,以曼哈顿距离为例:
将输入图片和训练图片之间像素值做差,得到整张图上图片之间的像素差值的总和。
这样对差值进行排序,找到N个最小值,看看这N个最小值中那个类所占的数量最多。
就判断输入的图像时那一类。
基本思路都是:像素置信率
这个依据图像像素的识别的角度就是:将像素进行统计得到一个置信率。根据置信率判断物体属于哪种
后来,图像识别领域有了人工特征:SIFT、HOG,gist 等特征,
将特征扔到SVM等分类器中
如果是操作像素的话,图片拉成为一维向量再操作的
如果图像的size 不一样,要做 rescale,这也是预处理的过程,使其大小一样
|
图像处理的一些观点 |
what computer see is not human see
电脑看到的是数字,而且很离散 256位,而人看到但是颜色
其实能用数字代表颜色,这个逻辑是对的,但是太离散的,毕竟人识别不了那么多的的颜色
也就是说:人因为有color,忽略了微小的差异,从而提高的物体的识别率
所以 做图像需要做 白化, 这个需要仿照学习下人的特点
|
寒老师做过的 |
做过:
·1min 内 百万级图像 的前1000张 相似度篇
·推荐
·RNN generate 郭敬明的文本 和 linux Kernel code
·应该做过 CTR
|
图像识别领域的困难 |
1. 视角不同,不同的角度看到的像素是不同的,增大了难度
而你的 识别就是基于 像素的
2. 尺寸的不同、光影的不同,像素分布也不同
所以在选择特征时要选择对光照不敏感的特征,提高特征的鲁棒性
|
KNN 中的K |
是超参数,需要设定
对一份数据集和测试集划分后,还需要对训练集再次划分。
比方说5部分,我们要用KNN建模,K的选择我们需要找个办法来判定,这里用N折交叉验证来判定,比方说我们选N=5,我们可以轮番用4折做训练,第五折做交叉验证,对五个准确率取平均,
看K取多少的时候准确率最高就可以选几。
knn kmeans 中 k 都是参数
聚为几类,可以立解为:议会的席数
|
线性分类器 |
一定有一个得分函数
根据打分函数判断最终属于哪一类,或者排序 等等
LR linearSVM softmax(log 线性)
|
caffe |
caffee zoo 就是 很多 pre train
特点是:几乎只需写配置文件,跑一跑别人的模型很容易
它建立了自己的 pre train 的 生态圈,这个是 caffe 的高明之处
但是 屏蔽了原理,对于搞研究不适合,即 定制化不强
工程或者是跑别人的结果试试什么的,这个caffe确实挺方便的。
整理
caffe 编译的资料
caffe 的ipython notebook
|
梯度分类 |
数值梯度,解析梯度
寒老师的经验:解析梯度,最好自己在小数据集上,验证一下,因为 不一定求导对了
|
Wx的另类观点 |
W 的每一行都可以视为一个 模板
因为 最后要分为积累,W 就有几行,所以W 的行数就是 类别数
而每一行相当于 本类的 模板,与它相乘后 就是这个模板类别下的分值
然后 argmax
寒老师 还做的就是:将各个 模板 也给 可视化了一下
note
1. 图像拉成列向量
2. 权重矩阵W 的每行对应每一类的模板
3. 截距项b维度和最后分类个数一致
|
合页损失函数 |
本质是一个分段函数,所以才叫做 hinge,合页,即:
对于每一个样本的预测:
即:如果 f(xi, W)j +delta 的值,它敢比 f(xi, W)yi 的值大,那么就要惩罚它,即 计入loss 当中
这是 损失的含义,如果大不过f(xi,W)yi,那么cost 就是0
而 SVM 当中的 合页损失函数
此时的 delta 是1,即:其实还是用的是感知机的损失函数,如果分类对了 y(wx+b) 为正,否则为负
那么 如果分类分错了,那么: -y(wx+b) 为正,那么应该计入为惩罚
而delta 就是这里 想要超第二名多远,就是 如果是 -0.5,也不行,也就是态度不明确,一起惩罚
只有态度明确,界线足够远才 不惩罚
而感知机的损失函数是:
即:分类正确奖励,分类错误惩罚
summary,感觉
合页损失函数就是:分类错误惩罚,分类正确不奖励不惩罚,而且离界限区要足够远
是一个严厉的Judge
|
softmax 的损失函数 |
第一种解释就是 MLE:
,即只管 正确分类的概率,让它最大化
第二种解释 就是交叉熵的思想:对于每一个样本
(1)第一种理解最直接就是 -log 损失函数,里面应该是 MLE值
(2)第二种就是交叉熵,即 Σplog(p/q)
因为 只属于一类,tag 是 a =[1, 0, 0, 0] ,pred 是 b = [0.1, 0.5, 0.2, 0.2]
Σai*log(ai/bi)
=1*log*(1/bi)
= - log(bi)
工业上的tech,即尽量不要做除法,取log 了就可以避免除法操作,即:
将损失函数改成这个样子:
工业上还有一个tech,防止log 内为0
|