åã³ãªããžã§ã¯ããæ€åºããäœæ¥ãå§ãŸããŸãã åªå äºé ã¯ã蚱容å¯èœãªç²ŸåºŠã§ã®åäœé床ã§ãã YOLOv3 ã¢ãŒããã¯ãã£ãååŸããŠãããã«ãã¬ãŒãã³ã°ããŸãã 粟床(mAp75)ã¯0.95以äžã§ãã ãããã皌åçã¯ãŸã äœãã§ãã ãã ããªãã
ä»æ¥ã¯éååããã€ãã¹ããŸãã ãããŠã«ããã®äžã§èŠãŠã¿ãŸããã ã¢ãã«ã®æåã â ãããã¯ãŒã¯ã®åé·ãªéšåãããªãã³ã°ããŠã粟床ãæãªãããšãªãæšè«ãé«éåããŸãã ã©ãããã©ã®ããããã©ã®ããã«ã«ããããããæ確ã§ãã ãããæåã§è¡ãæ¹æ³ãšãã©ãã§èªååã§ããããèããŠã¿ãŸãããã æåŸã«kerasäžã®ãªããžããªããããŸãã
å°å ¥
以åã®è·å Žããã«ãã® Macroscop ã§ã¯ãã¢ã«ãŽãªãºã ã®å®è¡æéãåžžã«ç£èŠãããšãã XNUMX ã€ã®ç¿æ £ã身ã«ã€ããŸããã ãããŠãé©åæ§ãã£ã«ã¿ãŒãéããŠãããã¯ãŒã¯ã®ã©ã³ã¿ã€ã ãåžžã«ãã§ãã¯ããŠãã ããã éåžžãæ¬çªç°å¢ã®æå 端ã®ãã®ã¯ãã®ãã£ã«ã¿ãŒãééããŸããããã®ãããç§ã¯ãã«ãŒãã³ã°ã«è¡ãçããŸããã
åªå®ã¯ãã§è°è«ãããå€ããããã¯ã§ãã
ã§ããå解ããŠã¿ãŸããã
çç©åŠãå£éèŠã
ç§ã¯ãã£ãŒãã©ãŒãã³ã°ãçç©åŠããçãŸããã¢ã€ãã¢ãèå¯ããã®ã倧奜ãã§ãã é²åãšåæ§ã«ããããã¯ä¿¡é Œã§ããŸã (ReLU ã¯
ã¢ãã«ã®æåãããã»ã¹ãçç©åŠã«è¿ããã®ã§ãã ããã§ã®ãããã¯ãŒã¯ã®å¿çã¯ãè³ã®å¯å¡æ§ã«ããšããããšãã§ããŸãã ãã®æ¬ã«ã¯èå³æ·±ãäŸãããã€ããããŸãã
- ååããæã£ãŠããªã女æ§ã®è³ã¯ãæ¬ ããŠããååã®æ©èœãå®è¡ããããã«èªèº«ãåããã°ã©ã ããŸããã
- ç·ã¯èŠèŠãåžãè³ã®éšåãæã¡èœãšããã æéãçµã€ã«ã€ããŠãè³ã®ä»ã®éšåããããã®æ©èœãåŒãç¶ããŸããã (ç¹°ãè¿ãã€ããã¯ãããŸãã)
åæ§ã«ãã¢ãã«ãã匱ãç³ã¿èŸŒã¿ã®äžéšãåãåãããšãã§ããŸãã æåŸã®æ段ãšããŠãæ®ãã®ãã³ãã«ãã«ãããããã³ãã«ãšçœ®ãæããã®ã«åœ¹ç«ã¡ãŸãã
転移åŠç¿ã奜ãã§ããããããšããŒãããåŠç¿ããŠããŸãã?
ãªãã·ã§ã³ãã® XNUMXã Yolov3 ã§è»¢ç§»åŠç¿ã䜿çšããŸãã RetinaãMask-RCNNããŸã㯠U-Netã ããããã»ãšãã©ã®å ŽåãCOCO ã®ããã« 80 åã®ãªããžã§ã¯ã ã¯ã©ã¹ãèªèããå¿ èŠã¯ãããŸããã ç§ã®ç·Žç¿ã§ã¯ããã¹ãŠã¯ã°ã¬ãŒã 1 ïœ 2 ã«éå®ãããŸãã ããã§ã¯ã80 ã¯ã©ã¹ã®ã¢ãŒããã¯ãã£ãåé·ã§ãããšèãã人ããããããããŸããã ããã¯ãã¢ãŒããã¯ãã£ãããå°ããããå¿ èŠãããããšã瀺åããŠããŸãã ããã«ãæ¢åã®äºåãã¬ãŒãã³ã°æžã¿ã®éã¿ã倱ããã«ãããå®è¡ããããšèããŠããŸãã
ãªãã·ã§ã³çªå·XNUMXã ããããã倧éã®ããŒã¿ãšã³ã³ãã¥ãŒãã£ã³ã° ãªãœãŒã¹ããããããããã¯ã¹ãŒããŒã«ã¹ã¿ã ã¢ãŒããã¯ãã£ãå¿ èŠãªã ããããããŸããã é¢ä¿ãªãã ãã ãããããã¯ãŒã¯ããŒãããåŠç¿ããããšã«ãªããŸãã éåžžã®æé ã¯ãããŒã¿æ§é ã調ã¹ãéå°ãªèœåãæã€ã¢ãŒããã¯ãã£ãéžæããè±èœè ãåãã¬ãŒãã³ã°ããè¿œãåºãããšã§ãã 0.6 人ã®è±èœè ãèŠãŸãããã«ãŒã«ã
ã©ã¡ãã®å Žåãããããã¯ãŒã¯ãåæžã§ããŸãã ããæ°ãåºãã ããã§ã¯ãå²ç€Œåªå®ãšã¯ã©ã®ãããªãã®ããèŠãŠã¿ãŸããã
äžè¬çãªã¢ã«ãŽãªãºã
ç§ãã¡ã¯ãã³ãã«ãåé€ããŠããããšå€æããŸããã ãšãŠãã·ã³ãã«ã«èŠããŸã:
ç³ã¿èŸŒã¿ãé€å»ãããšãããã¯ãŒã¯ã«ã¹ãã¬ã¹ãããããéåžžã¯ãšã©ãŒãå€å°å¢å ããŸãã äžæ¹ã§ããã®èª€å·®ã®å¢å ã¯ãããã¿èŸŒã¿ãã©ã®çšåºŠæ£ããé€å»ã§ããŠãããã瀺ãææšãšãªããŸã (ããšãã°ãå€§å¹ ãªå¢å ã¯ãäœãééã£ãããšãè¡ã£ãŠããããšã瀺ããŸã)ã ãã ããããããªå¢å ã¯ãŸã£ãã蚱容ã§ãããã®åŸã®å°ã㪠LR ã«ãã軜ãè¿œå ãã¬ãŒãã³ã°ã«ãã£ãŠè§£æ¶ãããããšããããããŸãã è¿œå ã®ãã¬ãŒãã³ã° ã¹ããããè¿œå ããŸãã
次ã«ãåŠç¿<->æåãã«ãŒãããã€åæ¢ããããå€æããå¿ èŠããããŸãã ãããã¯ãŒã¯ãç¹å®ã®ãµã€ãºãšé床ã«åæžããå¿ èŠãããå Žå (ã¢ãã€ã« ããã€ã¹ãªã©)ãçãããªãã·ã§ã³ãååšããå¯èœæ§ããããŸãã ãã ããæãäžè¬çãªãªãã·ã§ã³ã¯ã誀差ã蚱容ç¯å²ãè¶ ãããŸã§ãµã€ã¯ã«ãç¶ç¶ããããšã§ãã æ¡ä»¶ãè¿œå ããŸãã
ãããã£ãŠãã¢ã«ãŽãªãºã ãæããã«ãªããŸãã åé€ãããç³ã¿èŸŒã¿ã決å®ããæ¹æ³ãç解ããå¿ èŠããããŸãã
åé€ããããã³ãã«ãæ€çŽ¢ãã
ããã€ãã®ç³ã¿èŸŒã¿ãåãé€ãå¿ èŠããããŸãã å ãæ¥ãã§èª°ãããæã€ãããšã¯ãããŸããããŸãããæªãèãã§ãã ããããããªãã«ã¯é ãããã®ã§ãåé€ããã匱ããç³ã¿èŸŒã¿ãèããŠéžæããããšãã§ããŸãã ããã€ãã®ãªãã·ã§ã³ããããŸãã
æå°ã® L1 ã¡ãžã£ãŒãŸã㯠low_magnitude_pruning ã éã¿ã®å°ããç³ã¿èŸŒã¿ã¯æçµçãªæ±ºå®ã«ã»ãšãã©å¯äžããªããšããèã- å¹³åãšæšæºåå·®ãèæ ®ããæå°ã® L1 枬å®å€ã ååžã®æ§è³ªã®è©äŸ¡ãè£è¶³ããŸãã
ç³ã¿èŸŒã¿ããã¹ãã³ã°ããæçµçãªç²ŸåºŠã«æã圱é¿ãäžããªãç³ã¿èŸŒã¿ãé€å€ãã ã éèŠã§ã¯ãªãç³ã¿èŸŒã¿ãããæ£ç¢ºã«å€æã§ããŸãããéåžžã«æéãšãªãœãŒã¹ãæ¶è²»ãããŸãã- ä»äºº
åãªãã·ã§ã³ã«ã¯çåæš©ãšç¬èªã®å®è£ æ©èœããããŸãã ããã§ã¯ãL1 枬å®å€ãæå°ã®ãªãã·ã§ã³ãæ€èšããŸãã
YOLOv3 ã®æåããã»ã¹
å ã®ã¢ãŒããã¯ãã£ã«ã¯æ®çãããã¯ãå«ãŸããŠããŸãã ãããããã£ãŒããããã¯ãŒã¯ã«ãšã£ãŠã©ãã»ã©åªãããã®ã§ãã£ãŠããå€å°ã®åŠšãã«ã¯ãªããŸãã åé¡ã¯ã次ã®ã¬ã€ã€ãŒã§ã¯ç°ãªãã€ã³ããã¯ã¹ãæã€èª¿æŽãåé€ã§ããªãããšã§ãã
ãããã£ãŠã調æŽãèªç±ã«åé€ã§ããã¬ã€ã€ãŒãéžæããŸãããã
次ã«ãäœæ¥ãµã€ã¯ã«ãæ§ç¯ããŸãããã
- ã¢ã¯ãã£ããŒã·ã§ã³ã®ã¢ããããŒã
- ã©ããããã«ããããããèãã
- ããå æžã«ããŠ
- LR=10e-1 㧠4 ãšããã¯ãåŠç¿
- ãã¹ã
ç³ã¿èŸŒã¿ã®ã¢ã³ããŒãã¯ãç¹å®ã®ã¹ãããã§ã©ãã ãã®éšåãåé€ã§ããããèŠç©ããã®ã«åœ¹ç«ã¡ãŸãã ã¢ã³ããŒãã®äŸ:
ã»ãŒã©ãã§ããç³ã¿èŸŒã¿ã® 5% ã® L1 ãã«ã ãéåžžã«äœããããããåé€ã§ããããšãããããŸãã åã¹ãããã§ããã®éãããç¹°ãè¿ããã©ã®å±€ãäœå±€åãåºãããšãã§ããããè©äŸ¡ããŸããã
ããã»ã¹å šäœã¯ 4 ã€ã®ã¹ãããã§å®äºããŸãã (RTX 2060 Super ã®å Žåã¯ããããšéæã«æ°åã衚瀺ãããŸã)ã
æé | ããã75 | ãã©ã¡ãŒã¿ã®æ°ãçŸäž | ãããã¯ãŒã¯ãµã€ãºãã¡ã¬ãã€ã | åæå€ãã% | å®è¡æéãããªç§ | å²ç€Œã®ç¶æ |
---|---|---|---|---|---|---|
0 | 0.9656 | 60 | 241 | 100 | 180 | - |
1 | 0.9622 | 55 | 218 | 91 | 175 | å šäœã®5% |
2 | 0.9625 | 50 | 197 | 83 | 168 | å šäœã®5% |
3 | 0.9633 | 39 | 155 | 64 | 155 | 15 以äžã®ç³ã¿èŸŒã¿ãå«ãã¬ã€ã€ãŒã®å Žå㯠400% |
4 | 0.9555 | 31 | 124 | 51 | 146 | 10 以äžã®ç³ã¿èŸŒã¿ãå«ãã¬ã€ã€ãŒã®å Žå㯠100% |
ã¹ããã 2 ã«ã¯ãããã ãµã€ãº 4 ãã¡ã¢ãªã«åãŸããšãããã©ã¹ã®å¹æã XNUMX ã€è¿œå ãããè¿œå ã®ãã¬ãŒãã³ã°ã®ããã»ã¹ã倧å¹
ã«å éãããŸããã
ã¹ããã 4 ã§ãããã»ã¹ãåæ¢ãããŸããã é·æã«ãããè¿œå ãã¬ãŒãã³ã°ã§ããmAp75 ã¯å€ãå€ãŸã§äžæããŸããã§ããã
ãã®çµæã次ã®ããã«ããŠæšè«ãé«éåããããšãã§ããŸããã èŠèŽè
ã®ïŒïŒ%ãããµã€ãºãå°ããããŸã èŠèŽè
ã®ïŒïŒ%ã ãããŠæ£ç¢ºã«ã¯è² ããŸããã
ããåçŽãªã¢ãŒããã¯ãã£ã®ããã®èªåå
ããåçŽãªãããã¯ãŒã¯ ã¢ãŒããã¯ã㣠(æ¡ä»¶ä»ãå ç®ãé£çµãããã¯ãæ®å·®ãããã¯ãªã) ã®å Žåããã¹ãŠã®ç³ã¿èŸŒã¿å±€ã®åŠçã«éäžããç³ã¿èŸŒã¿ãé€å»ããããã»ã¹ãèªååããããšãããªãå¯èœã§ãã
ãã®ãªãã·ã§ã³ãå®è£
ããŸãã
ããã¯ç°¡åã§ããå¿
èŠãªã®ã¯æ倱é¢æ°ããªããã£ãã€ã¶ãŒãããã ãžã§ãã¬ãŒã¿ãŒã ãã§ãã
import pruning
from keras.optimizers import Adam
from keras.utils import Sequence
train_batch_generator = BatchGenerator...
score_batch_generator = BatchGenerator...
opt = Adam(lr=1e-4)
pruner = pruning.Pruner("config.json", "categorical_crossentropy", opt)
pruner.prune(train_batch, valid_batch)
å¿ èŠã«å¿ããŠãæ§æãã©ã¡ãŒã¿ãå€æŽã§ããŸãã
{
"input_model_path": "model.h5",
"output_model_path": "model_pruned.h5",
"finetuning_epochs": 10, # the number of epochs for train between pruning steps
"stop_loss": 0.1, # loss for stopping process
"pruning_percent_step": 0.05, # part of convs for delete on every pruning step
"pruning_standart_deviation_part": 0.2 # shift for limit pruning part
}
ããã«ãæšæºåå·®ã«åºã¥ãå¶éãå®è£ ãããŸãã ç®æšã¯ããã§ã«ãååãªãL1 枬床ãæã€ç³ã¿èŸŒã¿ãé€å€ããåé€ãããéšåãå¶éããããšã§ãã
ãããã£ãŠãå³åŽã®ååžã«é¡äŒŒããååžããã¯åŒ±ãç³ã¿èŸŒã¿ã®ã¿ãåé€ããå·ŠåŽã®ååžã«é¡äŒŒããååžããã®é€å»ã«ã¯åœ±é¿ãäžããªãããã«ããããšãã§ããŸãã
ååžãæ£èŠã«è¿ã¥ããšãpruning_standart_deviation_part ä¿æ°ã¯æ¬¡ããéžæã§ããŸãã
2 ã·ã°ãã®ä»®å®ããå§ãããŸãã ãŸãã¯ããã®æ©èœãç¡èŠããŠãå€ã 1.0 æªæºã®ãŸãŸã«ããããšãã§ããŸãã
åºåã¯ããã¹ãå šäœã®ãããã¯ãŒã¯ ãµã€ãºãæ倱ããããã¯ãŒã¯ ã©ã³ã¿ã€ã ã 1.0 ã«æ£èŠåããã°ã©ãã§ãã ããšãã°ãããã§ã¯ãå質ãæãªãããšãªããããã¯ãŒã¯ ãµã€ãºãã»ãŒ 2 åã«åæžãããŸãã (éã¿ 100k ã®å°èŠæš¡ãªç³ã¿èŸŒã¿ãããã¯ãŒã¯)ã
èµ°è¡é床ã¯éåžžå€åããŸãããå®è³ªçã«ã¯å€åããŸããã ããã«ã€ããŠã¯æ¬¡ã®ãããªèª¬æããããŸãã
- ç³ã¿èŸŒã¿æ°ã¯ããã㪠ã«ãŒãã«ãšã£ãŠäŸ¿å©ãª (32ã64ã128) ãããæãäžäŸ¿ãª (27ã51 ãªã©) ãŸã§å€åããŸãã ããã§ç§ã¯ééã£ãŠããå¯èœæ§ããããŸããããããã圱é¿ã¯ãããŸãã
- ã¢ãŒããã¯ãã£ã¯åºç¯å²ã§ã¯ãããŸããããäžè²«ããŠããŸãã å¹ ãå°ããããŠã奥è¡ãã«ã¯åœ±é¿ããŸããã ãããã£ãŠãè² è·ã¯è»œæžãããŸãããé床ã¯å€ãããŸããã
ãããã£ãŠãæ¹åã¯å®è¡äžã® CUDA è² è·ã® 20 ïœ 30% ã®æžå°ãšããŠè¡šãããŸãããå®è¡æéã®ççž®ãšããŠã¯è¡šãããŸããã
çµæ
åçããŸãããã ãã«ãŒãã³ã°ã«ã¯ãYOLOv2 (æã䜿ã£ãŠäœæ¥ããå¿ èŠãããå Žå) ãšãããåçŽãªã¢ãŒããã¯ãã£ã®ãããã¯ãŒã¯ã® 3 ã€ã®ãªãã·ã§ã³ãæ€èšããŸããã ã©ã¡ãã®å Žåã§ãã粟床ãæãªãããšãªããããã¯ãŒã¯ ãµã€ãºã®åæžãšé«éåãéæã§ããããšãããããŸãã çµæïŒ
- ãµã€ãºãå°ãããã
- å éèµ°è¡
- CUDAè² è·ã®è»œæž
- ãã®çµæãç°å¢ã«åªããïŒå°æ¥ã®ã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ã®äœ¿çšãæé©åããŸããã©ããã§å¹žãã«ãªããŸãïŒ
ã°ã¬ã¿ã»ã¿ã³ããŒã° )
ä»é²
- æåãã¹ãããã®åŸãéååãè¿œå ã§ããŸã (ããšãã°ãTensorRT ã䜿çš)
- Tensorflow ã¯ä»¥äžã®æ©èœãæäŸããŸã
low_magnitude_pruning ã åäœããŸãã ãªããžã㪠éçºãããã®ã§åãã§ãæäŒãããŸã
åºæïŒ habr.com