本文目录一览:
MMsegmentation教程 6: 自定义运行设定
我们已经支持 PyTorch 自带的所有优化器,唯一需要修改的地方是在配置文件里的 optimizer 域里面。
例如,如果您想使用 ADAM (注意如下操作可能会让模型表现下降),可以使用如下修改:
为了修改模型的学习率,使用者仅需要修改配置文件里 optimizer 的 lr 即可。
使用者可以参照 PyTorch 的 API 文档
直接设置参数。
一个自定义的优化器可以按照如下去定义:
假如您想增加一个叫做 MyOptimizer 的优化器,它的参数分别有 a , b , 和 c 。
您需要创建一个叫 mmseg/core/optimizer 的新文件夹。
然后再在文件,即 mmseg/core/optimizer/my_optimizer.py 里面去实现这个新优化器:
为了让上述定义的模块被框架发现,首先这个模块应该被导入到主命名空间 (main namespace) 里。
有两种方式可以实现它。
mmseg.core.optimizer.my_optimizer 模块将会在程序运行的开始被导入,并且 MyOptimizer 类将会自动注册。
需要注意只有包含 MyOptimizer 类的包 (package) 应当被导入。
而 mmseg.core.optimizer.my_optimizer.MyOptimizer 不能 被直接导入。
事实上,使用者完全可以用另一个按这样导入方法的文件夹结构,只要模块的根路径已经被添加到 PYTHONPATH 里面。
之后您可以在配置文件的 optimizer 域里面使用 MyOptimizer
在配置文件里,优化器被定义在 optimizer 域里,如下所示:
为了使用您自己的优化器,这个域可以被改成:
有些模型可能需要在优化器里有一些特别参数的设置,例如 批归一化层 (BatchNorm layers) 的 权重衰减 (weight decay)。
使用者可以通过自定义优化器的构造器去微调这些细粒度参数。
默认的优化器构造器的实现可以参照 这里 ,它也可以被用作新的优化器构造器的模板。
优化器没有实现的一些技巧应该通过优化器构造器 (optimizer constructor) 或者钩子 (hook) 去实现,如设置基于参数的学习率 (parameter-wise learning rates)。我们列出一些常见的设置,它们可以稳定或加速模型的训练。
如果您有更多的设置,欢迎在 PR 和 issue 里面提交。
我们根据默认的训练迭代步数 40k/80k 来设置学习率,这在 MMCV 里叫做 PolyLrUpdaterHook 。
我们也支持许多其他的学习率计划表: 这里 ,例如 CosineAnnealing 和 Poly 计划表。下面是一些例子:
工作流是一个专门定义运行顺序和轮数 (running order and epochs) 的列表 (phase, epochs)。
默认情况下它设置成:
意思是训练是跑 1 个 epoch。有时候使用者可能想检查模型在验证集上的一些指标(如 损失 loss,精确性 accuracy),我们可以这样设置工作流:
于是 1 个 epoch 训练,1 个 epoch 验证将交替运行。
注意 :
如果钩子已经在 MMCV 里被实现,如下所示,您可以直接修改配置文件来使用钩子:
以下的常用的钩子没有被 custom_hooks 注册:
在这些钩子里,只有 logger hook 有 VERY_LOW 优先级,其他的优先级都是 NORMAL 。
上述提及的教程已经包括了如何修改 optimizer_config , momentum_config 和 lr_config 。
这里我们展示我们如何处理 log_config , checkpoint_config 和 evaluation 。
MMCV runner 将使用 checkpoint_config 去初始化 CheckpointHook .
使用者可以设置 max_keep_ckpts 来仅保存一小部分检查点或者通过 save_optimizer 来决定是否保存优化器的状态字典 (state dict of optimizer)。 更多使用参数的细节请参考 这里 。
log_config 包裹了许多日志钩 (logger hooks) 而且能去设置间隔 (intervals)。现在 MMCV 支持 WandbLoggerHook , MlflowLoggerHook 和 TensorboardLoggerHook 。
详细的使用请参照 文档 。
evaluation 的配置文件将被用来初始化 EvalHook 。
除了 interval 键,其他的像 metric 这样的参数将被传递给 dataset.evaluate() 。
慢走丝程序要用的一些代码?
G代码
G00 快速移动 G00 X___Y___U___V___
G01 直线加工 G01 X___Y___U___V___
G02 顺时针圆弧加工 G02 X___Y___ I___ J____
G03 逆时针圆弧加工 G03 X___Y____I___J____
G04
G40 补正取消 G40 X____Y____
G41 向左补正 G41 X____Y____
G42 向右补正 G42 X____Y____
G90 绝对值数据模式 G90 (指定绝对坐标值)
G91 相对值数据模式 G91 (指定相对坐标值)
G92 程式原点数据模式 G92 X___Y____I____J____U____V____
M代码
M00 无条件停止工作 M00 (当程式执行到M00单节时,机台将自动停止)
M01 选择性停止工作 M01 (假如M01STOP按键按亮时,和M00功能相同)
M02 程式结束 M02 (指定主程式结束)
三菱(MITSU)线割机台代码
A 锥度 A____ (角度)
L 程式编号 L_____(正整数)
N 程式中加工孔号 N_____(正整数)
R 圆弧半径 R_____(常数)
K 旋转角度 K_____(角度)
S 缩放比例 S_____(常数)
H 补正编号 H_____(常数)
E 加工条件 E_____(正整数)
F 加工速度 F_____(正数)
G22 呼唤副程式 G22L__(正整数)
G23 返回主程式 G23
G87 主程式与副程式圆角设定 G87
G88 自动化清角 G88
G89 取消自动化清角 G89
M20 自动穿线 M20
M21 自动剪线 M21
M80 喷水打开 M80
M81 喷水关闭 M81
M82 送线开始 M82
M83 送线结束 M83
M84 放电开始 M84
M85 放电结束 M85
M90 最适利进给打开 M90
M91 最适利进给结束 M91
庆鸿线割机台代码
A 锥度 A____ (角度)
L(O) 程式编号 L_____(正整数)
N 程式中加工孔号 N_____(正整数)
R 圆弧半径 R_____(常数)
K 旋转角度 K_____(角度)
H(D) 补正编号 H_____(常数)
E(S) 加工条件 E_____(正整数)
F 加工速度 F_____(正数)
G22 呼唤副程式 G22L__(正整数)
G23 返回主程式 G23
G87 主程式与副程式圆角设定 G87
G94 定速切割 G94
G95 伺服切割 G95
M20 自动穿线 M20
M21 自动剪线 M21
M80 喷水打开 M80
M81 喷水关闭 M81
M82 送线开始 M82
M83 送线结束 M83
M84 放电开始 M84
M85 放电结束 M85
M90 最适利进给打开 M90
M91 最适利进给结束 M91
M98 呼唤副程式 M98L(P)__ (正整数)
M99 返回主程式 M99
沙迪克(SODICK) 线割机台代码
G05 X轴镜象 G05
G06 Y轴镜象 G06
G07 Z轴镜象 G07
G08 X.Y轴交换 G08
G09 取消镜象与轴交换 G09
G26 图形旋转打开 G26K___(角度)
G27 图形旋转取消 G27
G50 取消锥度 G50
G51 向左侧倾斜 G51
G52向右侧倾斜 G52
G74 打开四轴补正 G74
G75 关闭四轴补正 G75
G81 回归机械原点 G81
G82 X或者Y方向分中 G82
G84 自动测垂直 G84X-
G97 设定所有坐标系归零 G97XY
T80 送线打开 T80
T81 送线关闭 T81
T82 加工液打开 T82
T83 加工液关闭 T83
T84 泵流打开 T84
T85 泵流关闭 T85
T86 喷流打开 T86
T87 喷流关闭 T87
T88 浸油加工 T88
T89 喷水加工 T89
T94 浸水加工 T94
M05 忽视接触(短路)感知 M05
M06 不放电 M06
M98 呼唤副程式 M98L(P)__ (正整数)
M99 返回主程式 M99
法兰克(富士通FANUC) 线割机台代码
G10 设定补正值或者加工条件 G10P__R__(补正值设定)
G10P__X__Y__Z__U__V__W__I__J_K_(加工条件设定 )
G48 转角R性能打开 G48
G49 转角R性能关闭 G49
G50 取消锥度 G50 X__Y__
G51 向左侧倾斜 G51 X__Y__
G52 向右侧倾斜 G52 X__Y__
G94 定速切割 G94X__Y__F__
G95 伺服切割 G95X__Y__
夏米尔(CHARMILL) 线割机台代码
Aa 锥度 A____ (角度)
Cc 辅助平面旋转角度 C_____(角度)
Ee 加工模式的选择 E____(正整数)
Ff 多少秒闭锁时间 F____(常数)
Hh 工件的厚度 H____(常数)
Rr 基准面与辅助平面之间的间隔 R____(常数)
Ww 基准面与下部表面之间的间隔
G27 正常模式[取消模式 G28,G29,G30和G32]
G28 锥形模式,旋转主轴类型[不变角]
G29 尖角的锥形模式
G30 恒定半径的锥形模式
G32 扭转模式的约定和定义
M03 起用电极丝进给
M05 停用电极丝进给
M06 自动穿丝
M07 起用上部冲洗
M08 起用下部冲洗
M09 停用上部与下部冲洗
M12 自动线切割
M20 起用加工
M21 停用加工
易语言编辑框特殊符号
可以实现的,你可以先自己把一些特殊符号加到一个文本型变量中:下面是一些思路 自己看下
..版本 2
.程序集 窗口程序集1
.子程序 _按钮1_被单击
.局部变量 文本变量, 文本型
.局部变量 临时文本, 文本型
.局部变量 a, 整数型
文本变量 = “#%^*()!~”
.计次循环首 (取文本长度 (编辑框1.内容), a)
临时文本 = 取文本中间 (编辑框1.内容, a, 1)
.如果真 (寻找文本 (文本变量, 临时文本, , 假) ≠ -1)
编辑框1.内容 = 文本替换 (编辑框1.内容, a, 1, “?”)
.如果真结束
.计次循环尾 ()
Delphi问题
代表按下了“上翻键”或者“下翻键”这两个键。
是的,键盘上的每一个按钮都有一个对应的KEY号码,你可以编写一个程序来查看每一个键的号码,或者到以下文件中查看:等号前面是DELPHI设定的键常数,后面就是这个常数代表的实际数字:
[delphi目录]\source\rtl\win\windows.pas
...
{ Virtual Keys, Standard Set }
{$EXTERNALSYM VK_LBUTTON}
VK_LBUTTON = 1;
{$EXTERNALSYM VK_RBUTTON}
VK_RBUTTON = 2;
{$EXTERNALSYM VK_CANCEL}
VK_CANCEL = 3;
{$EXTERNALSYM VK_MBUTTON}
VK_MBUTTON = 4; { NOT contiguous with L RBUTTON }
{$EXTERNALSYM VK_BACK}
VK_BACK = 8;
{$EXTERNALSYM VK_TAB}
VK_TAB = 9;
{$EXTERNALSYM VK_CLEAR}
VK_CLEAR = 12;
{$EXTERNALSYM VK_RETURN}
VK_RETURN = 13;
{$EXTERNALSYM VK_SHIFT}
VK_SHIFT = $10;
{$EXTERNALSYM VK_CONTROL}
VK_CONTROL = 17;
{$EXTERNALSYM VK_MENU}
VK_MENU = 18;
{$EXTERNALSYM VK_PAUSE}
VK_PAUSE = 19;
{$EXTERNALSYM VK_CAPITAL}
VK_CAPITAL = 20;
{$EXTERNALSYM VK_KANA }
VK_KANA = 21;
{$EXTERNALSYM VK_HANGUL }
VK_HANGUL = 21;
{$EXTERNALSYM VK_JUNJA }
VK_JUNJA = 23;
{$EXTERNALSYM VK_FINAL }
VK_FINAL = 24;
{$EXTERNALSYM VK_HANJA }
VK_HANJA = 25;
{$EXTERNALSYM VK_KANJI }
VK_KANJI = 25;
{$EXTERNALSYM VK_CONVERT }
VK_CONVERT = 28;
{$EXTERNALSYM VK_NONCONVERT }
VK_NONCONVERT = 29;
{$EXTERNALSYM VK_ACCEPT }
VK_ACCEPT = 30;
{$EXTERNALSYM VK_MODECHANGE }
VK_MODECHANGE = 31;
{$EXTERNALSYM VK_ESCAPE}
VK_ESCAPE = 27;
{$EXTERNALSYM VK_SPACE}
VK_SPACE = $20;
{$EXTERNALSYM VK_PRIOR}
VK_PRIOR = 33;
{$EXTERNALSYM VK_NEXT}
VK_NEXT = 34;
{$EXTERNALSYM VK_END}
VK_END = 35;
{$EXTERNALSYM VK_HOME}
VK_HOME = 36;
{$EXTERNALSYM VK_LEFT}
VK_LEFT = 37;
{$EXTERNALSYM VK_UP}
VK_UP = 38;
{$EXTERNALSYM VK_RIGHT}
VK_RIGHT = 39;
{$EXTERNALSYM VK_DOWN}
VK_DOWN = 40;
{$EXTERNALSYM VK_SELECT}
VK_SELECT = 41;
{$EXTERNALSYM VK_PRINT}
VK_PRINT = 42;
{$EXTERNALSYM VK_EXECUTE}
VK_EXECUTE = 43;
{$EXTERNALSYM VK_SNAPSHOT}
VK_SNAPSHOT = 44;
{$EXTERNALSYM VK_INSERT}
VK_INSERT = 45;
{$EXTERNALSYM VK_DELETE}
VK_DELETE = 46;
{$EXTERNALSYM VK_HELP}
VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
{$EXTERNALSYM VK_LWIN}
VK_LWIN = 91;
{$EXTERNALSYM VK_RWIN}
VK_RWIN = 92;
{$EXTERNALSYM VK_APPS}
VK_APPS = 93;
{$EXTERNALSYM VK_NUMPAD0}
VK_NUMPAD0 = 96;
{$EXTERNALSYM VK_NUMPAD1}
VK_NUMPAD1 = 97;
{$EXTERNALSYM VK_NUMPAD2}
VK_NUMPAD2 = 98;
{$EXTERNALSYM VK_NUMPAD3}
VK_NUMPAD3 = 99;
{$EXTERNALSYM VK_NUMPAD4}
VK_NUMPAD4 = 100;
{$EXTERNALSYM VK_NUMPAD5}
VK_NUMPAD5 = 101;
{$EXTERNALSYM VK_NUMPAD6}
VK_NUMPAD6 = 102;
{$EXTERNALSYM VK_NUMPAD7}
VK_NUMPAD7 = 103;
{$EXTERNALSYM VK_NUMPAD8}
VK_NUMPAD8 = 104;
{$EXTERNALSYM VK_NUMPAD9}
VK_NUMPAD9 = 105;
{$EXTERNALSYM VK_MULTIPLY}
VK_MULTIPLY = 106;
{$EXTERNALSYM VK_ADD}
VK_ADD = 107;
{$EXTERNALSYM VK_SEPARATOR}
VK_SEPARATOR = 108;
{$EXTERNALSYM VK_SUBTRACT}
VK_SUBTRACT = 109;
{$EXTERNALSYM VK_DECIMAL}
VK_DECIMAL = 110;
{$EXTERNALSYM VK_DIVIDE}
VK_DIVIDE = 111;
{$EXTERNALSYM VK_F1}
VK_F1 = 112;
{$EXTERNALSYM VK_F2}
VK_F2 = 113;
{$EXTERNALSYM VK_F3}
VK_F3 = 114;
{$EXTERNALSYM VK_F4}
VK_F4 = 115;
{$EXTERNALSYM VK_F5}
VK_F5 = 116;
{$EXTERNALSYM VK_F6}
VK_F6 = 117;
{$EXTERNALSYM VK_F7}
VK_F7 = 118;
{$EXTERNALSYM VK_F8}
VK_F8 = 119;
{$EXTERNALSYM VK_F9}
VK_F9 = 120;
{$EXTERNALSYM VK_F10}
VK_F10 = 121;
{$EXTERNALSYM VK_F11}
VK_F11 = 122;
{$EXTERNALSYM VK_F12}
VK_F12 = 123;
{$EXTERNALSYM VK_F13}
VK_F13 = 124;
{$EXTERNALSYM VK_F14}
VK_F14 = 125;
{$EXTERNALSYM VK_F15}
VK_F15 = 126;
{$EXTERNALSYM VK_F16}
VK_F16 = 127;
{$EXTERNALSYM VK_F17}
VK_F17 = 128;
{$EXTERNALSYM VK_F18}
VK_F18 = 129;
{$EXTERNALSYM VK_F19}
VK_F19 = 130;
{$EXTERNALSYM VK_F20}
VK_F20 = 131;
{$EXTERNALSYM VK_F21}
VK_F21 = 132;
{$EXTERNALSYM VK_F22}
VK_F22 = 133;
{$EXTERNALSYM VK_F23}
VK_F23 = 134;
{$EXTERNALSYM VK_F24}
VK_F24 = 135;
{$EXTERNALSYM VK_NUMLOCK}
VK_NUMLOCK = 144;
{$EXTERNALSYM VK_SCROLL}
VK_SCROLL = 145;
{ VK_L VK_R - left and right Alt, Ctrl and Shift virtual keys.
Used only as parameters to GetAsyncKeyState() and GetKeyState().
No other API or message will distinguish left and right keys in this way. }
{$EXTERNALSYM VK_LSHIFT}
VK_LSHIFT = 160;
{$EXTERNALSYM VK_RSHIFT}
VK_RSHIFT = 161;
{$EXTERNALSYM VK_LCONTROL}
VK_LCONTROL = 162;
{$EXTERNALSYM VK_RCONTROL}
VK_RCONTROL = 163;
{$EXTERNALSYM VK_LMENU}
VK_LMENU = 164;
{$EXTERNALSYM VK_RMENU}
VK_RMENU = 165;
{$EXTERNALSYM VK_PROCESSKEY}
VK_PROCESSKEY = 229;
{$EXTERNALSYM VK_ATTN}
VK_ATTN = 246;
{$EXTERNALSYM VK_CRSEL}
VK_CRSEL = 247;
{$EXTERNALSYM VK_EXSEL}
VK_EXSEL = 248;
{$EXTERNALSYM VK_EREOF}
VK_EREOF = 249;
{$EXTERNALSYM VK_PLAY}
VK_PLAY = 250;
{$EXTERNALSYM VK_ZOOM}
VK_ZOOM = 251;
{$EXTERNALSYM VK_NONAME}
VK_NONAME = 252;
{$EXTERNALSYM VK_PA1}
VK_PA1 = 253;
{$EXTERNALSYM VK_OEM_CLEAR}
VK_OEM_CLEAR = 254;
VB ASCLL码表
ASCII码记住常用的就行了,比如回车 13 。ASCII从0到127代表不同的常用符号,其中有的是可以推算出来的,不用记。例如大写A的ASCII码是65,小写a则是97,0是48,后面的只要递增推算即可。(B是66,C是67……;b是98,c是99)
特殊的:
7 响铃
8 退格
9 制表符
10 换行符
32 空格符
33 !
34 "
35 #
36 $
37 %
38
39 '
40 (
41 )
42 *
43 +
44 ,
45 -
46 .
47 /
58 :
59 ;
60
61 =
62
63 ?
64 @
91 [
92 \
93 ]
94 ^
95 _
96 `
123 {
124 |
125 }
126 ~
127 del键