① 法拉克数控铣床的g代码。g代码的格式
FANUC 铣床编程--G 代码命令
1 G 代码组及其含义
“模态代码” 的功能在它被执行后会继续维持,而 “一般代码” 仅仅在收到该命令
时起作用。定义移动的代码通常是“模态代码”,像直线、圆弧和循环代码。反之,像原点
返回代码就叫“一般代码”。
每一个代码都归属其各自的代码组。在“模态代码”里,当前的代码会被加载的同组代
码替换。
[表 5.2-1] G 代码组及解释
( 带 * 者表示是开机时会初始化的代码。)
2 G 代码解释
快速定位(G00)
1. 格式
这个命令把刀具从当前位置移动到命令指定的位置 (在绝对坐标方式下), 或者移动到
某个距离处 (在增量坐标方式下)。
2. 非直线切削形式的定位
我们的定义是:采用独立的快速移动速率来决定每一个轴的位置。刀具路径不是直线,
根据到达的顺序,机器轴依次停止在命令指定的位置。
3. 直线定位
刀具路径类似直线切削(G01) 那样,以最短的时间(不超过每一个轴快速移动速率)定
位于要求的位置。
图5.2-1
4. 举例
N10 G00 X-100 Y-100 Z65
直线切削进给(G01)
1. 格式
这个命令将刀具以直线形式,按F代码指定的速率,从它的当前位置移动到程序要求的
位置。F 的速率是程序中指定轴速率的复合速率。
图5.2-2
2. 举例
G01 G90 X-50. F100;或
G01 G91 X30. F100;
G01 G90 X-50. Y30. F100;或
G01 G91 X30. Y15. Z0 F100;
G01 G90 X-50. Y30. Z15. F100;
圆弧切削 (G02/G03 G17/G18/G19)
1. 格式
圆弧所在的平面用G17, G18 和G19 指令来指定。但是,只要已经在先前的程序块里定
义了这些命令,也能够省略。圆弧的回转方向像下图表示那样,由 G02/G03 来指定。在圆弧回转方向指定后,指派切削终点坐标。 G90 是指定在绝对坐标方式下使用此命令;而 G91
是在指定在增量坐标方式下使用此命令。另外,如果G90/G91 已经在先前程序块里给出过,
可以省略。圆弧的终点用包含在命令施加的平面里的两个轴的坐标值指定 ( 例如,在 XY
平面里,G17 用 X, Y 坐标值 ) 。 终点坐标能够像 G00 和 G01 命令一样地设置。圆弧中
心的位置或者其半径应当在设定圆弧终点之后设置。圆弧中心设置为从圆弧起点的相对距
离,并且对应于 X,Y 和Z 轴表示为 I、 J 和 K。圆弧中心坐标值减去圆弧起点坐标值得
到的结果对应分配给 I、J、K。
2. 举例
图5.2-3
圆弧起点的 X 坐标值 ------------ 30.
圆弧中心的 X 坐标值 ------------ 10.
因此,“I” 就是 -20. (10 - 30 = -20)
圆弧起点的 Y 坐标值 ------------ 10.
圆弧中心的 Y 坐标值------------ 5.
因此,“J” 就是 -5. (5–10=-5)
结果,这个情况下圆弧编程指令如下所列:
G17 G03 G90 X5. Y25. I-20. J-5.;或者,
G17 G03 G91 X-25. Y15. I-20. J-5.;
或圆弧半径编程指令:
G17 G03 G90 X5. Y25. R20.616.;或者,
G17 G03 G91 X-25. Y15. R20.616;
注意 1)把圆弧中心设置为 “I”, “J” 和 “K”时,必须设置为圆弧起点到圆弧中心的
增量值。
注意 2)命令里的“I0”, “J0” 和 “K0” 可以省略。偏移值指定要求。
自动原点返回 (G28/G30)
1. 格式
第一原点返回:
第二、三和四原点返回:
#P2, P3, P4: 选择第二、第三和第四原点返回(如果被省略,系统自动选择第二原点返
回)。
由 X, Y 和 Z 设定的位置叫做中间点。机床先移动到这个点,而后回归原点。省略了
中间点的轴不移动;只有在命令里指派了中间点的轴执行其原点返回命令。在执行原点返回
命令时,每一个轴是独立执行的,这就像快速移动命令(G00)一样; 通常刀具路径不是直
线。因此,要求对每一个轴设置中间点,以免机床在原点返回时与工件碰撞等意外发生。
2. 举例
图5.2-4
G28 (G30) G90 X150. Y200.;或者
G28 (G30) G91 X100. Y150.;
注意:在所给例子里, 去中间点的移动就像下面的快速移动命令一样。
G00 G90 X150. Y200.;或者
G00 G91 X100. Y150.;
如果中间点与当前的刀具位置一致(例如,发出的命令是 - G28 G91 X0 Y0 Z0;),机
床就从其当前位置返回原点。如果是在单程序块方式下运行,机床就会停在中间点;当中间
点与当前位置一致,它也会暂时停在中间点(即,当前位置)。
刀具半径偏置功能 (G40/G41/G42)
1. 格式
当处理工件 (“A”) 时,就像下图所示,刀具路径 (“B”) 是基本路径,与工件
(“A”)的距离至少为该刀具直径的一半。此处,路径 “B” 叫做由 A 经 R 补偿的路径。
因此,刀具半径偏置功能自动地由编程给出的路径 A 以及由分开设置的刀具偏置值,计算
出补偿了的路径B。就是说,用户能够根据工件形状编制加工程序,同时不必考虑刀具直径。
因此,在真正切削之前把刀具直径设置为刀具偏置值;用户能够获得精确的切削结果,就是
因为系统本身计算了精确补偿的路径。
图5.2-5
在编程时用户只要插入偏置向量的方向 (举例说, G41:左侧, G42: 右侧)和偏置地
址 (例如, D2: 在“D” 后面是从 01 到 32 的两位数字)。所以用户只要输入偏移号码 D
(根据 MDI),只不过是由精确计算刀具直径得出的半径。
2. 偏置功能
表5.2-1
刀具长度偏置 (G43/G44/G49)
1. 格式
2. 偏置功能
首先用一把铣刀作为基准刀,并且利用工件坐标系的 Z 轴,把它定位在工件表面上,
其位置设置为 Z0。 (☼ 见 G92:坐标系设置)
请记住,如果程序所用的刀具较短,那么在加工时刀具不可能接触到工件,即便机床移
动到位置 Z0。反之,如果刀具比基准刀具长,有可能引起与工件碰撞损坏机床。为了防止
出现这种情况,把每一把刀具与基准刀具的相对长度差输入到刀具偏置内存,并且在程序里
让机床执行刀具长度偏置功能。
表5.2-2
在设置偏置的长度时,使用正/负号。如果改变了 (+/-) 符号, G43 和 G44 在执行时
会反向操作。因此,该命令有各种不同的表达方式。举例说:
首先,遵循下列步骤测量刀具长度:
1.把工件放在工作台上。
2.更换要测量的刀具
3.调整基准刀具轴线,使它接近工件;把该刀具的前端调整到工件表面上。
4.此时 Z 轴的相对坐标系的坐标作为刀具偏置值输入偏置菜单。
通过这么操作,如果刀具短于基准刀具时偏置值被设置为负值;如果长于基准刀具则为
正值。因此,在编程时仅有 G43 命令允许您做刀具长度偏置。
3. 举例
G00 ZO;
G00 G43 Z0 H01;
G00 G43 Z0 H03;或者
G00 G44 Z0 H02; 或者
G00 G44 Z0 H02;
G43, G44 或 G49 命令一旦被发出,它们的功能会保持着,因为它们是 “模态命令”。
因此, G43 或 G44 命令在程序里紧跟在刀具更换之后一旦被发出;那么 G49 命令可能在
该刀具加工结束,更换刀具调用。
注意 1) 在用 G43 (G44) H 或者用 G 49 命令的指派来省略 Z 轴移动命令时,, 偏置操作
就会像 G00 G91 Z0 命令指派的那样执行。也就是说,用户应当时常小心谨慎,因为它就像
有刀具长度偏置值那样移动。
注意 2) 用户除了能够用 G49 命令来取消刀具长度补偿,还能够用偏置号码 H0 的设置
(G43/G44 H0) 来获得同样效果。
注意 3) 若在刀具长度补偿期间修改偏置号码,先前设置的偏置值会被新近赋予的偏置值替
换。
选择机床坐标系 (G53)
1. 格式
2. 功能
刀具根据这个命令执行快速移动到机床坐标系里的 X_Y_Z 位置。由于 G53 是 “一般”
G 代码命令,仅仅在程序块里有 G53 命令的地方起作用。
此外,它在绝对命令 (G90) 里有效,在增量命令里 (G91) 无效。为了把刀具移动到机
床固有的位置,像换刀位置,程序应当用 G53 命令在机床坐标系里开发。
注意 (1) 刀具直径偏置、刀具长度偏置和刀具位置偏置应当在它的 G53 命令调用之前提前
取消。否则,机床将依照设置的偏置值移动。
注意 (2) 在执行G53 指令之前,必须手动或者用G28 命令让机床返回原点。这是因为机床
坐标系必须在G53 命令发出之前设定。
工件坐标系选择(G54~G59)
1. 格式
2. 功能
图5.2-6
通过使用 G54~G59 命令,最多可设置六个工件坐标系(1~6)。
在接通电源和完成了原点返回后,系统自动选择工件坐标系 1 (G54) 。它们均为模态
指令,执行某个坐标系命令后将保持其有效性,直到其它坐标系指令发出。
图5.2-7
高速深孔钻循环(G73)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
Q_:每次切削进给的切削深度(无符号,增量)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
进给孔底快速退刀。
图5.2-8
3. 例题
图5.2-9
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 钻头,
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50
N040 G98 G73 Z-30 R1 Q2 F200 ;深孔钻削,离工件表面1MM 处开始进给
每次切削2MM
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
攻左牙循环(G74)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
P_:暂停时间 (单位:毫秒)
F_:切削进给速度
K_:重复次数 (如果需要的话)
2. 功能
进给孔底主轴暂停正转快速退刀。
图5.2-10
3. 例题
如图5.2-10
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 钻头
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50
N040 G74 Z-30 R1 Q2 P2000 F200 ;攻牙循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
精镗孔循环(G76)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
Q_:孔底的偏移量
P_:暂停时间 (单位:毫秒)
F_:切削进给速度
K_:重复次数 (如果需要的话)
2. 功能
进给孔底主轴定位停止快速退刀。
3. 例题
如图5.2-9
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 钻头
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50
N040 G98 G76 Z-30 R1 Q2 P2000 F200 ;镗孔循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
取消固定循环进程 (G80)
1. 格式
2. 功能
这个命令取消固定循环,机床回到执行正常操作状态。孔的加工数据,包括 R 点, Z 点
等等,都被取消;但是移动速率命令会继续有效。
注意: 要取消固定循环方式,用户除了发出G80 命令之外,还能够用 G 代码 01 组 (G00,
G01, G02, G03 等等) 中的任意一个命令。
定点钻孔循环(G81)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-11
G81 命令可用于一般的孔加工。
3. 例题
如图5.2-11
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 钻头
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50
N040 G98 G81 Z-30 R1 F200 ;钻孔循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
钻孔循环(G82)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
P_:在孔底的暂停时间 (单位:毫秒)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-12
G82 钻孔循环,反镗孔循环
3. 例题
图5.2-13
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 钻头
N030 G43 H1 Z50
N040 G98 G82 Z-30 R1 P2000 F200 ;钻孔循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
深孔钻削循环(G83)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
Q_:每次切削进给的切削深度
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-14
G83 中间进给孔底快速退刀。
3. 例题
如图5.2-14
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 钻头
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50
N040 G98 G83 Z-30 R1 Q2 F200 ;深孔钻循环,每次钻2MM
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
攻牙循环(G84)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
P_:暂停时间(单位:毫秒)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-15
G84 进给孔底主轴反转快速退刀。
3. 例题
图5.2-16
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 丝攻
N010 G55 ;调用G55 工件坐标系
N020 M03 S800
N030 G43 H1 Z50 ;调用长度补偿
N040 G84 Z-30 R5 P2000 F2 ;攻牙循环
N050 G80 Z50 ;取消固定循环
N060 M05
N070 M30
镗孔循环(G85)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-17
G85 中间进给孔底快速退刀。
3. 例题
如图5.2-17
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 镗刀
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50 ;调用长度补偿
N040 G85 Z-30 R1 F200 ;镗孔循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
镗孔循环(G86)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-18
G86 进给孔底主轴停止快速退刀。
3. 例题
如图5.2-18
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 镗刀
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50 ;调用长度补偿
N040 G86 Z-30 R1 F200 ;镗孔循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
反镗孔循环(G81)
1. 格式
X_ Y:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
Q_:刀具偏移量
P_:暂停时间(单位:毫秒)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-19
G87 进给孔底主轴正转快速退刀。
3. 例题
如图5.2-19
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 镗刀
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50 ;调用长度补偿
N040 G87 Z-30 R1 Q2 P2000 F200 ;反镗孔循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
定点钻孔循环(G88)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
P_:孔底的暂停时间(单位:毫秒)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-20
G88 进给孔底暂停,主轴停止快速退刀。
3. 例题
如图5.2-20
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 钻头
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50 ;调用长度补偿
N040 G88 Z-30 R1 P2000 F200 ;定点钻孔循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
镗孔循环(G89)
1. 格式
X_ Y_:孔位数据
Z_:孔底深度(绝对坐标)
R_:每次下刀点或抬刀点 (绝对坐标)
P_:孔底的停刀时间(单位:毫秒)
F_:切削进给速度
K_:重复次数(如果需要的话)
2. 功能
图5.2-21
G89 进给孔底暂停快速退刀。
3. 例题
如图5.2-21
N005 G80 G90 G0 X0 Y0 M06 T1 ;换 Ø20 镗刀
N010 G55 ;调用G55 工件坐标系
N020 M03 S1000
N030 G43 H1 Z50 ;调用长度补偿
N040 G89 Z-30 R1 P2000 F200 ;镗孔循环
N050 G80 G0 Z50 ;取消固定循环
N060 M05
N070 M30
绝对命令/增量命令 (G90/G91)
此命令设定指令中的 X, Y 和 Z 坐标是绝对值还是相对值,不论它们原来是绝对命令
还是增量命令。含有 G90 命令的程序块和在它以后的程序块都由绝对命令赋值; 而带 G91
命令及其后的程序块都用增量命令赋值。
② 起重机重量限制器如何设定
首先,需要有个知道重量的重物,清零。
1、按住设置键3秒,显示为H0,按确认;
2、同时按住3秒,0000;
3、长按确认键;吊起重物;
4、按设置键3秒,显示H0;
5、按 +键 ,H2,按确认;
6、用来调整重量;
7、长按确认键;
8、完毕。
③ 常见的无脊椎动物有什么
常见的无脊椎动物有:
1、原生动物,如草履虫、变形虫等单细胞动物。
原生动物门(Protozoa)是动物界的1门,为最原始、最简单、最低等的动物。
2、腔肠动物,如水螅、海葵、海蜇等。
刺胞动物门(Cnidaria)又称刺细胞动物门,过去称为腔肠动物门(Coelenterata),因为它的含义适用于刺胞动物及栉水母动物,所以现多已废弃不用;刺胞动物体呈辐射或两辐射对称,仅具二胚层,是最原始的后生动物。
3、扁形动物,如涡虫、绦虫、血吸虫等。
扁形动物门是动物界的一个门,无脊椎动物,是一类两侧对称,三胚层,无体腔,无呼吸系统、无循环系统,有口无肛门的动物。
4、线形动物,如蛔虫、线虫等。
Nemathelminthes 旧称“圆形动物门”,动物界的一门。大部分为小形的蠕形动物,体通常呈长圆柱形,两端尖细,不分节,具原体腔,消化道不弯曲,前端为口,后端为肛门,雌雄异体。
5、环节动物,如蚯蚓、沙蚕等。
环节动物门(学名:Annelida)在动物进化上发展到一个较高的阶段,是高等无脊椎动物的开始,约有9,000种。体外有由表皮细胞分泌的角质膜,体壁有一外环肌层和一内纵肌层。通常有几丁质的刚毛,按节排列。
扩展材料:
地球上无脊椎动物的出现至少早于脊椎动物1亿年。大多数无脊椎动物化石见于古生代寒武纪,当时已有节肢动物的三叶虫及腕足动物。随后发展了古头足类及古棘皮动物的种类。到古生代末期,古老类型的生物大规模绝灭。
中生代还存在软体动物的古老类型(如菊石),到末期即逐渐绝灭,软体动物现代属、种大量出现。到新生代演化成现代类型众多的无脊椎动物,而在古生代盛极一时的腕足动物至今只残存少数代表(如海豆芽)。
④ 拉法拉利是什么车
LaFerrari是法拉利推出的一款旗舰级超级跑车。
于2013年3月在日内瓦车展首次亮相,以取代法拉利Enzo车型,仅限量499台。LaFerrari拥有超凡极致的性能表现、空气动力效率以及操控性,为超级跑车树立了新的标杆。
LaFerrari采用被称为HY-KERS的混合动力系统,一台6.3升V12自然吸气引擎可输出588千瓦的最大功率,电动机独立输出120千瓦动力,使得LaFerrari的联合输出功率高达708千瓦。LaFerrari的0-100km/h加速时间<3 秒,0-200km/h加速<7 秒,0-300km/h更只需15秒,极速高达350km/h以上。
laferrari由来:
“La”是意大利语里的定冠词,跟英语中“the”一样,所以LaFerrari按照字面上来说就是theFerrari的意思,法拉利的人说,之所以起这个名字,是因为他们认为法拉利就该是这个样子,所以这就是法拉利,这是法拉利的代表。
就像是国外称呼某某一家人,比如说詹姆斯一家人,他们会说“the James”,所以LaFerrari的意思自然就是代表了法拉利整个家族,LaFerrari就是法拉利,不仅仅只是一个车型而已。
⑤ 各晶系晶体定向、单形及聚形分析举例
1.等轴晶系
等轴晶系晶体的对称特点是皆有4L3;在不同的晶类中,分别选择相互垂直且彼此相等的三个 L 4 或或L2 为晶轴。晶体常数特点是 a=b=c,α=β=γ=90°。
(1)六八面体晶类(m3 m):其对称要素的赤平投影如图 5-15。投影图的最小重复单位是以 L4、L3、L2 为角顶的三角形(图中以斜线标出)。据此,可以看出单形原始晶面与对称要素和晶轴的相对位置共有7种(三角形的3个角顶、3条边上和三角形内),从而可导出7种单形。当原始晶面垂直 L4、L3 和L 2时,可分别导出立方体{100}、八面体{111}和菱形十二面体{110},它们在固定的投影位置(分别在重复三角形的 3 个角顶)和具有固定的晶面指数,为定形。原始晶面垂直一个对称面时,其位置可能有3种,它们的投影点分别位于三角形的3个边上,所导出的单形为四六面体{hk 0}、四角三八面体{hkk}和三角三八面体{hhl},这三种单形的投影点的位置可分别沿着最小重复三角形的3条边移动,从而使单形的面角和晶面指数也相应地改变,为变形。如四角三八面体{hkk}的投影点可以沿 L 4 和 L 3 为端点的三角形的一个边移动,晶面指数可以为{211}、{311}(见图 5-16)等等,面角也相应地改变,如211∧21=48°11′30″,211∧121=33°33′30″;311∧31=35° 5′45″,311∧131=50°28′45″。晶面指数{hkk}和形态的变化介于立方体{100}和八面体{111}(该两单形的投影点位于此三角形边的两个端点)之间,当指数 k 值逐渐增大至 k=h 时,形号变为{111}即八面体,当 k 值逐渐缩小至 k=0时,形号变为{100}即立方体。同理,三角三八面体{hhl}在菱形十二面体{110}和八面体{111}之间变化,四六面体{hk 0}在立方体{100}和菱形十二面体{110}之间变化。投影点位于三角形之中的六八面体{hkl},当然也是变形,它的晶面指数和面角有更广泛的变化范围,晶面不与任何要素垂直或平行,为本晶类的一般形。
图5-15 六八面体晶类对称要素及单形的赤平投影
(2)六四面体晶类:与六八面体晶类相比,取消了相互垂直并分别平行(100)、(010)和(001)的3个对称面。由赤平投影图(图5-17)不难看出,由于这3个对称面的取消,则由它们分割成的8个象限的晶面将相间发育。这样,除投影点位于象限界面上(即晶面垂直被取消的对称面)的3处单形立方体{100}、菱形十二面体{110}和四六面体{hk 0}保持不变外,其余四个单形都只能发育为半面象,即形号为{111}、{hkk}、{hhl}、{hkl}的单形,原来的六八面体晶类为八面体、四角三八面体、三角三八面体、六八面体,现发育成它们的半面象四面体、四角三四面体、三角三四面体、六四面体,并均有正负形之分。如八面体{111}具有8个晶面,而它的半面象正四面体{111}和负四面体各有4个晶面(图5-18)。值得指出的是正负形与左右形不同的是它们只有定向上的不同而没有形态上的差异。有时在同一晶体上可以有正形和负形同时存在而组成聚形 〔图4-1(a)〕,但两者晶面的性质不同,即正负四面体的聚形,不与八面体等同。
图5-16 四角三八面体(示两个变形)
图5-17 六四面体晶类对称要素及单形的赤平投影
(3)偏方复十二面体晶类(m3):与六八面体晶类对比,取消了 6 个轴间(二晶轴之间)对称面和6个两次轴,从而使作为晶轴的原3个四次轴变为两次轴。从赤平投影图(表 4-2)不难看出,晶面与所取消的对称面垂直的立方体{100}、八面体{111}、菱形十二面体{110}和六八面体{hkl}的晶面是分布在本晶类所取消的对称面两侧,只能发育半面象,即出现五角十二面体{hk 0}和偏方复十二面体{hkl},且它们都有正负形之分。图5-11绘出了五角十二面体的正形与负形。
图5-18 正四面体(a)、负四面体(b)、八面体与四面体晶面对比(c)
聚形分析举例 在图5-19中列举了六八面体晶类(a)、(b)、(c)、偏方复十二面体晶类(d)、(e)和六四面体晶类(f)的聚形。
2.四方晶系
以惟一的四次轴做 Z 轴,以垂直 Z 轴并相互垂直的二次轴或对称面法线或晶棱方向为 X、Y 轴。晶体常数的特点是 a=b≠c,α==γ=90°。
复四方双锥晶类(4/mmm):本晶类对称要素和单形原始晶面的赤平投影如图5-20,阴影标出了最小重复单位,即以 L4 和两个 L2 的出露点为角顶的三角形。单形原始晶面投影点有 7 种可能位置,它们是重复三角形的三个角顶{001}、{110}、{100},三条边{hk 0}、{hhl}、{h 0 l}和三角形内{hkl}。垂直Z 轴的晶面的投影点位于基圆中心,导出单形平行双面{001};垂直做为 X、Y轴夹角分角线的 L 2的晶面导出第一四方柱{110};垂直 X 轴(或 Y 轴)的晶面导出第二四方柱{100};这3种单形的投影点固定在重复三角形的角顶上是为定形。平行 Z 轴,其投影点位于四方柱{110}和{100}之间的基圆上的晶面导出单形复四方柱{hk 0};与 Z 轴斜交,投影点位于第一四方柱{110}和平行双面{001}之间的直线上的晶面导出第一四方双锥{hhl}(包括{111});与 Z 轴斜交,投影点位于第二四方柱{100}与平行双面{001}之间的直线上的晶面导出第二四方双锥{h 0 l}(包括{101});与 X、Y、Z 轴均斜交,不与任何对称要素平行或垂直、投影点位于重复三角形之内的晶面,导出单形复四方双锥{hkl},它是本晶类的一般形,以上4种单形为变形。
图5-19 等轴晶系聚形举例
四方晶系共有7个晶类,复四方双锥晶类对称程度最高。在其他晶类中由于对称要素相对地减少,从而所导出的某些单形可视为上述单形的半面象。如在水平对称面和 L2被取消的晶类(4、4 mm)中,出现了与上述双锥对应的单锥,与上述平行双面对应的单面;在只有对称轴的组合而无对称面的晶类(42)中,出现了复四方双锥的半面象———四方偏方面体{hkl},它有左右形之分;在 Z 轴为的晶类中,8个象限(由晶轴划分)的晶面相间地出现,从而形成了四方双锥的半面象———正负四方四方体,在对称型中出现了复四方双锥的半面象———复四方偏三角面体{hkl};在无平行 Z 轴的对称面的晶类(4/m)中出现复四方柱的半面象———第三四方柱{hk 0},复四方双锥的半面象———第三四方双锥{hkl},第一、第二、第三四方柱横切面方位的对比见图5-21;同理,在对称型4中出现第三四方柱{hk 0},对称型中出现第三四方柱{hk 0}和复四方双锥的四分之一面象———第三四方四面体{hkl}。
依据各对称型对称要素赤平投影图(表4-2)和各晶类单形表(表5-4),可进行四方晶系各晶类单形推导。
图5-20 复四方双锥晶类对称要素及单形的赤平投影
图5-21 三种四方柱的横切面对比
从上述赤平投影的重复三角形的分析,我们获得了四方晶系单形的7种可能形号。对四方晶系单形表(表5-4)进行横向观察,可总结出各形号可能代表的单形。{001}:平行双面、单面;{110}:(第一)四方柱;{100}:(第二)四方柱;{hk 0}:复四方柱、(第三)四方柱;{hhl}:(第一)四方双锥、(第一)四方单锥、(第一)四方四面体;{h0 l}:(第二)四方双锥、(第二)四方单锥、(第二)四方四面体;{hkl}:复四方双锥、复四方单锥、四方偏方面体、(第三)四方双锥、(第三)四方单锥、(第三)四方四面体、复四方偏三角面体。
聚形分析举例 图5-22列出复四方双锥晶类的4个聚形。
3.三方晶系及六方晶系
三方晶系有一个 L3;六方晶系有一个 L6 或。根据晶体对称的特点,三、六方晶系要选择四个晶轴,以惟一的高次轴(L3、L6、)为 Z 轴,另以垂直Z 轴并彼此相交的三个 L2或 P 的法线或平行晶棱的方向为 X、Y、U 轴。Z 轴直立,X 轴斜向观察者的左前方(前端为正),U 轴斜向观察者的右前方(后端为正),Y 轴呈左右方向。三个水平轴的正端交角均为120°,它们所居的平面与Z 轴垂直。晶体常数特点为 a=b≠c,α=β=90°,γ=120°。
图5-22 四方晶系聚形举例
图5-23是复六方双锥晶类(6/mmm)对称要素的赤平投影图,阴影标出了其重复三角形,三角形系以晶轴 Z和做为 X 与夹角分角线的 L2 的出露点为角顶的。根据三角形的3个角顶、3条边和三角形内等7种单形原始晶面的投影位置,从而导出了三方晶系和六方晶系单形的7种可能形号。
根据表4-2所列的赤平投影图和单形名称表(表5-5、表5-6),用上述同样的方法,可以导出三方和六方晶系各晶类所属单形。概略说来,在对称型中若为高次轴与垂直它的对称面或二次轴组合时,可以导出双锥;若高次轴单独出现或只与平行它的对称轴组合时,将导出单锥;若高次轴只与垂直它的二次轴组合时,导出偏方面体;在含有的对称型中,出现菱面体,若有对称面包含,还可以导出复三方偏三角面体。
对表5-5、表5-6进行横向观察,可以总结出三方、六方晶系7种可能形号可能代表的单形。
(1)晶面垂直 Z 轴,即形号为{0001}的单形为平行双面或单面。
晶面平行Z轴的位置有以下3种,它们导出3种形号的单形:
(2)晶面平行Z轴和一个水平轴,此时,晶面截另两水平轴必定等长,形号为。单形可能为:第一六方柱、第一三方柱。
(3)晶面平行Z轴并垂直一个水平轴,此时晶面截另两水平轴亦必定等长,形号为。可能导出的单形为:第二六方柱、第二三方柱。
图5-23 复六方双锥晶类对称要素及单形的赤平投影图
(4)晶面平行 Z 轴并截三个水平轴不等长,形号为。可能导出的单形为:第三六方柱、第三三方柱、复六方柱、复三方柱。
第一、第二和第三六方柱的相对位置如图5-24所示。
图5-24 三种六方柱横切面的对比
与上述柱面的3种位置相应,而与Z轴斜交的晶面也有如下3种位置:
(5)晶面与Z轴斜交,与一个水平轴平行,此时晶面截另两个水平轴必定等长,形号为}(包括。单形可能为:第一六方双锥、第一六方单锥、第一三方双锥、第一三方单锥、第一菱面体。
(6)晶面与Z轴斜交,并截两个水平轴相等,设其截距为1,则在另一水平轴上的截距为1/2,形号为(包括)。可能的单形为:第二六方双锥、第二六方单锥、第二三方双锥、第二三方单锥、第二菱面体。
(7)晶面与 Z 轴斜交,并截3水平轴不等长,形号为。可能的单形为:第三六方双锥、第三六方单锥、第三三方双锥、第三三方单锥、第三菱面体、复六方双锥、复六方单锥、复三方双锥、复三方单锥、复三方偏三角面体、六方偏方面体、三方偏方面体,共12种单形。它们是其所属晶类的一般形。
聚形分析举例 图5-25列出了复六方双锥晶类(a)和复三方偏三角面体晶类(b)、(c)、(d)的4种聚形。
图5-25 三方、六方晶系聚形举例
4.斜方晶系
斜方晶系无高次轴,L2或P多于一个。以相互垂直的3L2为X、Y、Z轴;对于L22P对称型,以L2为Z轴,P的法线为X、Y轴。晶体常数特点是:a≠b≠c,α=β=γ=90°
应当指出对属于 mmm和222两个对称型的晶体来说,符合上述原则的定向方法可以有六种。如图5-26所示,同样一斜方晶胞,可以出现6种不同的定向。定向不同,a、b、c 相互颠倒,轴率数字不同(一般轴率以 b 做为1),晶面符号各异。以重晶石为例,图 5-27 表示了它的两种定向和形号,在第一种定向(a)中,轴率 a∶b∶c=1.6304∶1∶1.3136;在第二种定向(b)中,轴率 a∶b∶c=1.2412∶1∶0.7612。
图5-26 斜方晶系中的6种不同定向
图5-27 重晶石的两种定向
图5-28 斜方晶系聚形举例
斜方晶系单形及形号,它们在各晶类中的分布参看表5-3。各对称型对称要素及一般形的赤平投影见表4-2。
单面{001}、双面{0 kl}或{h 0 l}:在本晶系只见于斜方单锥(mm)晶,类。
图5-29 单斜晶系聚形举例
图5-30 三斜晶系聚形举例
平行双面{100}、{010}、{001}:可以垂直于任一晶轴出现。它可以在本晶系所有晶类中出现。
斜方柱{0 kl}、{h 0 l}、{hk 0}:可以平行于任一晶轴出现,亦见于本晶系所有晶类。柱面角不定,相间地相等,横切面呈菱形。
斜方双锥、斜方单锥和斜方四面体:它们的形号皆为{hkl},为一般形:分别仅见于本晶系斜方双锥晶类(mmm)、斜方单锥晶类(mm)和斜方四面体晶类(222)。
聚形分析举例 图5-28列出了斜方双锥晶类的三种聚形。
5.单斜晶系
单斜晶系无高次轴,L2和P不多于一个。以L2或P的法线为Y轴,以垂直Y轴的两晶棱方向为X、Z轴。晶体常数特点是:a≠b≠c,α=γ=90°,β>90°。
单斜晶系单形及形号在各晶类的分布见表5-2。各对称型对称要素及一般形的赤平投影见表4-2。在 L2 和 P 对称型中有许多种方位的单面、双面和平行双面;在 L 2 PC 对称型中则仅有斜方柱{hkl}、{0 kl}、{hk 0}和平行双面{h 0 l}、{100}、{010}、{001}。
聚形分析举例 图5-29列出了斜方柱晶类的3种聚形。
6.三斜晶系
三斜晶系无对称轴和对称面。单面晶类从晶体外形来看不对称,但它内部具有格子构造,从这种意义来说,本类晶体还是具有对称性的。选不在一个平面上,且近于垂直的3个晶棱的方向为X、Y、Z轴。晶体常数特点是:a≠b≠c,α≠β≠γ≠90°。
单形及形号在各晶类中的分布见表5-1。对称要素和一般形的赤平投影见表4-2。
单面仅见于单面晶类(1);平行双面仅见于平行双面晶类。
如图5-30列出了平行双面晶类的两个聚形。
⑥ 现浇箱梁底板混凝土标高怎么控制措施
焊钢筋,拉线控制,或者激光水平仪控制。
⑦ 如何效验双法兰液位变送器
要确定这个双法兰变送器的零点、量程是否准确,这个校准比较好办,零点就是液位为零的时候差压变送器的差压也就是负压侧毛细管产生的压力,这个只要在现场把正负压侧切出排污通大气即可知道。满程的校准这个要根据被测介质的密度及最高液位产生的压力把其与零点相加的出得差压值,这个可以用太高正压侧法兰的办法进行校准,也可以用压力校准仪器进行。
变送器(transmitter)是把传感器的输出信号转变为可被控制器识别的信号(或将传感器输入的非电量转换成电信号同时放大以便供远方测量和控制的信号源)的转换器。传感器和变送器一同构成自动控制的监测信号源。不同的物理量需要不同的传感器和相应的变送器。变送器的种类很多,用在工控仪表上面的变送器主要有温度变送器、压力变送器、流量变送器、电流变送器、电压变送器等等。
⑧ 前端说的MDN是什么意识,全称是什么
Mozilla 开发者社区(MDN)是一个完整的学习平台,你可以在这里深入学习Web技术以及能够驱动Web的软件,包括:
网络标准(例如:CSS、HTML 和 JavaScript)
开发开放网络应用
开发 Firefox 附加组件。
前端即网站前台部分,运行在PC端,移动端等浏览器上展现给用户浏览的网页。随着互联网技术的发展,HTML5,CSS3,前端框架的应用,跨平台响应式网页设计能够适应各种屏幕分辨率,合适的动效设计,给用户带来极高的用户体验。
HTML、CSS、JavaScript这三个是前端开发中最基本也是最必须的三个技能。前端的开发中,在页面的布局时, HTML将元素进行定义,CSS对展示的元素进行定位,再通过JavaScript实现相应的效果和交互。虽然表面看起来很简单,但这里面需要掌握的东西绝对不会少。在进行开发前,需要对这些概念弄清楚、弄明白,这样在开发的过程中才会得心应手。
HTML
指的是超文本标记语言 (Hyper Text Markup Language),这个也是我们网页最常用普通的语言了,经历了多个版本的发展,已经发展到5.0版了,得力于W3C建立的标准和规范
⑨ 七年级下册英语语法知识人教版
1,,, http://wenku..com/view/96ed37225901020207409c2b.html12, 七年级下册英语语法点总结(1)
七年级下册英语语法点总结(1)
分类:英语学习
Unit 1 Where’s your pen pal from?
一.短语:
1 .be from = come from 来自于----
2. live in 居住在---
3. on weekends 在周末
4 .write to sb = write a letter to sb 给某人写信;写信给某人
5 .in the world 在世界上 in China 在中国
6.pen pal 笔友 14 years old 14岁 favorite subject 最喜欢的科目
7.the United States 美国 the United Kingdom 英国 New York 纽约
8.speak English 讲英语 like and dislike 爱憎
9.go to the movies 去看电影 play sports 做运动
二.重点句式:
1 Where’s your pen pal from? = Where does your pen pal from/
2 Where does he live?
3 What language(s) does he speak?
4 I want a pen pal in China.
5 I can speak English and a little French.
6 Please write and tell me about yourself.
7 Can you write to me soon?
8 I like going to the movies with my friends and playing sports.
三.本单元的国家,人民、语言对应。
1 Canada---- Canadian---- English / French
2 France------ French------French
3 Japan------Japanese----Japanese
4 Australia----Australian----- English
5 the United States------ American---- English
6 the United Kingdom---British----- Enghish
Unit 2 Where’s the post office?
一. Asking ways: (问路)
1. Where is (the nearest) ……? (最近的)……在哪里?
2. Can you tell me the way to ……? 你能告诉我去……的路吗?
3. How can I get to ……? 我怎样到达……呢?
4. Is there …… near here / in the neighborhood? 附近有……吗?
5. Which is the way to ……? 哪条是去……的路?
二.Showing the ways: (指路)
1. Go straight down / along this street. 沿着这条街一直走。
2. Turn left at the second turning. 在第二个路口向左转。
3. You will find it on your right. 你会在你右手边发现它。
4. It is about one hundred metres from here. 离这里大约一百米远。
5. You’d better take a bus. 你最好坐公交车去。(You’d better+动词原形)
三.词组
1. across from …… 在……的对面 across from the bank 在银行的对面
2. next to…… 紧靠…… next to the supermarket 紧靠超市
3. between……and…… 在……和……之间
between the park and the zoo 在公园和动物园之间
among 表示位于三者或三者以上之间
4. in front of…… 在……前面 There is a tree in front of the classroom.
课室前面有棵树。
in the front of…… 在……(内)的前部 There is a desk in the front of the classroom.
课室内的前部有张桌子。
5. behind…… 在……后面 behind my house 在我家后面
6. turn left/ right 向左/右拐
on the left/right of…… 在某物的左/右边 on the left of our school 在我们学校的左边
on one’s left/right 在某人的左/右边 on my left 在我左边
7. go straight 一直走
8. down /along…… 沿着……(街道) down/along Center Street 沿着中央街
9. in the neighborhood=near here 在附近
10 welcome to…… 欢迎来到……
11. take /have a walk 散步
12. the beginning of…… ……的开始,前端
at the beginning of…… 在……的开始,前端
in the beginning 起初,一开始
13. have fun=have a good time=enjoy oneself 玩得开心,过得愉快
我昨天玩得很开心。 I had fun yesterday.
I had a good time yesterday.
I enjoyed myself yesterday.
14. have a good trip 旅途愉快
15. take a taxi 坐出租车
16. 到达:get to +地方 get here/ there/ home 到这/那/家
arrive in +大地方 I arrive in Beijing.
arrive at +小地方 I arrive at the bank.
reach +地方
17.go across 从物体表面横过 go across the street 横过马路
go through 从空间穿过 go through the forest 穿过树林
18.on + 街道的名称。 Eg: on Center Street
at + 具体门牌号+街道的名称 Eg: at 6 Center Street
三.重难点解析
1.enjoy doing sth 享受做某事的乐趣,喜爱做某事
I enjoy reading. 我喜爱读书。
到目前为止,我们学了两个特殊的动词finish和enjoy,都是要带 doing.
I finish cleaning the room. 我扫完了这间屋子。
2.hope to do sth 希望做某事 I hope to pass this exam. 我希望通过这次考试。
hope +从句 I hope tomorrow will be fine. 我希望明天将会晴朗。
(从句即是一个小句子,这个小句子又放在大句子中,从属于大句子,所以叫从句。如tomorrow will be fine是一个从句,它又放在I hope 的后面,形成句中有句。)
3. if 引导一个表示假设的句子。
If I have much money, I will go to the moon. 如果我有许多钱,我就会去月球。
If you are hungry, you can buy some food in the supermarket.
如果你饿了的话,你可以在超市买一些食物。
四.本单元的反义词、近义词配对
1new—old 2 quiet--- busy 3 dirty--- clean 4 big---- small
Unit 3 Why do you like koala bears?
一.重点词组
eat grass eat leaves be quiet very shy very smart very cute
play with her friends kind of South Africa other animals
at night in the day every day ring the day
二. 交际用语
1. Why do you like pandas? Because they’re very clever.
2. Why does he like koalas? Because they’re kind of interesting.
3. Where are lions from? They are from South Africa.
4. What other animals do you like?
I like dogs, too.
Why?
Because they’re friendly and clever.
5. Molly likes to play with her friends and eat grass.
6. She’s very shy.
7. He is from Australia.
8.He sleeps ring the day, but at night he gets up and eats leaves.
9.He usually sleeps and relaxes 20 hours every day.
10.Let’s see the pandas first.
11.They’re kind of interesting.
12.What other animals do you like?
13.Why do you want to see the lions?
三. 重点难点释义
1、kind of 有点,稍微
Koala bears are kind of shy. 考拉有点害羞。
kind 还有“种类”的意思
如:各种各样的 all kinds of
We have all kinds of beautiful flowers in our school.
2、China n. 中国 Africa n. 非洲
China 和Africa都是专有名词,首字母都应该大写,而且和介词in连用。
There are many kinds of tigers in China.
There are many kinds of scary animals in Africa.
3、friendly adj. 友好的,和蔼可亲的
它是名词friend的形容词形式,常常和be动词连用, be friendly。
The people in Cheng are very friendly.
4、with prep. 跟,同,和…在一起
I usually play chess with my father.
注意区别与and的用法,and通常用于连接主语或宾语,连接主语时,
如果有I, I通常放在 and 之后,如:
My father and I usually play chess together.
Play with “和…一起玩耍”“玩…”
I often play with my pet dog.
Don’t play with water!
5、day和night 是一对反义词,day 表示白天或一天,night表示夜或夜晚。
通常说in the day, ring the day, at night。
Koala bears often sleep ring the day and eat leaves at night.
6、leaf n. 叶子
复数形式为:leaves, 类似的变化还有:wife—wives, wolf—wolves,
knife—knives等。
7、hour n. 小时;点钟
hour前边通常加上冠词an 表示“一个小时”, 即:an hour。
There are 24 hours in a day and 60minutes in an hour.
8、be from 来自…
be from = come from
Pandas are from China. = Pandas come form China.
9、meat n. (食用的)肉,为不可数名词,表示“许多”时,使用much来修
饰,即:much meat
He eats much meat every day.
10、grass n. 草,为不可数名词,表示“许多”时,使用much来修饰,即:much grass。
There is much grass on the playground.
四. 语法知识
特殊疑问句通常以“what”、“who”、“which”、“when”、“where”、“how”、“how old”、“how many”等开头,对某一具体问题进行提问。
特殊疑问句的基本构成有两种情况:
1. 疑问句+一般疑问句结构。这是最常见的情况。例如:
What’s your grandfather’s telephone number? 你爷爷的电话号码是多少?
Who is that boy with big eyes? 那个大眼睛的男孩是谁?
Which season do you like best? 你最喜欢哪个季节?
When is he going to play the piano? 他什么时候弹钢琴?
Where does he live? 他住在哪儿?
How are you? 你好吗?
How old are you? 你多大了?
How many brothers and sisters do you have? 你有几个兄弟姐妹?
2. 疑问句+陈述句结构。这时疑问词作主语或修饰主语。例如:
Who is on ty today?
今天谁值日?
Which man is your teacher?
哪位男士是你的老师?
我们学过的What/How about+名词/代词+其他?也是特殊疑问句,它是一种省略结构。
例如:
I like English. What/How about you? 我喜欢英语。你呢?
What about playing basketball? 打篮球怎么样?
Unit 4 I want to be an actor.
一.短语:
1 want to do sth 想要作某事
2 give sb sth = give sth to sb 给某人某物 / 把某物给某人
3 help sb do sth 帮助某人作某事 Eg: I want to help my mother do some housework at home.
4 help sb with sth 帮助某人谋事 Eg: I want to help my mother with some housework at home
5 in the day 在白天
6 at night 在晚上
7 talk with/ to sb 和----谈话
8 be busy doing sth 忙于做某事 Eg: He is busy listening to the teacher.
9 in a hospital 在医院l
10 work/ study hard 努力工作
11 Evening Newspaper 晚报
二.重点句式及注意事项:
1 询问职业的特殊疑问词是what;有三种主要句式
① What + is / are + sb?
② What + does/ do + sb + do?
③ What + is/ are + 名词所有格/ 形容词性物主代词 + job?
2 People give me their money or get their money from me.
3 Sometimes I work in the day and sometimes at night.
4 I like talking to people.
5 I work late. I’m very busy when people go out to dinners.
6 Where does your sister work?
7 then we have a job for you as a waiter.
8 Do you want to work for a magazine? Then come and work for us as a reporter.
9 Do you like to work evenings and weekends?
10 We are an international school for children of 5-12.
⑩ 如何用PyTorch实现递归神经网络
从 Siri 到谷歌翻译,深度神经网络已经在机器理解自然语言方面取得了巨大突破。这些模型大多数将语言视为单调的单词或字符序列,并使用一种称为循环神经网络(recurrent neural network/RNN)的模型来处理该序列。但是许多语言学家认为语言最好被理解为具有树形结构的层次化词组,一种被称为递归神经网络(recursive neural network)的深度学习模型考虑到了这种结构,这方面已经有大量的研究。虽然这些模型非常难以实现且效率很低,但是一个全新的深度学习框架 PyTorch 能使它们和其它复杂的自然语言处理模型变得更加容易。
虽然递归神经网络很好地显示了 PyTorch 的灵活性,但它也广泛支持其它的各种深度学习框架,特别的是,它能够对计算机视觉(computer vision)计算提供强大的支撑。PyTorch 是 Facebook AI Research 和其它几个实验室的开发人员的成果,该框架结合了 Torch7 高效灵活的 GPU 加速后端库与直观的 Python 前端,它的特点是快速成形、代码可读和支持最广泛的深度学习模型。
开始 SPINN
链接中的文章(https://github.com/jekbradbury/examples/tree/spinn/snli)详细介绍了一个递归神经网络的 PyTorch 实现,它具有一个循环跟踪器(recurrent tracker)和 TreeLSTM 节点,也称为 SPINN——SPINN 是深度学习模型用于自然语言处理的一个例子,它很难通过许多流行的框架构建。这里的模型实现部分运用了批处理(batch),所以它可以利用 GPU 加速,使得运行速度明显快于不使用批处理的版本。
SPINN 的意思是堆栈增强的解析器-解释器神经网络(Stack-augmented Parser-Interpreter Neural Network),由 Bowman 等人于 2016 年作为解决自然语言推理任务的一种方法引入,该论文中使用了斯坦福大学的 SNLI 数据集。
该任务是将语句对分为三类:假设语句 1 是一幅看不见的图像的准确标题,那么语句 2(a)肯定(b)可能还是(c)绝对不是一个准确的标题?(这些类分别被称为蕴含(entailment)、中立(neutral)和矛盾(contradiction))。例如,假设一句话是“两只狗正跑过一片场地”,蕴含可能会使这个语句对变成“户外的动物”,中立可能会使这个语句对变成“一些小狗正在跑并试图抓住一根棍子”,矛盾能会使这个语句对变成“宠物正坐在沙发上”。
特别地,研究 SPINN 的初始目标是在确定语句的关系之前将每个句子编码(encoding)成固定长度的向量表示(也有其它方式,例如注意模型(attention model)中将每个句子的每个部分用一种柔焦(soft focus)的方法相互比较)。
数据集是用句法解析树(syntactic parse tree)方法由机器生成的,句法解析树将每个句子中的单词分组成具有独立意义的短语和子句,每个短语由两个词或子短语组成。许多语言学家认为,人类通过如上面所说的树的分层方式来组合词意并理解语言,所以用相同的方式尝试构建一个神经网络是值得的。下面的例子是数据集中的一个句子,其解析树由嵌套括号表示:
( ( The church ) ( ( has ( cracks ( in ( the ceiling ) ) ) ) . ) )
这个句子进行编码的一种方式是使用含有解析树的神经网络构建一个神经网络层 Rece,这个神经网络层能够组合词语对(用词嵌入(word embedding)表示,如 GloVe)、 和/或短语,然后递归地应用此层(函数),将最后一个 Rece 产生的结果作为句子的编码:
X = Rece(“the”, “ceiling”)
Y = Rece(“in”, X)
... etc.
但是,如果我希望网络以更类似人类的方式工作,从左到右阅读并保留句子的语境,同时仍然使用解析树组合短语?或者,如果我想训练一个网络来构建自己的解析树,让解析树根据它看到的单词读取句子?这是一个同样的但方式略有不同的解析树的写法:
The church ) has cracks in the ceiling ) ) ) ) . ) )
或者用第 3 种方式表示,如下:
WORDS: The church has cracks in the ceiling .
PARSES: S S R S S S S S R R R R S R R
我所做的只是删除开括号,然后用“S”标记“shift”,并用“R”替换闭括号用于“rece”。但是现在可以从左到右读取信息作为一组指令来操作一个堆栈(stack)和一个类似堆栈的缓冲区(buffer),能得到与上述递归方法完全相同的结果:
1. 将单词放入缓冲区。
2. 从缓冲区的前部弹出“The”,将其推送(push)到堆栈上层,紧接着是“church”。
3. 弹出前 2 个堆栈值,应用于 Rece,然后将结果推送回堆栈。
4. 从缓冲区弹出“has”,然后推送到堆栈,然后是“cracks”,然后是“in”,然后是“the”,然后是“ceiling”。
5. 重复四次:弹出 2 个堆栈值,应用于 Rece,然后推送结果。
6. 从缓冲区弹出“.”,然后推送到堆栈上层。
7. 重复两次:弹出 2 个堆栈值,应用于 Rece,然后推送结果。
8. 弹出剩余的堆栈值,并将其作为句子编码返回。
我还想保留句子的语境,以便在对句子的后半部分应用 Rece 层时考虑系统已经读取的句子部分的信息。所以我将用一个三参数函数替换双参数的 Rece 函数,该函数的输入值为一个左子句、一个右子句和当前句的上下文状态。该状态由神经网络的第二层(称为循环跟踪器(Tracker)的单元)创建。Tracker 在给定当前句子上下文状态、缓冲区中的顶部条目 b 和堆栈中前两个条目 s1\s2 时,在堆栈操作的每个步骤(即,读取每个单词或闭括号)后生成一个新状态:
context[t+1] = Tracker(context[t], b, s1, s2)
容易设想用你最喜欢的编程语言来编写代码做这些事情。对于要处理的每个句子,它将从缓冲区加载下一个单词,运行跟踪器,检查是否将单词推送入堆栈或执行 Rece 函数,执行该操作;然后重复,直到对整个句子完成处理。通过对单个句子的应用,该过程构成了一个大而复杂的深度神经网络,通过堆栈操作的方式一遍又一遍地应用它的两个可训练层。但是,如果你熟悉 TensorFlow 或 Theano 等传统的深度学习框架,就知道它们很难实现这样的动态过程。你值得花点时间回顾一下,探索为什么 PyTorch 能有所不同。
图论
图 1:一个函数的图结构表示
深度神经网络本质上是有大量参数的复杂函数。深度学习的目的是通过计算以损失函数(loss)度量的偏导数(梯度)来优化这些参数。如果函数表示为计算图结构(图 1),则向后遍历该图可实现这些梯度的计算,而无需冗余工作。每个现代深度学习框架都是基于此反向传播(backpropagation)的概念,因此每个框架都需要一个表示计算图的方式。
在许多流行的框架中,包括 TensorFlow、Theano 和 Keras 以及 Torch7 的 nngraph 库,计算图是一个提前构建的静态对象。该图是用像数学表达式的代码定义的,但其变量实际上是尚未保存任何数值的占位符(placeholder)。图中的占位符变量被编译进函数,然后可以在训练集的批处理上重复运行该函数来产生输出和梯度值。
这种静态计算图(static computation graph)方法对于固定结构的卷积神经网络效果很好。但是在许多其它应用中,有用的做法是令神经网络的图结构根据数据而有所不同。在自然语言处理中,研究人员通常希望通过每个时间步骤中输入的单词来展开(确定)循环神经网络。上述 SPINN 模型中的堆栈操作很大程度上依赖于控制流程(如 for 和 if 语句)来定义特定句子的计算图结构。在更复杂的情况下,你可能需要构建结构依赖于模型自身的子网络输出的模型。
这些想法中的一些(虽然不是全部)可以被生搬硬套到静态图系统中,但几乎总是以降低透明度和增加代码的困惑度为代价。该框架必须在其计算图中添加特殊的节点,这些节点代表如循环和条件的编程原语(programming primitive),而用户必须学习和使用这些节点,而不仅仅是编程代码语言中的 for 和 if 语句。这是因为程序员使用的任何控制流程语句将仅运行一次,当构建图时程序员需要硬编码(hard coding)单个计算路径。
例如,通过词向量(从初始状态 h0 开始)运行循环神经网络单元(rnn_unit)需要 TensorFlow 中的特殊控制流节点 tf.while_loop。需要一个额外的特殊节点来获取运行时的词长度,因为在运行代码时它只是一个占位符。
# TensorFlow
# (this code runs once, ring model initialization)
# “words” is not a real list (it’s a placeholder variable) so
# I can’t use “len”
cond = lambda i, h: i < tf.shape(words)[0]
cell = lambda i, h: rnn_unit(words[i], h)
i = 0
_, h = tf.while_loop(cond, cell, (i, h0))
基于动态计算图(dynamic computation graph)的方法与之前的方法有根本性不同,它有几十年的学术研究历史,其中包括了哈佛的 Kayak、自动微分库(autograd)以及以研究为中心的框架 Chainer和 DyNet。在这样的框架(也称为运行时定义(define-by-run))中,计算图在运行时被建立和重建,使用相同的代码为前向通过(forward pass)执行计算,同时也为反向传播(backpropagation)建立所需的数据结构。这种方法能产生更直接的代码,因为控制流程的编写可以使用标准的 for 和 if。它还使调试更容易,因为运行时断点(run-time breakpoint)或堆栈跟踪(stack trace)将追踪到实际编写的代码,而不是执行引擎中的编译函数。可以在动态框架中使用简单的 Python 的 for 循环来实现有相同变量长度的循环神经网络。
# PyTorch (also works in Chainer)
# (this code runs on every forward pass of the model)
# “words” is a Python list with actual values in it
h = h0
for word in words:
h = rnn_unit(word, h)
PyTorch 是第一个 define-by-run 的深度学习框架,它与静态图框架(如 TensorFlow)的功能和性能相匹配,使其能很好地适合从标准卷积神经网络(convolutional network)到最疯狂的强化学习(reinforcement learning)等思想。所以让我们来看看 SPINN 的实现。
代码
在开始构建网络之前,我需要设置一个数据加载器(data loader)。通过深度学习,模型可以通过数据样本的批处理进行操作,通过并行化(parallelism)加快训练,并在每一步都有一个更平滑的梯度变化。我想在这里可以做到这一点(稍后我将解释上述堆栈操作过程如何进行批处理)。以下 Python 代码使用内置于 PyTorch 的文本库的系统来加载数据,它可以通过连接相似长度的数据样本自动生成批处理。运行此代码之后,train_iter、dev_iter 和 test_itercontain 循环遍历训练集、验证集和测试集分块 SNLI 的批处理。
from torchtext import data, datasets
TEXT = datasets.snli.ParsedTextField(lower=True)
TRANSITIONS = datasets.snli.ShiftReceField()
LABELS = data.Field(sequential=False)train, dev, test = datasets.SNLI.splits(
TEXT, TRANSITIONS, LABELS, wv_type='glove.42B')TEXT.build_vocab(train, dev, test)
train_iter, dev_iter, test_iter = data.BucketIterator.splits(
(train, dev, test), batch_size=64)
你可以在 train.py中找到设置训练循环和准确性(accuracy)测量的其余代码。让我们继续。如上所述,SPINN 编码器包含参数化的 Rece 层和可选的循环跟踪器来跟踪句子上下文,以便在每次网络读取单词或应用 Rece 时更新隐藏状态;以下代码代表的是,创建一个 SPINN 只是意味着创建这两个子模块(我们将很快看到它们的代码),并将它们放在一个容器中以供稍后使用。
import torchfrom torch import nn
# subclass the Mole class from PyTorch’s neural network package
class SPINN(nn.Mole):
def __init__(self, config):
super(SPINN, self).__init__()
self.config = config self.rece = Rece(config.d_hidden, config.d_tracker)
if config.d_tracker is not None:
self.tracker = Tracker(config.d_hidden, config.d_tracker)
当创建模型时,SPINN.__init__ 被调用了一次;它分配和初始化参数,但不执行任何神经网络操作或构建任何类型的计算图。在每个新的批处理数据上运行的代码由 SPINN.forward 方法定义,它是用户实现的方法中用于定义模型向前过程的标准 PyTorch 名称。上面描述的是堆栈操作算法的一个有效实现,即在一般 Python 中,在一批缓冲区和堆栈上运行,每一个例子都对应一个缓冲区和堆栈。我使用转移矩阵(transition)包含的“shift”和“rece”操作集合进行迭代,运行 Tracker(如果存在),并遍历批处理中的每个样本来应用“shift”操作(如果请求),或将其添加到需要“rece”操作的样本列表中。然后在该列表中的所有样本上运行 Rece 层,并将结果推送回到它们各自的堆栈。
def forward(self, buffers, transitions):
# The input comes in as a single tensor of word embeddings;
# I need it to be a list of stacks, one for each example in
# the batch, that we can pop from independently. The words in
# each example have already been reversed, so that they can
# be read from left to right by popping from the end of each
# list; they have also been prefixed with a null value.
buffers = [list(torch.split(b.squeeze(1), 1, 0))
for b in torch.split(buffers, 1, 1)]
# we also need two null values at the bottom of each stack,
# so we can from the nulls in the input; these nulls
# are all needed so that the tracker can run even if the
# buffer or stack is empty
stacks = [[buf[0], buf[0]] for buf in buffers]
if hasattr(self, 'tracker'):
self.tracker.reset_state()
for trans_batch in transitions:
if hasattr(self, 'tracker'):
# I described the Tracker earlier as taking 4
# arguments (context_t, b, s1, s2), but here I
# provide the stack contents as a single argument
# while storing the context inside the Tracker
# object itself.
tracker_states, _ = self.tracker(buffers, stacks)
else:
tracker_states = itertools.repeat(None)
lefts, rights, trackings = [], [], []
batch = zip(trans_batch, buffers, stacks, tracker_states)
for transition, buf, stack, tracking in batch:
if transition == SHIFT:
stack.append(buf.pop())
elif transition == REDUCE:
rights.append(stack.pop())
lefts.append(stack.pop())
trackings.append(tracking)
if rights:
reced = iter(self.rece(lefts, rights, trackings))
for transition, stack in zip(trans_batch, stacks):
if transition == REDUCE:
stack.append(next(reced))
return [stack.pop() for stack in stacks]
在调用 self.tracker 或 self.rece 时分别运行 Tracker 或 Rece 子模块的向前方法,该方法需要在样本列表上应用前向操作。在主函数的向前方法中,在不同的样本上进行独立的操作是有意义的,即为批处理中每个样本提供分离的缓冲区和堆栈,因为所有受益于批处理执行的重度使用数学和需要 GPU 加速的操作都在 Tracker 和 Rece 中进行。为了更干净地编写这些函数,我将使用一些 helper(稍后将定义)将这些样本列表转化成批处理张量(tensor),反之亦然。
我希望 Rece 模块自动批处理其参数以加速计算,然后解批处理(unbatch)它们,以便可以单独推送和弹出。用于将每对左、右子短语表达组合成父短语(parent phrase)的实际组合函数是 TreeLSTM,它是普通循环神经网络单元 LSTM 的变型。该组合函数要求每个子短语的状态实际上由两个张量组成,一个隐藏状态 h 和一个存储单元(memory cell)状态 c,而函数是使用在子短语的隐藏状态操作的两个线性层(nn.Linear)和将线性层的结果与子短语的存储单元状态相结合的非线性组合函数 tree_lstm。在 SPINN 中,这种方式通过添加在 Tracker 的隐藏状态下运行的第 3 个线性层进行扩展。
图 2:TreeLSTM 组合函数增加了第 3 个输入(x,在这种情况下为 Tracker 状态)。在下面所示的 PyTorch 实现中,5 组的三种线性变换(由蓝色、黑色和红色箭头的三元组表示)组合为三个 nn.Linear 模块,而 tree_lstm 函数执行位于框内的所有计算。图来自 Chen et al. (2016)。