一、基础概念
1、监督学习、非监督学习、半监督学习和弱监督学习
监督学习:
1)监督学习是使用已知正确答案的示例来训练网络。一直数据和其一一对应的标签,训练一个智能算法,将输入数据映射到标签的过程。
2)监督式学习的常见应用场景如分类问题和回归问题。
3)常见的算法有逻辑回归(Logistic Regression)和反向传播神经网络(Back Propagation Neural Network)。
非(无)监督学习:
1)在非监督式学习中,数据并不被特别标识,适用于你具有数据集但无标签的情况。学习模型是为了推断出数据的一些内在结构。
2)常见的应用场景包括关联规则的学习以及聚类等。
3)常见算法包括 Apriori 算法以及 k-Means 算法。
监督与非监督详细对比:
在实际工作中,我们经常会遇到这样一类问题:给机器输入大量的特征数
据,并期望机器通过学习找到数据中存在的某种共性特征或者结构,亦或是数据之间存在的某种关联。例如,视频网站根据用户的观看行为对用户进行分组从而建立不同的推荐策略,或是寻找视频播放是否流畅与用户是否退订之间的关系等。这类问题被称作“非监督学习”问题,它并不是像监督学习那样希望预测某种输出结果。
相比于监督学习,非监督学习的输入数据没有标签信息,需要通过算法模型
来挖掘数据内在的结构和模式。非监督学习主要包含两大类学习方法:数据聚类和特征变量关联。其中,聚类算法往往是通过多次迭代来找到数据的最优分割,而特征变量关联则是利用各种相关性分析方法来找到变量之间的关系。
半监督式学习:
1)在此学习方式下,输入数据部分被标记,部分没有被标记,这种学习模型可以用来进行预测。
2)应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,通过对已标记数据建模,在此基础上,对未标记数据进行预测。
3)常见算法如图论推理算法(Graph Inference)或者拉普拉斯支持向量机(Laplacian SVM)等。
弱监督学习
1)弱监督学习可以看做是有多个标记的数据集合,次集合可以是空集,单个元素,或包含多种情况(没有标记,有一个标记,和有多个标记)的多个元素。
2)数据集的标签是不可靠的,这里的不可靠可以是标记不正确,多种标记,标记不充分,局部标记等。
3)已知数据和其一一对应的弱标签,训练一个智能算法,将输入数据映射到一组更强的标签的过程。标签的强弱指的是标签蕴含的信息量的多少,比如相对于分割的标签来说,分类的标签就是弱标签。
分类与回归的评价指标
一、分类算法
1、常用术语
1)True positives(TP): 被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数(样本数);
2)False positives(FP): 被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数;
3)False negatives(FN):被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数;
4)True negatives(TN): 被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。
2、评价指标:
1)正确率(accuracy)
正确率是我们最常见的评价指标,accuracy = (TP+TN)/(P+N),正确率是被分对的样本数在所有样本数中的占比,通常来说,正确率越高,分类器越好。
2)错误率(error rate)
错误率则与正确率相反,描述被分类器错分的比例,
error rate =(FP+FN)/(P+N),对某一个实例来说,分对与分错是互斥事件,所以 accuracy =1 - error rate。
3)灵敏度(sensitive)
sensitive = TP/P,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力。
4)特效度(specificity)
specificity = TN/N,表示的是所有负例中被分对的比例,衡量了分类器对负例的识别能力。
5)准确率(precision)
准确率(精度)是精确性的度量,表示被分为正例的示例中实际为正例的比例,precision=TP(/ TP+FP)。
6)召回率(recall)
召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN)=TP/P=sensitive,可以看到召回率与灵敏度是一样的。
7)其他评价指标
计算速度:分类器训练和预测需要的时间;
鲁棒性:处理缺失值和异常值的能力;
可扩展性:处理大数据集的能力;
可解释性:分类器的预测标准的可理解性,像决策树产生的规则就是很容易理解的,而神经网络的一堆参数就不好理解,我们只好把它看成一个黑盒子。
8)查准率和查全率反映了分类器分类性能的两个方面。如果综合考虑查准率与查全率,
可以得到新的评价指标 F1 测试值,也称为综合分类率:
为了综合多个类别的分类情况,评测系统整体性能,经常采用的还有微平均 F1(micro-averaging)和宏平均 F1(macro-averaging )两种指标。宏平均 F1 与微平均 F1 是以两种不同的平均方式求的全局的 F1 指标。其中宏平均 F1 的计算方法先对每个类别单独计算F1 值,再取这些 F1 值的算术平均值作为全局指标。而微平均 F1 的计算方法是先累加计算各个类别的 a、b、c、d 的值,再由这些值求出 F1 值。由两种平均 F1 的计算方式不难看出,宏平均 F1 平等对待每一个类别,所以它的值主要受到稀有类别的影响,而微平均F1 平等考虑文档集中的每一个文档,所以它的值受到常见类别的影响比较大。
二、检测算法
1、概述
在检测算法中,主要通过准确率(也称查准率)和召回率(也称查全率)及mAP来作为评价指标
2、mAP
mAP是目标检测和分类中的常用指标,即综合了检测(位置准不准)+分类(分类准不准)的一个评估指标。其中mAP中的AP即各类别下的精确率(纵轴)和召回率(横轴)的曲线下的面积,即不同召回率值下的所有精确率的平均。最后mAP中m指的是每个类别都计算出了AP后的在一次平均。
即AP 是计算某一类 P-R 曲线下的面积,mAP 则是计算所有类别 P-R 曲线下面积的平均值。
详情参照链接:mAP计算
二、深度学习模型
1、人脸识别的计算流程
主要流程: 图像采集、人脸检测、图像质量评估、活体检测(可选) 、特征提取以及特征比对。
图像采集: 获取单或者多的图像数据供人脸识别系统使用,该流程一般由摄像头模组完成(RGB摄像头、红外摄像头或者3D摄像头等)。
人脸检测: 从摄像头采集的图像数据中检测人脸的位置,如果有多个人脸,一般选定面积最大的人脸作为目标人脸(也有一些安防类人脸识别系统,支持同时追踪识别多个人脸)。
**图像质量评估:**对目标人脸进行分析,得出如人脸倾斜、旋转角度、面部遮挡比例、模糊程度等参数,综合判定该张图片是否适合进行人脸特征提取,
**活体检测(可选)😗*判定目标人脸是活体,而非其他伪装。一般在金融支付或者安防门禁等无人值守场合,用于防止攻击者使用照片、视频甚至面具头套等方式来模拟他人欺骗人脸识别系统。
特征提取: 从目标人脸图像中提取人脸特征以供身份比对使用。通常是将该图像通过一个神经网络从而提取出特征值。
**特征比对:**一般分为1:1和1:N两种情况。1:1是判定目标人脸的特征与指定人脸的特征是否为同人。1:N则是判定目标人脸特征是否是人脸数据库中N个不同人脸中的某一认。特征比对一般需要设置一个闯值,两个特征相似度超过该闯值,则判断为同一人,低于则不同人。
2、模型的参数保存方式与参数的读取与修改
参数保存
1)保存整个网络
torch.save(net, 'net.pkl') #保存所有网络模型参数
2)保存模型参数
torch.save(net.state_dict(), 'net_parameter.pkl') #保存优化选项默认字典,不保存网络结构
网络提取
1)整体网络提取
net1 = torch.load('net.pkl')
2)对于提取网络中的参数的方式,必须先完整的建立和需要提取的网络一样的结构的网络,再去提取参数进而恢复网络
net2 = torch.nn.Sequential(
nn.Linear(1,20),
torch .nn.ReLU(),
nn.Linear(20,29),
torch .nn.ReLU(),
nn.Linear(28,1)
)
net2.load state dict(torch.load('net parameter.pkl'))
3、常见的模型压缩方法
模型压缩背景:
模型压缩后,模型很小,进行推断的运算量小,利于在移动端部署。
诸如Bert等深度学习的参数太多了,模型太大了,消耗的计算资源过多,进一步加大了深度学习爱好者们的“贫富差距”,不够和谐。以Bert-large为例,训练一次需要64G显存的google TPU,按照每小时6.5美元的价格,1024块训练76分钟,总消耗:10246.5(76/60)=8430美金。一般人和公司真是玩不起。模型压缩领域的“有志之士”的终极目标是能够让“贫苦的深度学习爱好者”也玩得起,他们进行了一些列的研究,他们发现使用压缩后(更小的)模型也能够达到原始模型类似的效果。
1)模型蒸馏 Distillation,使用大模型的学到的知识训练小模型,从而让小模型具有大模型的泛化能力;
2)量化 Quantization,降低大模型的精度,减小模型;
3)剪枝 Pruning,去掉模型中作用比较小的连接;
4)参数共享,共享网络中部分参数,降低模型参数数量。
三、代码
1、字符串排序:将任意长度的字符串按字母顺序A-Z或a-z进行排序
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string AlphaSort(string line)
{
vector<string> alphabet(26);
string AlphaStr;
string SortedStr;
for (auto &c : line)
{
if (isalpha(c))
alphabet[tolower(c) - 'a'] += c;
}
for (auto &s : alphabet)
AlphaStr += s;
for (int i = 0, j = 0; i < line.size(); i++)
SortedStr += isalpha(line[i]) ? AlphaStr[j++] : line[i];
return SortedStr;
}
int main()
{
string line;
while(getline(cin, line))
{
cout << AlphaSort(line) << endl;
}
}
2、最大公约数与最小公倍数扩展
辗转相除法(欧几里德算法):
定理:两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数
参考:辗转相除法
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
// 辗转相除法求最大公约数
// 1.将较大的数放在a上
// 2.辗转相除
int gcd(int a, int b) {
int A = a > b ? a : b;
int B = b < a ? b : a;
while (B != 0) {
int r = A % B;
A = B;
B = r;
}
return A;
}
// 最小公倍数
// 两个数的最小公倍数就是两个数的乘积除最大公约数
int lcm(int a, int b)
{
int gcd_result = gcd(a,b);
return (a*b)/gcd_result;
}
int main(int argc, char** argv) {
cout<<"最大公约数"<<endl;
cout<<gcd(5,10)<<endl;
cout<<"最小公倍数"<<endl;
cout<<lcm(5,10);
return 0;
}