精华内容
下载资源
问答
  • 书接上文,我们实现了一个超轻量人脸检测和对齐算法并且...这里我们设计了一个大小仅仅999k人脸embedding模型将人脸embedding为128D向量。基于GhostNet模型修改而来,模型相对比较深而窄小,效果非常不错。 ...

    书接上文,我们实现了一个超轻量的人脸检测和对齐算法并且部署到android平台,那么如何进行人脸识别呢?

    目前较为常用的算法是对对齐后的人脸进行embedding成为高纬向量,例如facenet的128D或者cosface,arcface的512D向量。

    这里我们设计了一个大小仅仅999k的人脸embedding模型将人脸embedding为128D向量。基于GhostNet模型修改而来,模型相对比较深而窄小,效果非常不错。

    基本思想是基于基于facenet训练一个embedding的模型,然后通过计算向量的欧氏距离进行判断,android部署方式参看上文介绍。在晓龙855+速度大约30~40ms左右。

     

    展开全文
  • 在自然语言处理中,很多任务输入是变长文本序列,而传统分类器输入需要固定大小。因此,我们需要将变长文本序列表示成固定长度的向量。以句子为例,一个句子表示(也称为编码)可以看成是句子中所有词...

    1.33 基础模型

    在自然语言处理中,很多任务的输入是变长的文本序列,而传统分类器的输入需要固定大小。因此,我们需要将变长的文本序列表示成固定长度的向量。以句子为例,一个句子的表示(也称为编码)可以看成是句子中所有词的语义组合。因此,句子编码方法近两年也受到广泛关注。句子编码主要研究如何有效地从词嵌入通过不同方式的组合得到句子表示。其中,比较有代表性方法有四种。

    第一种是神经词袋模型,简单对文本序列中每个词嵌入进行平均,作为整个序列的表示。这种方法的缺点是丢失了词序信息。对于长文本,神经词袋模型比较有效。但是对于短文本,神经词袋模型很难捕获语义组合信息。

    第二种方法是递归神经网络,按照一个外部给定的拓扑结构(比如成分句法树),不断递归得到整个序列的表示[9] 。递归神经网络的一个缺点是需要给定一个拓扑结构来确定词和词之间的依赖关系,因此限制其使用范围。一种改进的方式引入门机制来自动学习拓扑结构[10] 。

    第三种是循环神经网络,将文本序列看作时间序列,不断更新,最后得到整个序列的表示。但是简单的循环神经网络存在长期依赖问题,不能有效利用长间隔的历史信息。因此,人们经常使用两个改进的模型:长短时记忆神经网络(LSTM) [11] 和基于门机制的循环单元(GRU) [12] 。

    第四种是卷积神经网络,通过多个卷积层和子采样层,最终得到一个固定长度的向量。在一般的深度学习方法中,因为输入是固定维数的,因此子采样层的大小和层数是固定的。为了能够处理变长的句子,一般采用两种方式。一种是层数固定,但是子采样的大小不固定。根据输入的长度和最终向量的维数来动态确定子采样层的大小[13] 。另外一种是将输入的句子通过加入零向量补齐到一个固定长度,然后利用固定大小的卷积网络来得到最终的向量表示[14] 。

    在上述四种基本方法的基础上,很多研究者综合这些方法的优点,提出了一些组合模型。Tai 等人[15]基于句法树的长短时记忆神经网络(Tree - LSTM), 将标准 LSTM 的时序结构改为语法树结构,在文本分类上得到非常好提升。Zhu 等人[16]提出了一种递归卷积神经网络模型,在递归神经网络的基础上引入卷积层和子采样层,这样更有效地提取特征组合,并且支持多叉树的拓扑结构。

    如果处理的对象是比句子更长的文本序列(比如篇章),为了降低模型复杂度,一般采用层次化的方法。先得到句子编码,然后以句子编码为输入,进一步得到篇章的编码。

    在上述模型中,循环神经网络因为非常适合处理文本序列,因此被广泛应用在很多自然语言处理任务上。

    展开全文
  • 领域上预训练,根据数据的大小,可以不用训练特别久。 环境 Environment Use Python3 + Tensorflow 1.x e.g. Tensorflow 1.4 or 1.5 下游任务 Fine-tuning on Downstream Task 使用TensorFlow: 以使用albert_...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    5.19 如何访问位于机器地址0处中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零空指针内部表示。 5.20运行时“nullpointerassignment”错误是什么意思?应该怎样捕捉它? 第6章 数组和指针...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.23 能否声明和传入数组大小一致局部数组,或者由其他参数指定大小的参数数组? 13 1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 ...
  • 5.19 如何访问位于机器地址0处中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零空指针内部表示。 62  5.20 运行时“null pointer assignment”错误是什么意思?应该怎样捕捉它? 62 第6章...
  • 并且是比较各分类概率大小,来决定分类。判别式模型:只需要计算y概率分布!需要从训练出模型中计算分类概率。关于判别式模型与生成式模型,请参考这篇文章求知鸟:关于统计学思考(3)作为一名励志成为技师我...

    朴素贝叶斯是一种生成式模型,不同于之前讲过的k-近邻,支持向量机,决策树等判别式模型。生成式模型:需要计算x,y的联合概率分布!并且是比较各分类概率大小,来决定分类。

    判别式模型:只需要计算y的概率分布!需要从训练出的模型中计算分类概率。

    关于判别式模型与生成式模型,请参考这篇文章求知鸟:关于统计学的思考(3)

    作为一名励志成为技师的我来说,当然不想被人嘲笑为”调包侠“,于是就有了接下来这篇文章:如何自编程实现朴素贝叶斯。

    本文内容如下:

    demo:

    原理公式

    算法实现

    实战:使用Python进行文本分类

    数据准备:从文本中构建词向量

    伪代码:从词向量计算概率

    算法实现

    原理公式

    贝叶斯原理解决了数学中的“逆向概率问题”,在这个基础上,人们设计出了贝叶斯分类器,朴素贝叶斯是贝叶斯分类中最简单的分类器,之所以称为朴素,是假设属性是相互独立的;而实际上,相互独立的属性在生活中是不存在的,这就会导致分类正确率降低,好在错误率并不高!朴素贝叶斯适应于离散性数据 ;

    高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布

    多项式朴素贝叶斯:特征变量是离散变量,符合多项分布

    伯努利朴素贝叶斯:特征变量是0,1分布

    有了朴素贝叶斯模型,还需要对模型进行求解,一是用极大似然估计进行求解

    一是用贝叶斯估计求解参数

    由于极大似然估计无法应对分母为0的情形,所以一般采用贝叶斯估计:公式1.1公式1.2公式1.3

    可能,你不了解上述公式代表的意义,没关系,接下来这张图片会帮你搭建起”积木中的全局视野“,这样就可以清晰的理解上述公式了:想要更清楚的了解,可以参考李航博士的《统计学习方法》

    或是之前写的一篇文章求知鸟:朴素贝叶斯分类:原理公式1.4

    等式左边是我们要求的后验概率,我们就依据这个后验值的比较,来进行分类;请注意:我用的关键字是:后验概率值的比较!比较就意味着有多个!

    等式右边:分母在分类中,不同类别的计算是一样的,既然没有区别,我们不care它,分子可以抽出两部分:

    对应着本文公式的1.2;

    对应1.1!

    算法实现

    先构建主函数

    import numpy as np

    import pandas as pd

    def main():

    X_train=np.array([

    [1,"S"],

    [1,"M"],

    [1,"M"],

    [1,"S"],

    [1,"S"],

    [2,"S"],

    [2,"M"],

    [2,"M"],

    [2,"L"],

    [2,"L"],

    [3,"L"],

    [3,"M"],

    [3,"M"],

    [3,"L"],

    [3,"L"]

    ])

    y_train=np.array([-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1])

    clf=NaiveBayes(lambda_=0.2)

    clf.fit(X_train,y_train)

    X_new=np.array([2,"S"])

    y_predict=clf.predict(X_new)

    print("{}被分类为:{}".format(X_new,y_predict))

    if __name__=="__main__":

    main()主函数中出现了训练样本集:输入特征与输出类别标签;

    还定义了测试样本集:输入特征X_new;(demo就取了一个样本)

    主函数还引用了类-实例中的方法进行分类预测。

    #定义朴素贝叶斯中的类-方法-实例

    class NaiveBayes():

    def __init__(self,lambda_): #变量的初始化

    self.lambda_=lambda_ #贝叶斯系数 取0时,即为极大似然估计

    self.y_types_count=None #y的(类型:数量)

    self.y_types_proba=None #y的(类型:概率)

    self.x_types_proba=dict() #(xi 的编号,xi的取值,y的类型):概率

    #对应公式1.1

    def fit(self,X_train,y_train):

    self.y_types=np.unique(y_train) #y的所有去除重复取值类型

    X=pd.DataFrame(X_train) #转化成pandas DataFrame数据格式,下同

    y=pd.DataFrame(y_train)

    # DataFrame数据结构,先从列开始,y[0]就是第一列;y的(类型:数量)统计:告诉你-1出现了9次,1出现了6次

    self.y_types_count=y[0].value_counts()

    # y的(类型:概率)计算

    self.y_types_proba=(self.y_types_count+self.lambda_)/(y.shape[0]+len(self.y_types)*self.lambda_)

    #对应公式1.2

    # (xi 的编号,xi的取值,y的类型):概率的计算

    for idx in X.columns: # 遍历X的列名0,1

    for j in self.y_types: # 选取每一个y的类型,-1,1

    p_x_y=X[(y==j).values][idx].value_counts() #选择所有y==j为真的数据点的第idx个特征的值,并对这些值进行(类型:数量)统计

    for i in p_x_y.index: #计算(xi 的编号,xi的取值,y的类型):概率;元组

    self.x_types_proba[(idx,i,j)]=(p_x_y[i]+self.lambda_)/(self.y_types_count[j]+p_x_y.shape[0]*self.lambda_)

    #对应公式1.3

    def predict(self,X_new):

    res=[] #空列表,可变数据

    for y in self.y_types: #遍历y的可能取值

    p_y=self.y_types_proba[y] #计算y的先验概率P(Y=ck),字典

    p_xy=1

    for idx,x in enumerate(X_new):

    p_xy*=self.x_types_proba[(idx,x,y)] #计算P(X=(x1,x2...xd)/Y=ck)

    res.append(p_y*p_xy)

    for i in range(len(self.y_types)):

    print("[{}]对应概率:{:.2%}".format(self.y_types[i],res[i]))

    #返回最大后验概率对应的y值

    return self.y_types[np.argmax(res)]数据结构可以参考这篇,求知鸟:Python科学计算:庖丁解牛之Pandas

    计算起来还是有点饶的,p_x_y=X[(y==j).values][idx].value_counts();这一行尤其难理解!

    我们先来看单个索引:

    df1 = pd.DataFrame( np.array([[1, 2, 3], [4, 2, 6],[7,8,9]]) )

    print(df1)

    print(df1[1])

    print(df1[1].value_counts)#对第二列统计出现次数

    print(df2[2:2])

    print(df1[2:2].value_counts)#不能对行统计出现次数

    print(df2[1][1].value_counts)#不能对索引值统计出现次数以上说明,value_counts()只能用在某列上,不能用在某行,某个具体值上!

    索引某个值,遵循[columns][index]的格式,可下面的功能显然不是!

    p_x_y=X[(y==j).values][idx].value_counts()

    idx可选项{0,1},循环遍历

    j的可选项{-1,1},循环遍历!

    y是[-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]

    当idx=0时

    当j=-1时,依次判断j==y,匹配上,统计第1列出现次数

    当j=1时,依次判断j==y;匹配上,统计第1列出现次数

    内层循环结束;

    外层循环idx=1时

    当j=-1时,依次判断j==y,匹配上,统计第2列出现次数

    当j=1时,依次判断j==y;匹配上,统计第2列出现次数

    打印结果如下:

    1 3

    2 2

    3 1

    Name: 0, dtype: int64

    3 4

    2 3

    1 2

    Name: 0, dtype: int64

    S 3

    M 2

    L 1

    Name: 1, dtype: int64

    M 4

    L 4

    S 1

    实战:使用Python进行文本分类

    从文本中构建词向量

    #创建了一个实验样本。返回的第一个变量是词条集合,第二个变量是类别标签(人工标注)

    def loadDataSet():

    postingList=[['my','dog','is','ugly'],['my','girlfriend', 'will', 'be','wd'],['the', 'day', 'is', 'garbage'],['tomorrow', 'will', 'be', 'sunny']]

    classVec=[1,0,1,0]

    return postingList,classVec

    #创建一个不重复出现词的列表

    def createVocabList(dataSet):

    vocabSet=set([])#创建一个无序不重复元素集

    for document in dataSet:

    vocabSet=vocabSet|set(document)#&交,|或,-差运算

    return list(vocabSet)

    def setOfWorlds2Vec(vocabList,inputSet):

    returnVec=[0]*len(vocabList)#创建一个和词汇表等长的全0向量

    for word in range(inputSet):#注意加range,否则报错TypeError: ‘int’ object is not iterable!

    if word in vocabList:

    returnVec[vocabList.index(word)]=1#如果出现了词汇表中的单词,则将输出文档向量中的值设为1

    else:

    print("the world :%s is not in my Vocabulary!" %word)

    return returnVec

    #检测下上述函数的运行效果

    listOPosts,listClasses=loadDataSet()

    myVocabList=createVocabList(listOPosts)

    print(myVocabList)

    print(setOfWorlds2Vec(myVocabList,listClasses[0]))def():要知道传入的是你的输入,要写进括号内,返回的是你想要的结果,用return!

    循环中使用的应该是一个数组:for word in range(inputSet):

    伪代码:从词向量计算概率

    计算每个类别中的文档数目

    对每篇训练文档:

    对每个类别:

    如果词条出现在文档中---》增加该词条的计数值

    增加所有词条的计数值

    对每个类别:

    对每个词条:

    将该词条的数目除以总词条数目得到条件概率

    返回每个类别的条件概率

    def trainNB0(trainMatrix,trainCategory): #传入参数:文档矩阵trainMatrix,和每篇文档类别标签所构成的向量trainCategory

    numTrainDocs=len(trainMatrix)

    numWords=len(trainMatrix[0])

    pAbusive=sum(trainCategory)/float(numTrainDocs)

    p0Deom=0.0

    plDemon=0.0

    for i in range(numTrainDocs):

    if trainCategory[i]==1:

    plNum+=trainMatrix[i]

    plDenom+=sum(trainMatrix[i])

    else:

    p0Num+=trainMatrix[i]

    p0Denom+=sum(trainMatrix[i])

    p1Vect=p1Num/p1Denom

    p0Vect=p0Num/p0Denom

    return p0Vect,p1Vect,pAbusive

    #加载数据

    listOPosts,listClasses=loadDataSet()

    myVocabList=createVocabList(listOPosts)

    #构建一个包含所有词的列表

    trainMat=[]

    for postinDoc in listOPosts:

    trainMat.append(setOfWorlds2Vec(myVocabList,postinDoc))

    p0V,p1V,pAb=trainNB0(trainMat,listClasses)还没仔细研究,感觉没有demo中的方法巧妙!

    总结:

    朴素贝叶斯算法原理:朴素贝叶斯提出是为了解决“逆向概率问题”---知道结果推原因举例:患癌症的概率是万分之一(先验概率),医院判断一个人是否得病的正确率是99.9%,误判的概率是0.1%;--条件概率(先验概率)

    如果一个人被查出来患有癌症,实际上患有的可能性有多大?---这就是求后验概率!

    用数学语言来讲:

    知道每个类别概率和各个属性下的条件概率,来求后验概率!

    朴素贝叶斯分类器的实现步骤:

    朴素贝叶斯分类器模型,本质上是个生成模型:需要知道x,y的联合概率分布,不像判别模型只需要知道y的概率分布就好!具体在分类上,是通过比分类概率大小来预测类别!举例:现在有一只羊,想知道它是山羊还是绵羊?我们先把这只羊的特征带入山羊的训练模型中,得出一个概率值,然后再带入绵羊的训练模型中得出一个概率,比较这两个概率大小,大的就是我们最终的分类!

    用数学语言讲:1、求各类别概率P(Y=Ck)

    2、求联合概率分布

    3、比较选择概率最大的类(不涉及分母,因为类别之间都一样)

    朴素贝叶斯的假设:各属性之间相互独立!

    对数据要求:朴素贝叶斯适应于离散性数据 ;

    高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布(正态分布)

    多项式朴素贝叶斯:特征变量是离散变量,符合多项分布

    伯努利朴素贝叶斯:特征变量是0,1分布

    朴素贝叶斯估计参数的方法:极大似然估计:因为不能应对极端情况--分母为0的情况,一般选择贝叶斯估计!

    贝叶斯估计:在样本量无穷,且先验概率靠谱的局面下,极大似然估计与贝叶斯估计的结果是一样的!

    若是数据量有限的情况下,就计算复杂度来说,选择极大似然估计(极大似然估计就涉及求导,贝叶斯不仅求导,还涉及多重积分),就计算准确性而言,选择贝叶斯估计,毕竟贝叶斯估计有很强的理论基础!

    朴素贝爷斯算法优缺点:

    优点:对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。

    对缺失数据不太敏感,算法也比较简单,常用于文本分类。

    缺点:朴素贝叶斯假设各属性之间独立,现实很难满足,这就导致分类有天然的误差!

    需要知道先验概率,而先验概率依赖于假设!

    对输入数据的表达形式很敏感。

    展开全文
  • 数据库系统实现

    2013-05-12 13:09:11
    5.4.3 游程长度编码位向量的操作 5.4.4 位图索引的管理 习题 5.5 小结 5.6 参考文献 第6章 查询执行 6.1 一种查询代数 6.1.1 并、交和差 6.1.2 选择操作符 6.1.3 投影操作符 6.1.4 关系的积 ...
  • 书中介绍了它无中心架构、高可用、无缝扩展等引人注目特点,讲述了如何安装、配置cassandra及如何在其上运行实例,还介绍了对它监控、维护和性能调优手段,同时还涉及了cassandra相关集成工具hadoop及其类似...
  • HumanMotionTrack 全

    2010-12-09 11:30:55
    然后呢,我们知道了两个矢量夹角与它们向量,下面事情就变得简单了,我们让骨骼原来矢量以法向量为旋转轴,旋转一定角度,这个角度就是两个矢量夹角,这样问题就解决了,所以这里代码如下: ...
  • 四、SVM支持向量机 1、代价函数 2、Large Margin 3、SVM Kernel(核函数) 4、使用中模型代码 5、运行结果 五、K-Means聚类算法 1、聚类过程 2、目标函数 3、聚类中心选择 4、聚类个数K选择 5、应用——...
  • 本书目的就是帮助读者了解c++是如何支持编程技术,使读者能从中获得新理解,从而成为一名优秀编程人员和设计人员。适合做高校面向对象编程课程教科书,也可作为c++爱好者参考书。 [center] [a href=...
  • 本书讲述了在互联网上传送数据“盒子”内部是如何工作,这些“盒子”有不同名称:网桥、路由器、交换机和集线器。本书也讲述了连接到网络上设备。在这个领域有不少混乱。大多数术语定义不准确,使用时...
  • 本书目的就是帮助读者了解c++是如何支持编程技术,使读者能从中获得新理解,从而成为一名优秀编程人员和设计人员。适合做高校面向对象编程课程教科书,也可作为c++爱好者参考书。 [center] [a href=...

空空如也

空空如也

1 2 3
收藏数 46
精华内容 18
关键字:

向量的模如何比较大小