د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

ستاسو څخه مخکې بیا د شیانو کشف کول دي. لومړیتوب د منلو وړ دقت سره د عملیاتو سرعت دی. تاسو د YOLOv3 جوړښت واخلئ او نور یې روزنه ورکړئ. دقت (mAp75) له 0.95 څخه ډیر دی. مګر د منډو کچه لاهم ټیټه ده. کریپ.

نن ورځ موږ به د مقدار کولو مخه ونیسو. او د کټ لاندې به موږ وګورو د ماډل شاخه کول - د دقت له لاسه ورکولو پرته د تفتیش سرعت ګړندي کولو لپاره د شبکې بې ځایه برخې قطع کول. دا روښانه ده چې چیرته، څومره او څنګه پرې کول. راځئ چې معلومه کړو چې دا څنګه په لاسي ډول ترسره کړئ او چیرې تاسو کولی شئ دا اتومات کړئ. په پای کې د کیرا په اړه ذخیره شتون لري.

پېژندنه

زما د کار په پخوانی ځای کې، په پرم کې میکروسکوپ، ما یو عادت ترلاسه کړ - د تل لپاره د الګوریتم د اجرا کولو وخت وڅیړم. او تل د کافي فلټر له لارې د شبکې چلولو وخت وګورئ. معمولا په تولید کې عصري دا فلټر نه تیریږي ، کوم چې ما د شاخه کولو لامل شو.

شاخه برۍ یوه پخوانۍ موضوع ده چې پرې بحث شوی دی د سټینفورډ لیکچرونه په 2017 کې. اصلي مفکوره د روزل شوي شبکې اندازه کمول دي پرته له دې چې د مختلف نوډونو په لرې کولو سره دقت له لاسه ورکړي. دا ښه ښکاري، مګر زه په ندرت سره د دې کارولو په اړه اورم. شاید، په کافي اندازه تطبیقونه شتون نلري، د روسی ژبې مقالې شتون نلري، یا په ساده ډول هرڅوک دا د پوهیدو څرنګوالی ګڼي او خاموش پاتې کیږي.
مګر راځئ چې دا جلا کړو

بیولوژي ته یوه کتنه

زه دا خوښوم کله چې ژوره زده کړه نظرونو ته ګوري چې د بیولوژي څخه راځي. دوی، د ارتقا په څیر، باور کیدی شي (ایا تاسو پوهیږئ چې ReLU ورته ورته دی په مغز کې د نیورون فعالیت فعالیت?)

د ماډل شاخه کولو پروسه هم بیولوژي ته نږدې ده. دلته د شبکې غبرګون د دماغ پلاستیکیت سره پرتله کیدی شي. په کتاب کې یو څو په زړه پورې مثالونه شتون لري. نارمن ډویج:

  1. د یوې میرمنې مغز چې یوازې نیمایي سره زیږیدلی و د ورک شوي نیمایي دندې ترسره کولو لپاره ځان بیا پروګرام کړی.
  2. سړي د خپل دماغ هغه برخه وویشتله چې د لید لپاره مسؤل و. د وخت په تیریدو سره، د دماغ نورو برخو دا دندې ترسره کړې. (موږ د تکرار هڅه نه کوو)

په ورته ډول، تاسو کولی شئ د خپل ماډل څخه ځینې ضعیف کنسولونه پرې کړئ. د وروستي ریزورټ په توګه، پاتې بنډلونه به د کټ شویو بدلولو کې مرسته وکړي.

ایا تاسو د لیږد زده کړې سره مینه لرئ یا تاسو له پیل څخه زده کوئ؟

اختیار نمبر یو. تاسو په Yolov3 کې د لیږد زده کړې کاروئ. ریٹنا، ماسک-RCNN یا U-Net. مګر ډیری وختونه موږ اړتیا نلرو د 80 څیز ټولګي پیژنو لکه په COCO کې. زما په عمل کې، هرڅه د 1-2 درجې پورې محدود دي. یو ممکن ګومان وکړي چې د 80 ټولګیو لپاره جوړښت دلته بې ځایه دی. دا وړاندیز کوي چې جوړښت باید کوچنی شي. برسېره پر دې، زه غواړم دا د موجوده دمخه روزل شوي وزن له لاسه ورکولو پرته ترسره کړم.

