一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

神经网络模型的运行方法、介质、程序产品以及电子设备与流程

2022-06-11 08:07:56 来源:中国专利 TAG:
1.本技术涉及人工智能
技术领域
:,特别是涉及一种神经网络模型的运行方法、介质、程序产品以及电子设备。
背景技术
::2.随着人工智能技术(artificialintelligence,ai)的发展,神经网络模型得到越来越广泛的运用,例如,应用于人脸识别、信息推荐以及用户行为预测等应用场景。为了减少神经网络模型的参数量、计算机运行过程中的计算量,加快计算速度以及内存占用,通常需要将神经网络模型进行量化,将神经网络模型中的高精度浮点数据运算转化为定点数据运算。指数函数(例如ex)作为一种常用的函数,被广泛运用在神经网络模型中,例如softmax算子、lrn算子中都包含指数函数运算。因此,在对神经网络模型进行量化时,很多情况下会涉及到对指数函数的量化。3.然而,指数函数作为一种非线性函数,无法通过线性定点计算获得指数函数定点结果。现有技术可以使用查表法获得指数函数定点结果。例如,一种基于查表法的指数函数定点运算方式为:预先构建一个查找表(lookuptable,lut),该表中包括索引值,以及该索引值对应的查找表结果。将定点型输入数据作为查找索引,在该查找表中获取该查找索引对应的查找表结果,然后再利用获得的该查找表结果进行下一步计算。4.由于随着待进行指数函数运算的浮点型输入数据的增大,浮点型的指数函数运算结果会急剧增大,从而会产生采用相同的量化的比特数(例如8比特)对指数函数(例如ex)进行量化时精度较低的问题。当模型在运行过程中,根据量化精度较低的查找表得到待进行指数函数运算的浮点型输入数据对应的定点型的指数函数运算结果后,将该结果进行后续运算会容易导致模型运行结果准确性较低。技术实现要素:5.有鉴于此,本技术提供了一种神经网络模型的运行方法、介质、程序产品以及电子设备。6.本技术的技术方案在神经网络模型的运行过程中,接收待进行指数函数运算的第一浮点型数据;对第一浮点型数据进行数值转换,得到属于预设浮点型数据范围的第二浮点型数据,预设浮点型数据范围为小于或等于零;将第二浮点型数据进行量化得到第二浮点型数据的第一定点数;将第一定点数作为索引值在查找表中查找第一定点数对应的第一指数定点结果值。基于第一指数定点结果值确定第一浮点型数据的指数函数运算的第二指数定点结果值。7.也就是说通过对指数函数运算的浮点型输入数据进行调整,例如预先确定出浮点型输入数据的最大值,将该浮点型输入数据减去确定出的最大值得到调整后的浮点型输入数据,调整后的浮点型输入数据范围在负无穷到0内,以使调整后的浮点型输入数据对应的指数函数运算结果的取值在一个较小的取值范围[0,1]内,解决了随着指数函数的浮点型输入数据的增大而浮点型的指数函数运算结果急剧增大,采用相同的量化的比特数对指数函数进行量化时精度越来越低的问题,再基于调整后的浮点型输入数据的相关数据可构建精度较高的查找表。从而在模型的实际运算过程中,调整接收的待进行指数函数运算的第一浮点型数据得到第二浮点型数据,第二浮点型数据所属的范围为上述构建的精度更高的查找表的索引值对应的浮点数值范围,将得到的第二浮点型数据进行量化得到第一定点数,根据第一定点数在精度更高的查找表中查找和该第一定点数相同的索引值对应的第一指数定点结果,再基于第一指数定点结果值确定第一浮点型数据的第二指数定点结果。由于本技术构建的查找表精度较高,从而使用精度更高的查找表得到第一浮点型数据对应的指数定点结果进行后续运算,得到的结果会更加准确,可以提高模型运算结果的准确性。[0008]第一方面,本技术实施例提供了一种神经网络模型的运行方法,前述神经网络模型包括指数函数运算,包括:[0009]在神经网络模型的运行过程中,接收待进行指数函数运算的第一浮点型数据;[0010]对第一浮点型数据进行数值转换,得到属于预设浮点型数据范围的第二浮点型数据,其中预设浮点型数据范围为小于或者等于零;[0011]将第二浮点型数据进行量化得到第二浮点型数据的第一定点数;[0012]将第一定点数作为索引值在查找表中查找第一定点数对应的第一指数定点结果值,其中查找表中的各索引值对应的浮点数值的范围与预设浮点型数据范围相同;[0013]基于第一指数定点结果值确定第一浮点型数据的指数函数运算的第二指数定点结果值。[0014]在上述第一方面的一种可能的实现中,上述对第一浮点型数据进行数值转换,得到属于预设浮点型数据范围的第二浮点型数据,包括:[0015]将第一浮点型数据减去预先确定的指数函数运算的浮点型输入数据范围内的最大值,得到第二浮点型数据。[0016]在上述第一方面的一种可能的实现中,上述指数函数运算的浮点型输入数据范围是在神经网络模型的训练过程中确定的。[0017]在上述第一方面的一种可能的实现中,上述查找表中查找到的第一指数定点结果值与第二指数定点结果值相同。[0018]在上述第一方面的一种可能的实现中,上述第一指数定点结果为,[0019]第一定点数对应的浮点型的指数函数运算结果的定点值与定点转换因子的乘积。[0020]在上述第一方面的一种可能的实现中,上述定点转换因子为指数函数运算的浮点型输入数据范围内的最大值的指数函数运算结果的定点值。[0021]在上述第一方面的一种可能的实现中,上述基于所述第一指数定点结果值确定第一浮点型数据的指数函数运算的第二指数定点结果值,包括:[0022]将第一指数定点结果值乘以定点转换因子得到所述第二指数定点结果值。[0023]在上述第一方面的一种可能的实现中,上述第一指数定点结果为,[0024]第一定点数对应的浮点型的指数函数运算结果的定点值。[0025]在上述第一方面的一种可能的实现中,上述定点转换因子为所述指数函数运算的浮点型输入数据范围内的最大值的指数函数运算结果的定点值。[0026]在上述第一方面的一种可能的实现中,上述各索引值为第二浮点型输入数据的量化类型对应的可取值范围内的各个整数。[0027]例如,第二浮点型输入数据的量化类型为int8,则int8对应的可取值范围为[-128,127]。[0028]在上述第一方面的一种可能的实现中,上述量化类型,包括下列中的至少一种:int32、int16、int8、int4、uint32、uint16、uint8、uint4。[0029]第二方面,本技术实施例提供了一种计算机可读存储介质,包括:计算机可读存储介质上存储有指令,指令在电子设备上执行时使电子设备实现上述第一方面以及第一方面的各种可能实现中的任意一种神经网络模型的运行方法。[0030]第三方面,本技术实施例提供了一种计算机程序产品,包括:计算机程序产品包括指令,指令用于实现上述第一方面以及第一方面的各种可能实现中的任意一种神经网络模型的运行方法。[0031]第四方面,本技术实施例提供了一种电子设备,包括:[0032]存储器,用于存储指令,以及[0033]一个或多个处理器,所述指令被所述一个或多个处理器执行时,实现上述第一方面以及第一方面的各种可能实现中的任意一种神经网络模型的运行方法。附图说明[0034]图1根据本技术的一些实施例,示出了一种指数函数的示意图;[0035]图2根据本技术的一些实施例,示出了一种查找表的示意图;[0036]图3根据本技术的一些实施例,示出了一种终端100通过人脸识别模型对采集到的人脸图像进行识别的场景图;[0037]图4根据本技术的一些实施例,示出了一种构建调整查找表的方法的流程图;[0038]图5a根据本技术的一些实施例,示出了一种构建的索引值范围为-128~127的调整查找表示意图;[0039]图5b根据本技术的一些实施例,示出了一种构建的索引值范围为0~255的调整查找表示意图;[0040]图6a根据本技术的一些实施例,示出了一种构建的索引值范围为-128~127的调整查找表示意图;[0041]图6b根据本技术的一些实施例,示出了一种构建的索引值范围为0~255的调整查找表示意图;[0042]图7根据本技术的一些实施例,示出了一种模型运行过程中,获得定点型的指数函数运算结果的流程图;[0043]图8根据本技术的一些实施例,示出了一种终端100的结构框图。具体实施方式[0044]本技术的说明性实施例包括但不限于一种神经网络模型的运行方法、介质、程序产品以及电子设备。[0045]为了更加清楚的说明本技术实施例的方案,下面对本技术实施例中涉及到的一些术语进行解释。[0046](1)指数函数及其平移特性:[0047]指数函数:[0048]一般地,在数学上指数函数表达形式如以下公式1所示:[0049]y=ax(a》0且a≠1)ꢀꢀ(公式1)[0050]其中a为底数,x为指数函数的幂参数。[0051]在本技术中,指数函数以自然常数(e)为底,即y=ex。其中幂参数x为指数函数运算的输入数据,y为指数函数运算的输出数据,也就是对幂参数x进行指数函数运算获得的指数函数运算结果。[0052]指数函数是一个单调递增函数,当输入数据依次增大的时候,输出数据也依次增大。如图1所示,当指数函数运算的输入数据范围在[xmin,xmax]之间时,可以得到指数函数运算的输出数据范围为[ymin,ymax]。[0053]在本技术中,当幂参数x为浮点型数据时,则幂参数x为指数函数运算的浮点型输入数据,对应的y为浮点型的指数函数运算结果;当幂参数x为定点型数据时,则幂参数x为指数函数运算的定点型输入数据,对应的y为定点型的指数函数运算结果。[0054]指数函数的平移特性:[0055][0056]其中,公式2中xmax是指数函数输入数据范围中的最大值。根据公式2可知,y(xmax)是一个常数,将该常数称作转换因子,当该常数为浮点型时,称转换因子为浮点转换因子,当该常数为定点型时,称转换因子为定点转换因子。当获取y(x-xmax)的值后就可以通过公式2的计算方式获得y(x)的值。在本技术中的一些实施例中,定点转换因子为浮点型输入数据范围内的最大值的指数函数运算结果的定点值。[0057](2)对称量化以及非对称量化[0058]非对称量化方式:将浮点数x通过公式3映射为定点数q。[0059]q=round(x/s) zꢀꢀ(公式3)[0060]其中,s、z为量化参数。具体地,z为非对称量化零点,且为整型,即为浮点数x为0时对应的定点数q的值。s为非对称量化缩放系数,即浮点数x量化为定点数q后可表示的最小刻度。当s与z确定后,可以根据输入的浮点数x确定量化后的定点数q。round()函数为对x/s的值进行四舍五入操作,需要说明的round()函数只是为了保证x/s的值为整型,在这里也可以为其他的函数,例如取整函数floor()、ceil()等。[0061]需要解释的是,若确定了浮点数x在[xmin,xmax]范围内以及将浮点数x进行量化的数值范围[qmin,qmax],可以通过以下公式4、公式5得到非对称量化缩放系数s和非对称量化零点z。对于公式5,当通过公式5算得的结果超过255时,z取255,当通过公式5算得的结果小于0时,z取0。可选地,也可以通过其他方式得到非对称量化缩放系数s和非对称量化零点z,获得的具体方式在此不做具体要求。[0062][0063]z=qmin-round(xmin/s)ꢀꢀ(公式5)[0064]x=(q-z)*sꢀꢀ(公式3’)[0065]其中,浮点数x进行量化后的定点数的数值范围[qmin,qmax]是由浮点数x量化后的定点数q的数据类型决定的,若该数据类型为有符号整型数(integralnumerictypes,int),则量化后的定点数q的数据类型对应的定点数q的取值范围为[-2n-1,2n-1-1],其中n为量化的比特数,若该数据类型为有符号整型数(unsignedintegralnumerictypes,uint),定点数q的取值范围为[0,2n-1],其中n为量化的比特数。例如,在本技术中,浮点型输入数据量化后的定点数值q的数据类型为int8,则量化的比特数为8,8位二进制可表示的有符号数的十进制数值范围为[-128,127],即浮点型输入数据量化后的定点数数据类型int8对应的取值范围为[-128,127],则量化的数值范围为[-128,127]。又如,定点数q的数据类型为uint8,则量化的比特数为8,8位二进制可表示的无符号数的十进制数值范围为[0,255],则量化的数值范围为[0,255]。[0066]可以理解的,对于一个定点数,可以根据该定点数对应的非对称量化缩放系数以及非对称量化零点确定该定点数对应的浮点数,称该过程为反量化,在一些实施例中,将上述公式3变形,可以得到公式3’,称公式3’为反量化公式,根据反量化公式3’得到定点数对应的浮点数。[0067](2)对称量化:是非对称量化的一种特殊情况,限定非对称量化零点量z为0,则对称量化的量化参数包括对称量化缩放系数s,则浮点数x与定点数q之间的映射关系为公式6,其中,s可由公式7得到,也可以由其他公式得到,这里不做具体限制。[0068]q=round(x/s)ꢀꢀ(公式6)[0069][0070]x=q*sꢀꢀ(公式6’)[0071]其中,max()函数为最大值函数。|*|为取绝对值。可以理解的,对于一个定点数,可以根据该对称量化缩放系数确定该定点数对应的浮点数。在一些实施例中,将上述公式6的变形,可以得到反量化公式6’,根据公式6’得到定点数对应的浮点数。[0072]需要说明的是,在本技术中,对称量化方式不仅适用于浮点数x量化后的定点数q的数据类型为int类型,也适用于浮点数x量化后的定点数q的数据类型为uint类型。若该数据类型为有符号整型数,定点数q的取值范围为[0,2n-1],其中n为量化的比特数,则可以根据公式7得到对称量化参数,再根据公式6将浮点数x进行量化。例如,定点数q的数据类型为uint8,则量化的数值范围为[0,255],则对称量化参数s=max(|xmax|,|xmin|)/255,再根据公式6得到浮点数对应的定点数。[0073](3)查找表[0074]查找表用于存储不同的定点型输入数据对应的定点型输出数据。具体地,对于一个定点型输入数据,将该定点型输入数据作为查找表的索引值在查找表中获得该索引值对应的查找表结果,该查找表结果就是该定点型输入数据对应的定点型输出数据。例如,如图2所示的查找表,定点型输入数据对应的十进制数值为10,将10作为查找表的索引值在查找表中获得该定点型输入数据对应的查找表结果为23。可以理解的,图2中示意的数字仅仅是一种示意,是计算机存储的二进制数对应的10进制值。图2所示的表格仅仅是查找表的一种示意,在计算机中可以为数组、字符串、元组等,在此不做具体要求。[0075](4)基于查找表的指数函数量化[0076]基于查找表的指数函数量化,将定点型输入数据作为查找表的索引值,定点型的指数函数运算结果作为查找表结果,从而构建查找表。当获取定点型输入数据后,将定点型输入数据作为查找表的索引值在查找表中查找得到定点型的查找表结果,该结果就是定点型的指数函数运算结果(下文称为指数定点结果)。当获得查找表的查找表结果后可以作为下一步运算逻辑的输入进行运算。其中,定点型输入数据是根据指数函数运算的浮点型输入数据的取值范围、量化后的定点数的数据类型(下文称为量化类型)(例如uint8)确定的,而指数定点结果是根据指数函数运算的浮点型指数函数运算结果的取值范围、量化类型确定的。[0077]为了更好的理解本方案,下面将首先介绍本技术技术方案的一种应用场景。[0078]图3示出了一种终端100通过人脸识别模型对采集到的人脸图像进行识别的场景图。如图3所示,终端100部署有通过服务器200量化好的人脸识别模型。终端100采集到用户的人脸图像后,可以通过量化的人脸识别模型对采集的人脸图像进行人脸识别,从而获得人脸识别结果。[0079]通常为了减少数据量,会将上述人脸识别模型进行量化,例如,由服务器200对训练好的人脸识别模型进行量化,然后将量化好的人脸识别模型(以下简称量化模型)部署到终端设备100中。终端100在利用量化模型进行人脸识别的过程中,通常会涉及到指数函数运算,例如softmax算子、lrn算子等均包括指数函数运算。由于量化模型中的模型参数均被量化,因此在人脸识别过程中,涉及到的指数函数也需要进行量化,指数函数作为一种非线性函数,无法根据定点型输入数据通过线性计算公式计算获得定点型的结果。在一些实施例中,可以采用查找表的方式构建定点型输入数据与指数定点结果的映射关系,将定点型输入数据作为查找表的索引值,根据索引值在查找表中查找指数定点结果。[0080]然而,在使用上述由定点型输入数据与指数定点结果构建的查找表中,由于查找表是根据确定的浮点型输入数据的范围以及浮点型的指数函数运算结果的范围构建的,若浮点型输入数据较大,则浮点型的指数函数运算结果会急剧变大,会导致采用相同的量化比特数(例如8比特)对指数函数(例如ex)进行量化时的精度较低。当模型在运行过程中使用精度过低的查找表进行运算时,会产生模型运行结果误差较大的情况。[0081]例如,假设浮点型输入数据范围为[0,10],对应的浮点型的指数函数运算结果范围为[1,e10]。如果浮点型的指数函数运算结果的量化类型为uint8,则定点型的指数函数运算结果的取值范围为[0,255],即需要将范围在[1,e10]的浮点型的指数函数运算结果量化到[0,255]范围内来实现指数函数量化。若浮点型输入数据范围为[0,15],对应的浮点型的指数函数运算结果范围为[1,e15],则是将范围在[1,e15]的浮点型的指数函数运算结果量化到[0,255]范围内来实现指数函数量化。可以理解的是,将一个极大的范围量化到一个较小的范围,量化的精度会较低,故将范围在[1,e15]的浮点型的指数函数运算结果量化到[0,255]范围内时对应的量化精度,比范围在[1,e10]的浮点型的指数函数运算结果量化到[0,255]范围内时对应的量化精度更低。当终端100使用由定点型输入数据和精度较低的指数定点结果构建的查找表,将定点型输入数据作为索引值在该查找表中查找定点型的指数函数运算结果时,查找到的定点型的指数函数运算结果精度较低。故而,在涉及到利用精度较低的定点型的指数函数运算结果进行进一步的运算时,运算结果精度较低。例如,在使终端100进行人脸识别的过程中,涉及到利用精度较低的定点型指数函数运算结果进行人脸识别过程中的运算时,获得的人脸识别结果误差较大。[0082]为此,本技术提供了一种指数函数量化方法,通过对指数函数的浮点型输入数据进行调整,例如预先确定出浮点型输入数据的最大值,将该浮点型输入数据减去确定出的最大值得到调整后的浮点型输入数据,调整后的浮点型输入数据范围在负无穷到0内,以使调整后的浮点型输入数据对应的指数函数运算结果的取值在一个较小的取值范围[0,1]内,从而再基于调整后的浮点型输入数据的相关数据构建查找表。[0083]例如,浮点型输入数据范围为[0,10],该浮点型输入数据的最大值为10,根据公式2,将该浮点型输入数据减去最大值10,得到调整后的浮点型输入数据范围为[-10,0],即调整后的浮点型输入数据范围在负无穷到0内,调整后的浮点型输入数据范围[-10,0]对应的指数函数运算结果的取值范围为[e-10,0],该取值范围[e-10,0]可以确定在[0,1]内,再基于取值范围为[-10,0]的调整后的浮点型输入数据的相关数据,例如该取值范围对应的的浮点型指数函数运算结果的定点值以及定点转换因子构建查找表。其中,定点转换因子为浮点型输入数据范围内的最大值10对应的浮点型的指数函数运算结果e10的定点值。[0084]具体地,可以根据调整后的浮点型输入数据的量化类型,确定出查找表中的索引值,例如调整后的浮点型输入数据的量化类型为uint8,则该查找表中的索引值可以依次取的8位二进制值为00000000、00000001、00000010,依次类推直至11111110、11111111,对应的十进制值为0、1、2……253、254、255;然后再根据调整后的浮点型输入数据的取值范围以及调整后的浮点型输入数据的量化类型,对上述查找表中的各索引值进行反量化,得到各索引值对应的各浮点数值;然后再对各索引值对应的各浮点数值进行指数函数运算,得到各索引值对应的浮点型指数函数运算结果;从而再根据各索引值对应的浮点型指数函数运算结果的量化类型、调整后的浮点型输入数据对应的指数函数运算结果的取值范围,对各索引值对应的浮点型指数函数运算结果进行量化,得到各索引值对应的指数函数运算结果的定点值。将未调整的浮点型输入数据范围内的最大值的指数函数运算结果以采用与获得各索引值对应的指数函数运算结果的定点值相同的方式得到对应的定点值作为定点转换因子,可以基于上述各索引值、各索引值对应的指数函数运算结果的定点值以及定点转换因子构建出查找表。[0085]可以理解的,在一些实施例中,构建的查找表中各索引对应的指数定点结果可以为各索引值对应的指数函数运算结果的定点值。可以理解的,此时未调整的浮点型输入数据对应的指数定点结果为各索引值在构建的查找表中的指数定点结果再与定点转换因子相乘得到的定点值。在另一些实施例中,各索引值在查找表中对应的指数定点结果为各索引值对应的指数函数运算结果的定点值与定点转换因子的乘积。可以理解的,未调整的浮点型输入数据的指数定点结果为根据查找表得到的指数定点结果。[0086]因此,利用调整后的浮点型输入数据及相关数据构建的查找表精度较高,可以解决指数函数的浮点型输入数据的增大,导致浮点型的指数函数运算结果急剧增大,采用相同的量化的比特数对指数函数进行量化时精度越来越低的问题。[0087]从而在模型实际运算过程中,可以调整接收的待进行指数函数运算的第一浮点型数据得到第二浮点型数据,可以理解的,第一浮点型数据所属的范围为上述构建表的过程中没有经过调整的浮点型输入数据范围,第二浮点型数据所属的范围为上述构建表的过程中调整后的浮点型输入数据范围,将得到的第二浮点型数据进行量化得到第一定点数,将第一定点数作为查找依据,在查找表中查找和该第一定点数相同的索引值对应的第一指数定点结果。基于第一指数定点结果值确定第一浮点型数据的指数函数运算的第二指数定点结果值。[0088]可以理解的,本技术技术方案中调整指数函数运算的浮点型输入数据得到调整后的浮点型输入数据范围的最大值为0,则调整后的浮点型输入数据对应的浮点型的指数函数运算结果的范围一定在[0,1]内,则再将浮点型的指数函数运算结果进行量化,可以确保量化后的浮点型的指数函数运算结果的精度较高。根据量化后的定点型的指数函数运算结果构建精度较高的查找表,从而使模型在实际运行过程中,使用接收的待进行指数函数运算的第一浮点型数据对应的指数函数运算结果的定点值进行后续运算,获得的模型运行结果更加准确。[0089]例如,一些情况下,接收的待进行指数函数运算的第一浮点型数据使用未调整的浮点型输入数据范围及其相关数据构建的查找表得到的指数定点结果为0,而利用调整后的浮点型输入数据范围及其相关数据构建的查找表得到的指数定点结果不为0,可以理解的,利用不为0的定点数进行后续运算获得的结果更加准确。[0090]为了便于说明,以下将通过申请技术方案中基于调整后的浮点型输入数据、以及调整后的浮点型输入数据的指数函数运算结果,构建的查找表,简称为“调整查找表”。[0091]需要说明的是,可以由终端100进行查找表的构建,也可以由服务器200来查找表的构建。终端100包括但不限于手机、平板电脑、智慧屏、可穿戴设备(例如,手表、手环、头盔、耳机等)、车载设备、增强现实(augmentedreality,ar)/虚拟现实(virtualreality,vr)设备、笔记本电脑、超级移动个人计算机(ultra-mobilepersonalcomputer,umpc)、上网本、个人数字助理(personaldigitalassistant,pda)等电子设备中的一种。服务器200可以是单独的服务器,也可以是多个服务器构成的服务器集群。[0092]下面将以图3所示的场景中服务器200构建调整查找表为例,阐述构建调整查找表的过程。具体地,参考图4,本技术实施例提供的一种通过调整浮点型输入数据取值范围来构建调整查找表的方法包括以下步骤:[0093]s401:确定浮点型输入数据的范围。[0094]在一些实现方式中,服务器200事先使用未量化的神经网络模型进行多次模型训练,获得训练过程中神经网络模型中指数函数(y=ex)运算的浮点型输入数据的最大值以及最小值,得到浮点型输入数据的范围。[0095]例如,事先通过使用未量化的人脸识别模型进行多次模型训练,获得训练过程中人脸识别模型中指数函数(y=ex)运算的浮点型输入数据的最大值为10、最小值为0,得到浮点型输入数据范围为[0,10]。[0096]s402:调整浮点型输入数据范围得到调整后的浮点型输入数据范围。[0097]在一些实现方式中,将浮点型输入数据范围内的浮点型输入数据的最大值与最小值都减去最大值得到调整后的浮点型输入数据的最大值与最小值,则根据调整后的浮点型输入数据的最大值与最小值确定调整后的浮点型输入数据范围。[0098]可以理解的,调整后的浮点型输入数据最大值为0。[0099]例如,浮点型输入数据范围[0,10]内的浮点型输入数据的最大值10与最小值0都减去最大值10得到调整后的浮点型输入数据的最大值0与最小值-10,则根据调整后的浮点型输入数据的最大值0与最小值-10确定调整后的浮点型输入数据范围为[-10,0]。[0100]s403:根据调整后的浮点型输入数据的范围获得调整后的浮点型输入数据对应的浮点型的指数函数运算结果范围。[0101]在一些实施例中,服务器200获取调整后的浮点型输入数据的范围的最大值与最小值,并分别将该最大值与最小值进行指数函数运算,得到浮点型的指数函数运算结果的最大值以及最小值,再根据浮点型的指数函数运算结果的最大值以及最小值,确定调整后的浮点型输入数据对应的浮点型的指数函数运算结果范围。[0102]例如,调整后的浮点型输入数据的范围为[-10,0]对应的最大值为0、最小值为-10,将最大值0与最小值-10分别进行指数函数运算,得到浮点型的指数函数运算结果的最大值1,以及浮点型的指数函数运算结果的最小值e-10,从而确定调整后的浮点型输入数据对应的浮点型的指数函数运算结果范围为[e-10,1]。[0103]s404:确定调整后的浮点型输入数据的量化类型以及调整后的浮点型输入数据对应的浮点型的指数函数运算结果的量化类型。[0104]在一些实施例中,调整后的浮点型输入数据的量化类型可以为int32、int16、int8、int4、uint32、uint16、uint8、uint4等,调整后的浮点型输入数据对应的浮点型的指数函数运算结果的量化类型可以为int32、int16、int8、int4、uint32、uint16、uint8、uint4。[0105]例如,范围为[-10,0]的调整后的浮点型输入数据的量化类型为int8,调整后的浮点型输入数据对应的浮点型的指数函数运算结果的量化类型为uint8。[0106]例如,范围为[-10,0]的调整后的浮点型输入数据的量化类型为uint8,调整后的浮点型输入数据对应的浮点型的指数函数运算结果的量化类型为uint8。[0107]s405:根据调整后的浮点型输入数据的量化类型确定调整查找表的索引值。[0108]在一些实现方式中,根据调整后的浮点型输入数据的量化类型对应的浮点型输入数据量化的定点数的可取值范围的各个整数确定调整查找表的各个索引值。[0109]例如,调整后的浮点型输入数据的量化类型为int8,即调整后的浮点型输入数据量化的定点数是有符号数,并由八位二进制表示,八位二进制数表示的有符号数对应的十进制数的取值范围为-128~127的整数,故调整后的浮点型输入数据的量化类型对应的取值范围为-128~127的整数,则浮点型输入数据量化的定点数值的取值范围为-128~127,故而调整查找表的各索引值可以为-128、-127、-126……125、126、127。[0110]例如,调整后的浮点型输入数据的量化类型为uint8,即调整后的浮点型输入数据量化的定点数是有符号数,并由八位二进制表示,八位二进制数表示的无符号数对应的十进制数的取值范围为0~255的整数,故调整后的浮点型输入数据的量化类型对应的取值范围为0~255的整数,则浮点型输入数据量化的定点数值的取值范围为0~255,故而调整查找表的索引值可以为0、1、2……253、254、255。[0111]s406:对各索引值进行反量化,得到各索引值对应的各浮点数值。[0112]在一些实施例中,根据调整后的浮点型输入数据范围以及调整后的浮点型输入数据量化的定点数的可取值范围确定调整后的浮点型输入数据的量化参数(例如,非对称量化参数包括非对称量化缩放系数和非对称量化零点,对称量化参数包括对称量化缩放系数),将索引值与量化参数代入对应的反量化公式进行运算得到各索引值对应的各浮点数值,其中索引值是反量化公式中的定点型数据,反量化公式可以为公式3’、公式6’及其变形。[0113]例如,选择非对称量化方式,利用公式3’,将索引值为-128、-127、-126……125、126、127通过公式3’得到该索引值对应的浮点数值。以索引值为-10进行介绍计算过程,调整后的浮点型输入数据范围为[-10,0],浮点型输入数据量化的定点数值的可取值范围为-128~127的整数,则非对称量化参数s_x1、z_x1可以分别根据公式4、公式5计算得到,s_x1=0-(-10)/127-(-128)=0.0392,z_x1=-128-round(-10/0.0392)=127,该索引值对应的浮点数值可以根据公式3’得到(-10-127)*0.0392=-5.4096。[0114]例如,选择非对称量化方式,利用公式3’,将索引值为0、1、2……253、254、255通过公式3’得到该索引值对应的浮点数值。以索引值为118进行介绍计算过程,调整后的浮点型输入数据范围为[-10,0],浮点型输入数据量化的定点数值的可取值范围为0~255的整数,则非对称量化参数s_x1、z_x1可以分别根据公式4、公式5计算得到,s_x1=(0-(-10))/(255-0)=0.0392,z_x1=0-round(-10/0.0392)=255,该索引值118对应的浮点数值可以根据公式3’得到(118-255)*0.0392=-5.4096。[0115]s407:对各索引值对应的浮点数值进行指数函数运算,得到各索引值对应的浮点型的指数函数运算结果。[0116]例如,浮点型输入数据的量化类型为int8,索引值-10对应的浮点数值为-5.4096,则对索引值对应的浮点数值进行指数函数运算,得到该索引对应的浮点型的指数函数运算结果e-5.4096=0.0045。[0117]例如,浮点型输入数据的量化类型为uint8,索引值118对应的浮点数值为-5.4096,则对索引值对应的浮点数值进行指数函数运算,得到该索引值对应的浮点型的指数函数运算结果e-5.4096=0.0045。[0118]s408:将各索引值对应的浮点型的指数函数运算结果进行量化,得到各索引值对应的浮点型的指数函数运算结果的定点值。[0119]在一些实施例中,根据调整后的浮点型输入数据对应的浮点型的指数函数运算结果范围以及指数函数运算结果的量化类型对应的取值范围确定指数函数运算结果的量化参数(例如,非对称量化包括非对称量化缩放系数和非对称量化零点,对称量化包括对称量化缩放系数)。[0120]可以理解的,各索引值对应的浮点型的指数函数运算结果的量化类型就是上述步骤s404中的调整后的浮点型输入数据对应的浮点型的指数函数运算结果的量化类型。[0121]将各索引值对应的浮点型的指数函数运算结果与对应的量化参数代入相应的反量化公式进行计算,得到各索引值对应的浮点型的指数函数运算结果的定点值,其中,量化公式可以为公式3’、公式6’及其变形。[0122]例如,调整后的浮点型输入数据对应的浮点型指数函数运算结果范围为[e-10,1],各索引值对应的浮点型的指数函数运算结果的量化类型为uint8,即各索引值对应的指数函数运算结果量化后的定点数是无符号数,并由八位二进制表示,八位二进制数表示的无符号数对应的十进制数的取值范围为0~255的整数,所以浮点型指数函数运算结果的量化类型对应的取值范围为0~255的整数。选用对称量化方式,则可以根据公式7计算得到指数函数运算结果的对称量化参数s_y1,s_y1=1/255=0.0039,再利用公式4’计算,得到调整后的浮点型输入数据对应的浮点型的指数函数运算结果的定点值。对于值为0.0045的指数函数运算结果量化后的定点值为round(0.004550/0.0039)=1。[0123]s409:确定定点转换因子。[0124]在一些实施例中,将未调整的浮点型输入数据最大值的指数函数运算结果的定点值作为定点转换因子,将未调整的浮点型输入数据最大值的指数函数运算结果以采用与步骤s408中获得各索引值对应的指数函数运算结果的定点值相同的方式得到对应的定点值,具体过程在此不再赘述。[0125]例如,未调整的浮点型输入数据的指数函数运算结果范围为[e0,e10],未调整的浮点型输入数据的指数函数运算结果的量化类型为uint8,即未调整的浮点型输入数据最大值的指数函数运算结果量化后的定点数是无符号数,并由八位二进制表示,八位二进制数表示的无符号数对应的十进制数的取值范围为0~255的整数,所以浮点型指数函数运算结果的量化类型对应的取值范围为0~255的整数。选用对称量化方式,则可以根据公式7计算得到指数函数运算结果的对称量化参数s_y2,s_y2=e10/255,再利用公式4’计算,得到未调整的浮点型输入数据最大值10的指数函数运算结果e10的定点值为round(e10/s_y2)=round(e10/(e10/255))=255。[0126]s410:根据各索引值对应的浮点型的指数函数运算结果的定点值以及定点转换因子确定调整查找表中各索引值对应的指数定点结果值。[0127]可以理解的,各索引对应的指数定点结果就是各索引值对应的查找表结果。[0128]在一些实施例中,直接将各索引值对应的浮点型指数函数运算结果的定点值作为调整查找表各索引对应的指数定点结果。可以理解的,各索引值对应的指数函数运算结果的定点值是调整后的浮点型输入数据对应的浮点型的指数函数运算结果的定点值。[0129]例如,图5a示出了索引值为-128~127与对应的指数函数运算结果量化的定点值一一对应的调整查找表,比如索引值为-10在调整查找表中对应的输出的指数定点结果为1。[0130]图5b示出了索引值为0~255与对应的指数函数运算结果量化的定点值作为调整查找表中各索引对应的指数定点结果,比如索引值为118在调整查找表中对应的指数定点结果为1。[0131]在另一些实施例中,将各索引值对应的指数函数运算结果的定点值与定点转换因子的乘积作为调整查找表中各索引对应的指数定点结果。可以理解的,各索引值对应的指数函数运算结果的定点值与未调整的浮点型输入数据最大值的指数函数运算结果的定点值的乘积是未调整的浮点型输入数据对应的浮点型的指数函数运算结果的定点值。[0132]例如,索引值为-128~127对应的指数函数运算结果量化的定点值0、0、......、255,将索引值为-128~127对应的指数函数运算结果量化的定点值与未调整的浮点型输入数据最大值的指数函数运算结果的定点值255相乘,得到未调整的浮点型输入数据对应的指数函数运算结果的定点值。图6a示出了索引值为-128~127与未调整的浮点型输入数据最大值的指数函数运算结果的定点值的乘积作为调整查找表中各索引对应的指数定点结果,比如索引值为-10在调整查找表中对应的输出的指数定点结果为255。[0133]例如,索引值为0~255对应的指数函数运算结果量化的定点值0、0、......、255,将索引值为-128~127对应的指数函数运算结果量化的定点值与未调整的浮点型输入数据最大值的指数函数运算结果的定点值255相乘,得到未调整的浮点型输入数据对应的指数函数运算结果的定点值。图6b示出了索引值为0~255与未调整的浮点型输入数据最大值的指数函数运算结果的定点值的乘积作为调整查找表中各索引对应的指数定点结果,比如索引值为-10在调整查找表中对应的输出的指数定点结果为255。[0134]可以理解,上述步骤s401至步骤s410的执行顺序只是一种示例,在另一些实施例中,也可以采用其他执行顺序,还可以拆分或合并部分步骤,在此不做限定。[0135]下面以图7所示的模型运行过程中,获得定点型的指数函数运算结果的流程图为例,详细介绍服务器200采用上述图4所示的流程图创建得到查找表,并且将该查找表下发给终端100之后,终端100在运行部署的神经网络模型时,根据待进行指数函数运算的浮点型数据获得对应定点型的指数函数运算结果的过程。具体地,如图7所示,终端100在运行部署的神经网络模型时,根据接收待进行指数函数运算的第一浮点型数据得到第一浮点型数据的指数函数运算的第二指数定点结果值的流程图包括以下各个步骤:[0136]s701:接收待进行指数函数运算的第一浮点型数据。[0137]例如,接收待进行指数函数运算的第一浮点型数据为4.5904。[0138]s702:对第一浮点型数据进行数值转换,得到属于预设浮点型数据范围的第二浮点型数据,其中预设浮点型数据范围为小于或者等于零。[0139]在一些实现方式中,将第一浮点型数据减去指数函数运算的浮点型输入数据范围内的最大值得到第二浮点型数据,第二浮点型数据小于或者等于零,在预设浮点型数据范围内。。例如,将接收的第一浮点型数据4.5904减去指数函数运算的浮点型输入数据范围内的最大值10得到第二浮点型数据-5.4096。[0140]s703:将第二浮点型数据进行量化得到第二浮点型数据的第一定点数。[0141]在一些实现方式中,将第二浮点型数据进行量化的方式为构建查找表过程根据各索引值得到各索引值的浮点数值的逆过程。[0142]例如,利用图4所示的构建查找表的方法流程构建的如图5a与图6a所示的查找表,将第二浮点型数据进行量化的方式为将-5.4096进行非对称量化,量化到int8,则非对称量化参数s_x1、z_x1可以分别根据公式4、公式5计算得到,s_x1=0-(-10)/127-(-128)=0.0392,z_x1=-128-round(-10/0.0392)=127,处理后输入数据-5.4096可以根据公式3得到,为-5.4096/0.0392 127=-10。[0143]例如,利用图4所示的构建查找表的方法流程构建的如图5b与图6b所示的查找表,将第二浮点型数据进行量化的方式为将-5.4096进行非对称量化,量化到uint8,则非对称量化参数s_x1、z_x1可以分别根据公式4、公式5计算得到,s_x1=(0-(-10))/(255-0)=0.0392,z_x1=0-round(-10/0.0392)=255,处理后输入数据-5.4096的定点值可以根据公式3得到,为-5.4096/0.0392 255=118。[0144]s704:将第一定点数作为索引值在查找表中查找第一定点数对应的第一指数定点结果值,其中查找表中的各索引值对应的浮点数值的范围与预设浮点型数据范围相同。[0145]在一些实现方式中,第一指数定点结果为第一定点数对应的浮点型的指数函数运算结果的定点值。可以理解的,第一定点数对应的浮点型的指数函数运算结果的定点值也就是与第一定点数值相等的索引值对应的浮点型的指数函数运算结果的定点值。[0146]例如,将上述步骤中获得的第一定点数-10作为如图5a所示的查找表的索引值在查找表中进行查找,得到第一指数定点结果值为1。[0147]例如,将上述步骤中获得的第一定点数118作为如图5b所示的查找表的索引值在查找表中进行查找,得到第一指数定点结果值为1。[0148]在另一些实现方式中,第一指数定点结果为第一定点数对应的浮点型的指数函数运算结果的定点值与定点转换因子的乘积。可以理解的,第一定点数对应的浮点型的指数函数运算结果的定点值也就是与第一定点数值相等的索引值对应的浮点型的指数函数运算结果的定点值。[0149]例如,将上述步骤中获得的第一定点数-10作为如图6a所示的查找表的索引值在查找表中进行查找,得到第一指数定点结果值为255。[0150]例如,将上述步骤中获得的第一定点数118作为如图6b所示的查找表的索引值在查找表中进行查找,得到第一指数定点结果值为255。[0151]s705:基于第一指数定点结果值确定第一浮点型数据的指数函数运算的第二指数定点结果值。[0152]在一些实现方式中,第二指数定点结果值为在查找表中查找到的第一指数定点结果值。可以理解的,当构建的查找表中各索引对应的指数定点结果为各索引值对应的指数函数运算结果的定点值与定点转换因子的乘积,则第二指数定点结果值与第一指数定点结果值相同。[0153]例如,根据第一定点数-10根据如图6a所示的查找表得到第一指数定点结果值为255,则第二指数定点结果值与第一指数定点结果值相同为255。[0154]例如,根据第一定点数118根据如图6b所示的查找表得到第一指数定点结果值为255,则第二指数定点结果值与第一指数定点结果值相同为255。[0155]在另一些实现方式中,在查找表中查找到的第一指数定点结果值与第二指数定点结果值不同,并且将第一指数定点结果值乘以定点转换因子得到第二指数定点结果值。可以理解的,当构建的查找表中各索引对应的指数定点结果为各索引值对应的浮点型的指数函数运算结果的定点值时,则第二指数定点结果值与第一指数定点结果值不同。[0156]例如,根据第一定点数-10根据如图5a所示的查找表得到第一指数定点结果值为1,则第二指数定点结果值为第一指数定点结果值与定点转换因子255相乘的乘积,为255。[0157]例如,根据第一定点数118根据如图5b所示的查找表得到第一指数定点结果值为1,第二指数定点结果值为第一指数定点结果值1与定点转换因子255相乘的乘积,为255。[0158]可以理解,上述步骤s701至步骤s705的执行顺序只是一种示例,在另一些实施例中,也可以采用其他执行顺序,还可以拆分或合并部分步骤,在此不做限定。[0159]为便于理解本技术各实施的技术方案,下面对终端100的硬件结构进行介绍。[0160]进一步,图8根据本技术的一些实施例,示出了一种终端100的结构示意图。如图8所示终端100包括一个或多个处理器101a、系统内存102、非易失性存储器(non-volatilememory,nvm)103、通信接口104、输入/输出(i/o)设备105、以及用于耦接处理器101a、系统内存102、非易失性存储器103、通信接口104和输入/输出(i/o)设备105的系统控制逻辑106。其中:处理器101可以包括一个或多个处理单元,例如,可以包括中央处理器cpu(centralprocessingunit)、图像处理器gpu(graphicsprocessingunit)、数字信号处理器dsp(digitalsignalprocessor)、微处理器mcu(micro-programmedcontrolunit)、ai(artificialintelligence,人工智能)处理器或可编程逻辑器件fpga(fieldprogrammablegatearray)的处理模块或处理电路可以包括一个或多个单核或多核处理器。其中,ai(artificialintelligence,人工智能)处理器包括神经网络处理器(neuralnetworkprocessingunit,npu)、周易aipu等。[0161]系统内存102是易失性存储器,例如随机存取存储器(random-accessmemory,ram),双倍数据率同步动态随机存取存储器(doubledataratesynchronousdynamicrandomaccessmemory,ddrsdram)等。系统内存用于临时存储数据和/或指令,例如,在一些实施例中,系统内存102可以用于存储上述进行模型运行的相关指令等。[0162]非易失性存储器103可以包括用于存储数据和/或指令的一个或多个有形的、非暂时性的计算机可读介质。在一些实施例中,非易失性存储器103可以包括闪存等任意合适的非易失性存储器和/或任意合适的非易失性存储设备,例如硬盘驱动器(harddiskdrive,hdd)、光盘(compactdisc,cd)、数字通用光盘(digitalversatiledisc,dvd)、固态硬盘(solid-statedrive,ssd)等。在一些实施例中,非易失性存储器103也可以是可移动存储介质,例如安全数字(securedigital,sd)存储卡等。在另一些实施例中,非易失性存储器103可以用于存储执行上述基于查找表的指数函数量化方法的相关指令等,也可以用于存储量化后的神经网络模型。[0163]特别地,系统内存102和非易失性存储器103可以分别包括:指令107的临时副本和永久副本。指令107可以包括:由处理器101中的至少一个执行时使终端100实现本技术各实施例提供的神经网络模型运行方法。[0164]通信接口104可以包括收发器,用于为电子设备100提供有线或无线通信接口,进而通过一个或多个网络与任意其他合适的设备进行通信。在一些实施例中,通信接口104可以集成于电子设备100的其他组件,例如通信接口104可以集成于处理器101a中。在一些实施例中,电子设备100可以通过通信接口104和其他设备通信。[0165]输入/输出(i/o)设备105可以包括输入设备如键盘、鼠标等,输出设备如显示器等,用户可以通过输入/输出(i/o)设备105与终端100进行交互。[0166]系统控制逻辑106可以包括任意合适的接口控制器,以终端100的其他模块提供任意合适的接口。例如在一些实施例中,系统控制逻辑106可以包括一个或多个存储器控制器,以提供连接到系统内存102和非易失性存储器103的接口。[0167]在一些实施例中,处理器101中的至少一个可以与用于系统控制逻辑106的一个或多个控制器的逻辑封装在一起,以形成系统封装(systeminpackage,sip)。在另一些实施例中,处理器101中的至少一个还可以与用于系统控制逻辑106的一个或多个控制器的逻辑集成在同一芯片上,以形成片上系统(system-on-chip,soc)。[0168]可以理解,终端100可以是能够运行神经网络模型的任意电子设备,包括但不限于手机、可穿戴设备(如智能手表等)、平板电脑、桌面型、膝上型、手持计算机、笔记本电脑、超级移动个人计算机(ultra-mobilepersonalcomputer,umpc)、上网本,以及蜂窝电话、个人数字助理(personaldigitalassistant,pda)、增强现实(augmentedreality,ar)/虚拟现实(virtualreality,vr)设备等,本技术实施例不做限定。[0169]可以理解,图8所示的终端100的结构只是一种示例,在另一些实施例中,终端100可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。[0170]本技术公开的机制的各实施例可以被实现在硬件、软件、固件或这些实现方法的组合中。本技术的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。[0171]可将程序代码应用于输入指令,以执行本技术描述的各功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本技术的目的,处理系统包括具有诸如例如数字信号处理器(digitalsignalprocessor,dsp)、微控制器、专用集成电路(applicationspecificintegratedcircuit,asic)或微处理器之类的处理器的任何系统。[0172]程序代码可以用高级程序化语言或面向对象的编程语言来实现,以便与处理系统通信。在需要时,也可用汇编语言或机器语言来实现程序代码。事实上,本技术中描述的机制不限于任何特定编程语言的范围。在任一情形下,该语言可以是编译语言或解释语言。[0173]在一些情况下,所公开的实施例可以以硬件、固件、软件或其任何组合来实现。所公开的实施例还可以被实现为由一个或多个暂时或非暂时性机器可读(例如,计算机可读)存储介质承载或存储在其上的指令,其可以由一个或多个处理器读取和执行。例如,指令可以通过网络或通过其他计算机可读介质分发。因此,机器可读介质可以包括用于以机器(例如,计算机)可读的形式存储或传输信息的任何机制,包括但不限于,软盘、光盘、光碟、只读存储器(cd-roms)、磁光盘、只读存储器(readonlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、可擦除可编程只读存储器(erasableprogrammablereadonlymemory,eprom)、电可擦除可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、磁卡或光卡、闪存、或用于利用因特网以电、光、声或其他形式的传播信号来传输信息(例如,载波、红外信号数字信号等)的有形的机器可读存储器。因此,机器可读介质包括适合于以机器(例如计算机)可读的形式存储或传输电子指令或信息的任何类型的机器可读介质。[0174]在附图中,可以以特定布置和/或顺序示出一些结构或方法特征。然而,应该理解,可能不需要这样的特定布置和/或排序。而是,在一些实施例中,这些特征可以以不同于说明性附图中所示的方式和/或顺序来布置。另外,在特定图中包括结构或方法特征并不意味着暗示在所有实施例中都需要这样的特征,并且在一些实施例中,可以不包括这些特征或者可以与其他特征组合。[0175]需要说明的是,本技术各设备实施例中提到的各单元/模块都是逻辑单元/模块,在物理上,一个逻辑单元/模块可以是一个物理单元/模块,也可以是一个物理单元/模块的一部分,还可以以多个物理单元/模块的组合实现,这些逻辑单元/模块本身的物理实现方式并不是最重要的,这些逻辑单元/模块所实现的功能的组合才是解决本技术所提出的技术问题的关键。此外,为了突出本技术的创新部分,本技术上述各设备实施例并没有将与解决本技术所提出的技术问题关系不太密切的单元/模块引入,这并不表明上述设备实施例并不存在其它的单元/模块。[0176]需要说明的是,在本专利的示例和说明书中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。[0177]虽然通过参照本技术的某些优选实施例,已经对本技术进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本技术的精神和范围。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献