发明内容
本发明提供一种卷积(convolution)设备、卷积方法、矩阵拆聚装置以及矩阵拆聚方法,以有效率地对矩阵执行步长大于1的卷积运算。
在根据本发明的实施例中,所述卷积设备用以进行步长(stride)大于1的卷积运算。卷积设备包括数据存储器、矩阵拆聚装置以及卷积运算装置。矩阵拆聚装置耦接至数据存储器。矩阵拆聚装置用以将存储在数据存储器的第一矩阵拆分(unknit)为s*s个第二矩阵或是将存储在数据存储器的s*s个第二矩阵聚合(knit)为第一矩阵,其中所述s为大于1的整数且为卷积运算的步长。所述第一矩阵被分为多个s*s子区域。在这些s*s子区域的每一个中的s*s个元素一对一地作为所述s*s个第二矩阵的一个元素。卷积运算装置耦接至数据存储器。卷积运算装置将用于对第一矩阵进行步长为s的卷积运算的卷积核(convolution kernel)根据所述s*s个元素拆分为s*s个子核,其中所述s*s个子核一对一地适用于所述s*s个第二矩阵。卷积运算装置使用所述s*s个子核的任一个对所述s*s个第二矩阵中的一个对应第二矩阵进行步长为1的卷积运算以产生第一运算结果。卷积运算装置累加所述s*s个第二矩阵的每一个的所述第一运算结果作为对第一矩阵进行步长为s的卷积运算的第二运算结果。
在根据本发明的实施例中,所述卷积方法用以进行步长大于1的卷积运算。卷积方法包括:由矩阵拆聚装置将存储在数据存储器的第一矩阵拆分为s*s个第二矩阵或是将存储在数据存储器的s*s个第二矩阵聚合为第一矩阵,其中所述s为大于1的整数且为卷积运算的步长,第一矩阵被分为多个s*s子区域,以及在所述多个s*s子区域的每一个中的s*s个元素一对一地作为所述s*s个第二矩阵的一个元素;由卷积运算装置将用于对第一矩阵进行步长为s的卷积运算的卷积核根据所述s*s个元素拆分为s*s个子核,其中所述s*s个子核一对一地适用于所述s*s个第二矩阵;由卷积运算装置使用所述s*s个子核的任一个对所述s*s个第二矩阵中的一个对应第二矩阵进行步长为1的卷积运算,以产生第一运算结果;以及由卷积运算装置累加所述s*s个第二矩阵的每一个的所述第一运算结果作为对第一矩阵进行步长为s的卷积运算的第二运算结果。
在根据本发明的实施例中,所述矩阵拆聚装置包括临时寄存器以及执行单元。临时寄存器用以从数据存储器读取第一矩阵或是s*s个第二矩阵。执行单元耦接至临时寄存器。执行单元用以将存储在临时寄存器的第一矩阵拆分为s*s个第二矩阵或是将存储在临时寄存器的s*s个第二矩阵聚合为第一矩阵,其中所述s为大于1的整数。第一矩阵被分为多个s*s子区域,以及在所述多个s*s子区域的每一个中的s*s个元素一对一地作为所述s*s个第二矩阵的一个元素。
在根据本发明的实施例中,所述矩阵拆聚方法包括:由临时寄存器从数据存储器读取第一矩阵或是s*s个第二矩阵;以及由执行单元将存储在临时寄存器的第一矩阵拆分为s*s个第二矩阵或是将存储在临时寄存器的s*s个第二矩阵聚合为第一矩阵,其中所述s为大于1的整数,第一矩阵被分为多个s*s子区域,以及在所述多个s*s子区域的每一个中的s*s个元素一对一地作为所述s*s个第二矩阵的一个元素。
基于上述,本发明诸实施例所述卷积设备先利用矩阵拆聚装置对矩阵进行拆聚。例如,矩阵拆聚装置可以将第一矩阵拆分为s*s个第二矩阵。或者,矩阵拆聚装置可以将s*s个第二矩阵聚合为第一矩阵。其中,所述s为卷积运算的步长且为大于1的整数。此外,卷积运算装置还可以将卷积运算的卷积核根据所述s*s个元素拆分为s*s个子核,其中这些子核一对一地适用于这些第二矩阵。基于第一矩阵与卷积核的拆分,卷积运算装置可以使用任一个子核对一个对应第二矩阵进行步长为1的卷积运算。卷积运算装置可以累加这些第二矩阵的每一个的运算结果作为对第一矩阵进行步长为s的卷积运算的运算结果。因此,所述卷积设备可以有效率地对矩阵执行步长大于1的卷积运算。
附图说明
图1是依照本发明的一实施例的一种卷积设备的电路方块(circuit block)示意图。
图2是依照本发明的一实施例的一种卷积方法的流程示意图。
图3是依照本发明的一实施例所绘示,一个8*8矩阵的具体范例示意图。
图4是依照本发明的一实施例所绘示,图3所示8*8矩阵被拆分为4个第二矩阵的具体范例示意图。
图5是依照本发明的一实施例所绘示,一个3*3矩阵的具体范例示意图。
图6是依照本发明的一实施例所绘示,图5所示3*3矩阵被拆分为4个子核的具体范例示意图。
图7是依照本发明的另一实施例所绘示,一个9*9矩阵的具体范例示意图。
图8是依照本发明的一实施例所绘示,图7所示9*9矩阵被拆分为9个第二矩阵的具体范例示意图。
图9是依照本发明的一实施例所绘示,图1所示矩阵拆聚装置的电路方块示意图。
图10是依照本发明的一实施例的一种矩阵拆聚方法的流程示意图。
图11是依照本发明的另一实施例的一种矩阵拆聚方法的流程示意图。
附图标记说明
100:卷积设备
110:矩阵拆聚装置
111:临时寄存器
112:执行单元
120:数据存储器
130:卷积运算装置
CK:卷积核
CK_1、CK_2、CK_3、CK_4:子核
CMD:指令
Ka、Kb、Kc、Kd、Ke、Kf、Kg、Kh、Ki:元素
LL:左下元素
LM:左中元素
LU:左上元素
M1、M3:第一矩阵
M2_1、M2_2、M2_3、M2_4、M4_1、M4_2、M4_3、M4_4、M4_5、M4_6、M4_7、M4_8、M4_9:经拆分矩阵(第二矩阵)
ML:中下元素
MM:中中元素
MU:中上元素
RL:右下元素
RM:右中元素
RU:右上元素
S210、S220、S230、S240、S1010、S1020、S1110、S1120:步骤。
具体实施方式
现将详细地参考本发明的示范性实施例,示范性实施例的实例说明于附图中。只要有可能,相同组件符号在附图和描述中用来表示相同或相似部分。
在本案说明书全文(包括权利要求)中所使用的“耦接(或连接)”一词可指任何直接或间接的连接手段。举例而言,若文中描述第一装置耦接(或连接)于第二装置,则应该被解释成该第一装置可以直接连接于该第二装置,或者该第一装置可以透过其他装置或某种连接手段而间接地连接至该第二装置。本案说明书全文(包括权利要求)中提及的“第一”、“第二”等用语是用以命名组件(element)的名称,而并非用来限制组件数量的上限或下限,亦非用来限制组件的次序。另外,凡可能之处,在附图及实施方式中使用相同标号的组件/构件/步骤代表相同或类似部分。不同实施例中使用相同标号或使用相同用语的组件/构件/步骤可以相互参照相关说明。
图1是依照本发明的一实施例的一种卷积(convolution)设备100的电路方块(circuit block)示意图。图1所示卷积设备100包括矩阵拆聚装置110、数据存储器120以及卷积运算装置130。矩阵拆聚装置110耦接至数据存储器120。矩阵拆聚装置110可以将存储在数据存储器120的第一矩阵拆分(unknit)为s*s个第二矩阵。或是,矩阵拆聚装置110可以将存储在数据存储器120的s*s个第二矩阵聚合(knit)为所述第一矩阵。其中,所述s为大于1的整数,且s为卷积运算装置130所进行的卷积运算的步长(stride)。卷积运算的步长s可以依照实际设计来决定。
图2是依照本发明的一实施例的一种卷积方法的流程示意图。请参照图1与图2。在步骤S210中,矩阵拆聚装置110可以将存储在数据存储器120的第一矩阵拆分为s*s个第二矩阵(或是将存储在数据存储器120的s*s个第二矩阵聚合为第一矩阵)。其中,所述第一矩阵被分为多个s*s子区域。所谓s*s子区域意指一个s*s子矩阵,亦即一个子区域具有s*s个元素。在这些s*s子区域的每一个中的s*s个元素一对一地作为这些第二矩阵的一个元素。举例来说,矩阵拆聚装置110可以从数据存储器120读取第一矩阵。矩阵拆聚装置110可以将所述第一矩阵切分为多个s*s子区域。矩阵拆聚装置110可以收集在这些s*s子区域中的一个相同位置的元素作为这些第二矩阵的其中一个的s*s个元素。因此,矩阵拆聚装置110可以将一个第一矩阵拆分为s*s个第二矩阵。矩阵拆聚装置110可以收集在这些s*s子区域中的一个相同位置的元素作为一个第二矩阵的s*s个元素。因此,矩阵拆聚装置110可以将一个第一矩阵拆分为s*s个第二矩阵。
作为实例,卷积运算的步长s可以是2。图3是依照本发明的一实施例所绘示,一个8*8矩阵的具体范例示意图。图3所示8*8矩阵可以作为第一矩阵M1。图3所示横轴标示了第一矩阵M1的列(column)序号1~8,而图3所示纵轴标示了第一矩阵M1的行(row)序号1~8。矩阵拆聚装置110可以从数据存储器120读取第一矩阵M1。基于卷积运算的步长s为2,矩阵拆聚装置110可以将第一矩阵M1切分为多个2*2子区域(亦即图3所示多个实线方框)。在这些2*2子区域中的一个相同位置被标示一个相同图式符号,而且在一个子区域中的不同位置被标示不同图式符号。在图3所示实施例中,在这些子区域(亦即图3所示实线方框)的每一个中的2*2个元素包括左上元素LU、右上元素RU、左下元素LL与右下元素RL。须注意的是,被标上相同图式符号(例如LU)的元素不代表具有相同(或不同)数值。图式符号LU、RU、LL与RL无关于元素数值。矩阵拆聚装置110可以收集在这些2*2子区域中的一个相同位置的元素作为一个第二矩阵的元素。因此,第一矩阵M1可以被拆分为2*2个第二矩阵。
图4是依照本发明的一实施例所绘示,图3所示8*8矩阵被拆分为4个第二矩阵的具体范例示意图。图4所示4个第二矩阵分别为经拆分矩阵M2_1、经拆分矩阵M2_2、经拆分矩阵M2_3与经拆分矩阵M2_4。这些经拆分矩阵M2_1~M2_4都是4*4矩阵。矩阵拆聚装置110可以收集在第一矩阵M1的这些2*2子区域中的相同位置的左上元素LU作为经拆分矩阵M2_1(第二矩阵)的元素。图4所示横轴标示了经拆分矩阵M2_1的列序号1~4,其中括号中的列序号表示图3所示第一矩阵M1的列序号。图4所示纵轴标示了经拆分矩阵M2_1的行序号1~4,其中括号中的行序号表示图3所示第一矩阵M1的行序号。经拆分矩阵M2_2、经拆分矩阵M2_3与经拆分矩阵M2_4可以参照经拆分矩阵M2_1的相关说明加以类推,故不再赘述。
请参照图1与图2。在步骤S220中,图1所示卷积运算装置130耦接至数据存储器120。卷积运算装置130可以将用于对第一矩阵进行步长为s的卷积运算的卷积核(convolution kernel)根据所述s*s个元素拆分为s*s个子核。其中,这些子核一对一地适用于所述s*s个第二矩阵。所述卷积核可以是一个矩阵。卷积核的列数量与行数量可以依照实际设计来决定。
作为实例,卷积运算的步长s可以是2,而所述卷积核可以是一个3*3矩阵。图5是依照本发明的一实施例所绘示,一个3*3矩阵的具体范例示意图。图3所示3*3矩阵可以作为卷积核CK。卷积核CK具有元素Ka、Kb、Kc、Kd、Ke、Kf、Kg、Kh与Ki。卷积核的这些元素Ka~Ki的数值可以依照实际设计来决定。卷积运算装置130可以将用于对第一矩阵M1进行步长为2的卷积运算的卷积核CK拆分为2*2个子核。
图6是依照本发明的一实施例所绘示,图5所示3*3矩阵被拆分为4个子核的具体范例示意图。在卷积运算的步长s为2的情况下,图5所示卷积核CK可以被拆分为图6所示4个子核,亦即子核CK_1、子核CK_2、子核CK_3与子核CK_4。子核CK_1为2*2矩阵且包含卷积核CK的左上元素Ka、右上元素Kc、左下元素Kg与右下元素Ki。子核CK_2为2*1矩阵且包含卷积核CK的中上元素Kb与中下元素Kh。子核CK_3为1*2矩阵且包含卷积核CK的左中元素Kd与右中元素Kf。子核CK_4为1*1矩阵包含卷积核CK的中中元素Ke。
请参照图1与图2。在步骤S230中,卷积运算装置130可以使用所述s*s个子核的任一个对所述s*s个第二矩阵中的一个对应第二矩阵进行步长为1的卷积运算,以产生第一运算结果。步长为1的卷积运算过程为公知运算,故在此不予赘述。在步骤S240中,卷积运算装置130可以累加所述s*s个第二矩阵的每一个的所述第一运算结果,并将累加结果作为对所述第一矩阵进行步长为s的卷积运算的运算结果(第二运算结果)。
作为实例,对图3所示第一矩阵M1所进行卷积运算的步长s可以是2,而所述卷积核可以是一个3*3矩阵。请参照图3至图6。卷积运算装置130可以使用图6所示子核CK_1对图4所示经拆分矩阵M2_1(对应第二矩阵)进行步长为1的卷积运算,以产生一个4*4矩阵(经拆分矩阵M2_1的第一运算结果)。步长为1的卷积运算过程为公知运算,故在此不予赘述。卷积运算装置130可以使用图6所示子核CK_2对图4所示经拆分矩阵M2_2(对应第二矩阵)进行步长为1的卷积运算,以产生另一个4*4矩阵(经拆分矩阵M2_2的第一运算结果)。卷积运算装置130可以使用图6所示子核CK_3对图4所示经拆分矩阵M2_3(对应第二矩阵)进行步长为1的卷积运算,以产生又一个4*4矩阵(经拆分矩阵M2_3的第一运算结果)。卷积运算装置130可以使用图6所示子核CK_4对图4所示经拆分矩阵M2_4(对应第二矩阵)进行步长为1的卷积运算,以产生再一个4*4矩阵(经拆分矩阵M2_4的第一运算结果)。卷积运算装置130可以累加这些经拆分矩阵M2_1~M2_4的这些第一运算结果,以产生一个4*4矩阵(累加结果)。卷积运算装置130可以将累加结果作为,使用图5所示卷积核CK对图3所示第一矩阵M1所进行步长为2的卷积运算的运算结果(第二运算结果)。
须强调的是,依照实际设计,卷积运算的步长s可以大于2。作为实例,卷积运算的步长s可以是3。图7是依照本发明的另一实施例所绘示,一个9*9矩阵的具体范例示意图。图7所示9*9矩阵可以作为第一矩阵M3。图7所示横轴标示了第一矩阵M3的列序号1~9,而图7所示纵轴标示了第一矩阵M3的行序号1~9。矩阵拆聚装置110可以从数据存储器120读取第一矩阵M3。基于卷积运算的步长s为3,矩阵拆聚装置110可以将第一矩阵M3切分为多个3*3子区域(亦即图7所示多个实线方框)。在这些3*3子区域中的一个相同位置被标示一个相同图式符号,而且在一个子区域中的不同位置被标示不同图式符号。在图7所示实施例中,在这些子区域(亦即图7所示实线方框)的每一个中的3*3个元素包括左上元素LU、中上元素MU、右上元素RU、左中元素LM、中中元素MM、右中元素RM、左下元素LL、中下元素ML与右下元素RL。须注意的是,被标上相同图式符号(例如LU)的元素不代表具有相同(或不同)数值。图式符号LU、MU、RU、LM、MM、RM、LL、ML与RL无关于元素数值。矩阵拆聚装置110可以收集在这些3*3子区域中的一个相同位置的元素作为一个第二矩阵的元素。因此,第一矩阵M3可以被拆分为3*3个第二矩阵。
图8是依照本发明的一实施例所绘示,图7所示9*9矩阵被拆分为9个第二矩阵的具体范例示意图。图8所示9个第二矩阵分别为经拆分矩阵M4_1、经拆分矩阵M4_2、经拆分矩阵M4_3、经拆分矩阵M4_4、经拆分矩阵M4_5、经拆分矩阵M4_6、经拆分矩阵M4_7、经拆分矩阵M4_8与经拆分矩阵M4_9。这些经拆分矩阵M4_1~M4_9都是3*3矩阵。矩阵拆聚装置110可以收集在第一矩阵M3的这些3*3子区域中的相同位置的左上元素LU作为经拆分矩阵M4_1(第二矩阵)的元素。图8所示横轴标示了经拆分矩阵M4_1的列序号1~3,其中括号中的列序号表示图7所示第一矩阵M3的列序号。图8所示纵轴标示了经拆分矩阵M4_1的行序号1~3,其中括号中的行序号表示图7所示第一矩阵M3的行序号。经拆分矩阵M4_2、经拆分矩阵M4_3、经拆分矩阵M4_4、经拆分矩阵M4_5、经拆分矩阵M4_6、经拆分矩阵M4_7、经拆分矩阵M4_8与经拆分矩阵M4_9可以参照经拆分矩阵M4_1的相关说明加以类推,故不再赘述。
图3与图4说明矩阵拆分操作的一个实施例,而图7与图8说明矩阵拆分操作的另一个实施例。对应于矩阵拆聚装置110的矩阵拆分操作,卷积运算装置130可以将卷积运算的卷积核CK拆分为s*s个子核,其中这些子核一对一地适用于不同经拆分矩阵(第二矩阵)。基于第一矩阵与卷积核CK的拆分,卷积运算装置可以使用任一个子核对一个对应第二矩阵进行步长为1的卷积运算。卷积运算装置可以累加这些第二矩阵的运算结果,作为使用卷积核CK对第一矩阵进行步长为s的卷积运算的运算结果。因此,所述卷积设备可以有效率地对矩阵执行步长大于1的卷积运算。从上述实施范例的相关说明可以类推,矩阵拆聚装置110可以将存储在数据存储器120的s*s个第二矩阵聚合(knit)为第一矩阵。举例来说,矩阵拆聚装置110可以从数据存储器120读取所述s*s个第二矩阵。矩阵拆聚装置110可以将所述第一矩阵切分为多个s*s子区域。矩阵拆聚装置110可以收集在所述s*s个第二矩阵中的一个相同位置的元素作为所述第一矩阵的这些s*s子区域的其中一个的元素,以将这些第二矩阵聚合为所述第一矩阵。
图9是依照本发明的一实施例所绘示,图1所示矩阵拆聚装置110的电路方块示意图。图1所示矩阵拆聚装置110包括临时寄存器111以及执行单元112。临时寄存器111可以从数据存储器120读取第一矩阵(例如图3所示第一矩阵M1或是图7所示第一矩阵M3)或是s*s个第二矩阵(例如图4所示第二矩阵M2_1~M2_4或是图8所示第二矩阵M4_1~M4_9)。执行单元112可以执行指令CMD。基于指令CMD的执行,执行单元112可以将存储在临时寄存器111的所述第一矩阵拆分为所述s*s个第二矩阵,或是将存储在临时寄存器111的所述s*s个第二矩阵聚合为所述第一矩阵。其中,所述s为大于1的整数。在其他实施例中,执行单元112可以通过其他控制方式将存储在临时寄存器111的所述第一矩阵拆分为所述s*s个第二矩阵,或是将存储在临时寄存器111的所述s*s个第二矩阵聚合为所述第一矩阵。
图10是依照本发明的一实施例的一种矩阵拆聚方法的流程示意图。请参照图9与图10。在步骤S1010中,临时寄存器111可以从数据存储器120读取第一矩阵(例如图3所示第一矩阵M1或是图7所示第一矩阵M3)。在步骤S1020中,执行单元112可以执行指令CMD,以将存储在临时寄存器111的所述第一矩阵拆分为s*s个第二矩阵(例如图4所示第二矩阵M2_1~M2_4或是图8所示第二矩阵M4_1~M4_9)。举例来说,执行单元112可以从临时寄存器111读取第一矩阵M1,然后将第一矩阵M1切分为多个s*s子区域(例如图3所示多个2*2子区域,亦即图3所示多个实线方框)。执行单元112可以收集在这些2*2子区域中的一个相同位置的元素,作为图4所示第二矩阵M2_1~M2_4的其中一个的元素。例如,执行单元112可以收集在第一矩阵M1的这些2*2子区域中的相同位置的左上元素LU作为经拆分矩阵M2_1(第二矩阵)的元素。因此,执行单元112可以将第一矩阵M1拆分为第二矩阵M2_1~M2_4。类似于对图3与图4的说明,时寄存器111以及执行单元112亦可以将图7所示第一矩阵M3拆分为图8所示第二矩阵M4_1~M4_9。
图11是依照本发明的另一实施例的一种矩阵拆聚方法的流程示意图。请参照图9与图11。在步骤S1110中,临时寄存器111可以从数据存储器120读取s*s个第二矩阵(例如图4所示第二矩阵M2_1~M2_4或是图8所示第二矩阵M4_1~M4_9)。在步骤S1120中,执行单元112可以执行指令CMD,以将存储在临时寄存器111的所述s*s个第二矩阵聚合为第一矩阵(例如图3所示第一矩阵M1或是图7所示第一矩阵M3)。举例来说,执行单元112可以从临时寄存器111读取第二矩阵M2_1~M2_4,然后将所述第一矩阵切分为多个s*s子区域。执行单元112可以收集在这些第二矩阵M2_1~M2_4中的一个相同位置的元素作为第一矩阵M1的这些s*s子区域的其中一个的元素。例如,执行单元112可以将第一矩阵M1的行列地址(1,1)、(1,2)、(2,1)与(2,2)定义为一个子区域(在此称为目标子区域)。执行单元112可以收集在这些第二矩阵M2_1~M2_4中的相同行列地址(1,1)的四个元素LU、RU、LL、与RL作为在第一矩阵M1的所述目标子区域中的左上元素LU、右上元素RU、左下元素LL与右下元素RL。因此,执行单元112可以将这些第二矩阵M2_1~M2_4聚合为第一矩阵M1。类似于对图3与图4的说明,时寄存器111以及执行单元112亦可以将图8所示第二矩阵M4_1~M4_9聚合为图7所示第一矩阵M3。
依照不同的设计需求,上述矩阵拆聚装置110、执行单元112以及(或是)卷积运算装置130的实现方式可以是硬件(hardware)、固件(firmware)、软件(software,即程序)或是前述三者中的多者的组合形式。以硬件形式而言,上述矩阵拆聚装置110、执行单元112以及(或是)卷积运算装置130可以实现于集成电路(integrated circuit)上的逻辑电路。上述矩阵拆聚装置110、执行单元112以及(或是)卷积运算装置130的相关功能可以利用硬件描述语言(hardware description languages,例如Verilog HDL或VHDL)或其他合适的编程语言来实现为硬件。举例来说,上述矩阵拆聚装置110、执行单元112以及(或是)卷积运算装置130的相关功能可以被实现于一或多个控制器、微控制器、微处理器、特殊应用集成电路(Application-specific integrated circuit, ASIC)、数字信号处理器(digitalsignal processor, DSP)、场可程序逻辑门阵列(Field Programmable Gate Array,FPGA)及/或其他处理单元中的各种逻辑区块、模块和电路。以软件形式及/或固件形式而言,上述矩阵拆聚装置110、执行单元112以及(或是)卷积运算装置130的相关功能可以被实现为编程码(programming codes)。例如,利用一般的编程语言(programming languages,例如C、C++或汇编语言)或其他合适的编程语言来实现上述矩阵拆聚装置110、执行单元112以及(或是)卷积运算装置130。所述编程码可以被记录/存放在「非临时的计算机可读取媒体(non-transitory computer readable medium)」中。在一些实施例中,所述非临时的计算机可读取媒体例如包括带(tape)、碟(disk)、卡(card)、半导体内存、可程序设计的逻辑电路以及(或是)存储装置。所述存储装置包括硬盘(hard disk drive,HDD)、固态硬盘(Solid-state drive,SSD)或是其他存储装置。中央处理器(Central Processing Unit,CPU)、控制器、微控制器或微处理器可以从所述非临时的计算机可读取媒体中读取并执行所述编程码,从而实现上述矩阵拆聚装置110、执行单元112以及(或是)卷积运算装置130的相关功能。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。