اختیار نمبر دوهم. شاید تاسو ډیری ډیټا او کمپیوټري سرچینې ولرئ، یا یوازې یو عالي دودیز جوړښت ته اړتیا لرئ. پروا نه کوي. مګر تاسو له سکریچ څخه شبکه زده کوئ. معمول کړنلاره دا ده چې د معلوماتو جوړښت وګورئ، یو جوړښت غوره کړئ چې په ځواک کې ډیر وي، او د بیا روزنې څخه د وتلو مخه ونیسي. ما د 0.6 پریښودو ولیدل، کارل.

په دواړو حالتونو کې، شبکه کولی شي کم شي. هڅول. اوس راځئ چې معلومه کړو چې د سنتو شاخه کول څه ډول دي

عمومي الګوریتم

موږ پریکړه وکړه چې موږ بنډلونه لرې کړو. دا خورا ساده ښکاري:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

د هر ډول کنولوشن لرې کول د شبکې لپاره فشار دی، کوم چې معمولا د غلطۍ ځینې زیاتوالي المل کیږي. له یوې خوا، په غلطۍ کې دا زیاتوالی یو شاخص دی چې موږ په سمه توګه د کنولوشنونه لیرې کوو (د بیلګې په توګه، یو لوی زیاتوالی ښیي چې موږ یو څه غلط کوو). مګر یو کوچنی زیاتوالی د منلو وړ دی او ډیری وختونه د وړو LR سره د رڼا اضافي روزنې لخوا له مینځه وړل کیږي. د روزنې اضافي ګام اضافه کړئ:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

اوس موږ باید دا معلومه کړو چې کله موږ غواړو خپل زده کړه بنده کړو<->د شاخه کولو لوپ. دلته ممکن بهرني اختیارونه شتون ولري کله چې موږ اړتیا لرو شبکه یو ټاکلي اندازې او سرعت ته راټیټ کړو (د مثال په توګه ، د ګرځنده وسیلو لپاره). په هرصورت، ترټولو عام انتخاب دا دی چې دوره ته دوام ورکړئ تر هغه چې تېروتنه د منلو وړ نه وي. یو شرط اضافه کړئ:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

نو، الګوریتم روښانه کیږي. دا د دې معلومولو لپاره پاتې دي چې څنګه حذف شوي کنوانسیونونه مشخص کړئ.

د حذف شوي کڅوړو لټون وکړئ

موږ اړتیا لرو چې ځینې اختلاطات لرې کړو. مخکې ګړندی کول او د هرچا "شوټینګ" یو بد نظر دی، که څه هم دا به کار وکړي. مګر له هغه وخته چې تاسو سر لرئ، تاسو فکر کولی شئ او هڅه وکړئ چې د لرې کولو لپاره "کمزوري" بدلونونه غوره کړئ. ډیری اختیارونه شتون لري:

  1. تر ټولو کوچنی L1 اندازه یا کم_میګنټیوډ_پروننګ. دا مفکوره چې د کوچنیو وزنونو سره قانع کول په وروستۍ پریکړه کې لږ مرسته کوي
  2. تر ټولو کوچنی L1 اندازه کول د معنی او معیاري انحراف په پام کې نیولو سره. موږ د ویش د ماهیت د ارزونې سره ضمیمه کوو.
  3. د کنولوشنونو ماسک کول او د هغو څخه ایستل چې لږترلږه په وروستي دقیقیت اغیزه کوي. د بې اهمیته تصمیمونو ډیر دقیق پریکړه، مګر ډیر وخت او سرچینې مصرفوي.
  4. نور

هر انتخاب د ژوند حق او د هغې د پلي کولو ځانګړتیاوې لري. دلته موږ د کوچني L1 اندازه کولو اختیار په پام کې نیسو

د YOLOv3 لپاره لارښود پروسه

اصلي معمارۍ پاتې بلاکونه لري. مګر مهمه نده چې دوی د ژورو شبکو لپاره څومره ښه دي، دوی به موږ یو څه خنډ کړي. مشکل دا دی چې تاسو نشئ کولی په دې پرتونو کې د مختلف شاخصونو سره پخلاینې حذف کړئ:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

نو، راځئ چې پرتونه وټاکو چې له هغې څخه موږ کولی شو په آزاده توګه پخلاینې حذف کړو:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

اوس راځئ چې د کار دوره جوړه کړو:

  1. د فعالیتونو پورته کول
  2. معلومول چې څومره پرې کول
  3. پرې یې کړه
  4. د LR=10e-1 سره د 4 دورې زده کړه
  5. ازموینه

د کنولوشنونو پورته کول ګټور دي ترڅو اټکل وکړي چې موږ په یو ټاکلي مرحله کې څومره برخه لرې کولی شو. د پورته کولو مثالونه:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

موږ ګورو چې نږدې هر ځای کې 5٪ کنوولوشنونه خورا ټیټ L1 نورم لري او موږ کولی شو هغه لرې کړو. په هر ګام کې، دا کښته کول تکرار شول او ارزونه وشوه چې کوم پرتونه او څومره یې پرې کیدی شي.

ټوله پروسه په 4 مرحلو کې بشپړه شوه (د RTX 2060 سوپر لپاره دلته او هرچیرې شمیرې):

مرحله mAp75 د پیرامیټونو شمیر، ملیون د شبکې اندازه، mb له پیل څخه،٪ د چلولو وخت، ms د سنتو شرط
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 په حافظه کې فټ شو ، کوم چې د اضافي روزنې پروسه خورا ګړندۍ کړه.
په 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 اقداماتو سره د کنولوشنونو پرته:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

په دې توګه، موږ تاسو ته اجازه درکوو چې یوازې د ښي اړخ ته ورته توزیع څخه ضعیف بدلونونه لیرې کړو او د کیڼ اړخ ته ورته توزیع څخه لرې کولو اغیزه ونکړو:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

کله چې ویش نورمال ته ورسیږي، د pruning_standart_deviation_part coefficient له دې څخه غوره کیدی شي:

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول
زه د 2 سیګما انګیرنې وړاندیز کوم. یا تاسو کولی شئ دا خصوصیت له پامه غورځولی شئ، ارزښت <1.0 پریږدئ.

محصول د ټولې ازموینې لپاره د شبکې اندازه، ضایع، او د شبکې چلولو ګراف دی، چې 1.0 ته نورمال شوی. د مثال په توګه، دلته د شبکې اندازه تقریبا 2 ځله کمه شوې پرته له دې چې کیفیت له لاسه ورکړي (کوچنۍ قانع شبکه د 100k وزن سره):

د قناعت وړ شبکو کمولو لپاره د Jedi تخنیک - شاخه کول

د چلولو سرعت د نورمال بدلونونو تابع دی او په حقیقت کې بدله پاتې کیږي. د دې لپاره یو وضاحت شتون لري:

  1. د کنولوشنونو شمیر له اسانه (32، 64، 128) څخه د ویډیو کارتونو لپاره خورا اسانه نه بدلیږي - 27، 51، او نور. زه دلته غلط کیدی شم، مګر ډیری احتمال دا اغیزه لري.
  2. جوړښت پراخ نه دی، مګر ثابت دی. د عرض په کمولو سره، موږ په ژوره اغیزه نه کوو. په دې توګه، موږ بار کموو، مګر سرعت نه بدلوو.

له همدې امله، ښه والی د 20-30٪ لخوا د چلولو په جریان کې د CUDA بار کمولو کې څرګند شوی، مګر د چلولو وخت کې کمښت کې نه.

پایلې

راځئ چې انعکاس وکړو. موږ د شاخه کولو لپاره 2 اختیارونه په پام کې نیولي - د YOLOv3 لپاره (کله چې تاسو د خپلو لاسونو سره کار کوئ) او د ساده جوړښتونو شبکې لپاره. دا لیدل کیدی شي چې په دواړو حالتونو کې دا ممکنه ده چې د شبکې اندازې کمولو او د دقت له لاسه ورکولو پرته سرعت ترلاسه کړئ. پایلې:

  • د اندازې کمول
  • سرعت چلول
  • د CUDA بار کمول
  • د پایلې په توګه، د چاپیریال دوستۍ (موږ د کمپیوټري سرچینو راتلونکي کارولو ته وده ورکوو. چیرته چې یو څوک خوشحاله وي ګریټا ټنبرګ)

ضمیمه

  • د شاخه کولو مرحلې وروسته، تاسو کولی شئ مقدار اضافه کړئ (د مثال په توګه، د TensorRT سره)
  • Tensorflow د دې لپاره وړتیاوې چمتو کوي ټیټ_مقدار_پرینګ. کار کوي.
  • ذخیره زه غواړم پرمختګ وکړم او د مرستې لپاره به خوښ شم

سرچینه: www.habr.com

Add a comment