{"id":54494,"date":"2019-12-27T00:00:00","date_gmt":"2019-12-26T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning"},"modified":"2020-02-18T14:02:30","modified_gmt":"2020-02-18T11:02:30","slug":"dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","title":{"rendered":"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cca85b86c64843707a2167a7fed19867.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przed Tob\u0105 znowu zadanie detekcji obiekt\u00f3w. Priorytetem jest szybko\u015b\u0107 dzia\u0142ania przy akceptowalnej precyzji. U\u017cyj architektury YOLOv3 i dokonaj dalszego treningu. Precyzja (mAp75) powinna wynosi\u0107 ponad 0,95. Jednak pr\u0119dko\u015b\u0107 dzia\u0142ania nadal jest zbyt niska. Cholera. <\/p>\n<p><\/p>\n<p>Dzi\u015b pominiemy kwantyzacj\u0119. A w rozwini\u0119ciu przyjrzymy si\u0119 <strong>Model Pruning<\/strong> \u2014 przycinanie zb\u0119dnych cz\u0119\u015bci sieci w celu przyspieszenia dzia\u0142ania bez utraty precyzji. Przyk\u0142adowo \u2014 sk\u0105d, ile i jak mo\u017cna usun\u0105\u0107. Zbadamy, jak zrobi\u0107 to r\u0119cznie i gdzie mo\u017cna to zautomatyzowa\u0107. Na ko\u0144cu \u2014 repozytorium na keras.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie\">Wprowadzenie<\/h3>\n<p><\/p>\n<p>W poprzedniej pracy, w permiskim Macroscopie, nabra\u0142em nawyku \u2014 zawsze \u015bledzi\u0107 czas dzia\u0142ania algorytm\u00f3w. A czas dzia\u0142ania sieci zawsze sprawdza\u0107 przez filtr adekwatno\u015bci. Zazwyczaj state-of-the-art w produkcji nie przechodzi tego filtr, co doprowadzi\u0142o mnie do Pruning. <\/p>\n<p><\/p>\n<p>Pruning \u2014 temat stary, o kt\u00f3rym m\u00f3wiono na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=eZdOkDtYMoo\">wyk\u0142adach ze Stanfordu<\/a><\/noindex> w 2017 roku. G\u0142\u00f3wna idea \u2014 zmniejszenie rozmiaru wytrenowanej sieci bez utraty precyzji poprzez usuni\u0119cie r\u00f3\u017cnych w\u0119z\u0142\u00f3w. Brzmi \u015bwietnie, ale rzadko s\u0142ysz\u0119 o jego zastosowaniach. Mo\u017ce brakuje implementacji, nie ma artyku\u0142\u00f3w w j\u0119zyku rosyjskim, albo po prostu wszyscy uwa\u017caj\u0105 pruning za tajemnic\u0119 i milcz\u0105.<br \/>\nAle przejd\u017amy do rozbioru.<\/p>\n<p><\/p>\n<h3 id=\"vzglyad-v-biologiyu\">Zerknijmy na biologi\u0119.<\/h3>\n<p><\/p>\n<p>Lubi\u0119, gdy w Deep Learning zagl\u0105daj\u0105 pomys\u0142y, kt\u00f3re przysz\u0142y z biologii. Mo\u017cna im zaufa\u0107, tak jak ewolucji (a czy wiesz, \u017ce ReLU jest bardzo podobna do <noindex><a rel=\"nofollow\" href=\"http:\/\/www.gatsby.ucl.ac.uk\/~lmate\/biblio\/dayanabbott.pdf\">funkcji aktywacji neuron\u00f3w w m\u00f3zgu?<\/a><\/noindex>?) <\/p>\n<p><\/p>\n<p>Proces Model Pruning jest r\u00f3wnie\u017c bliski biologii. Reakcj\u0119 sieci mo\u017cna por\u00f3wna\u0107 do plastyczno\u015bci m\u00f3zgu. Kilka ciekawych przyk\u0142ad\u00f3w mo\u017cna znale\u017a\u0107 w ksi\u0105\u017cce <noindex><a rel=\"nofollow\" href=\"https:\/\/www.litres.ru\/norman-doydzh\/plastichnost-mozga\/?utm_medium=cpc&amp;utm_source=google&amp;utm_campaign=DSA%7C149839530&amp;utm_term=&amp;utm_content=k50id%7Caud-499675211712%3Adsa-179513627318%7Ccid%7C149839530%7Caid%7C248455294996%7Cgid%7C6837176850%7Cpos%7C1t1%7Csrc%7Cg_%7Cdvc%7Cc%7Creg%7C1011993%7Crin%7C%7C&amp;k50id=6837176850%7Caud-499675211712%3Adsa-179513627318&amp;gclid=Cj0KCQiA0ZHwBRCRARIsAK0Tr-oKPqkmL7_Oxg62JZO8Jlk9zO-9nYKIRFxHi_lgoCvsQQadvUGxUzkaApgpEALw_wcB\">Normana Doidge'a.<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ol>\n<li>M\u00f3zg kobiety, kt\u00f3ra od urodzenia mia\u0142a tylko jedn\u0105 p\u00f3\u0142kul\u0119, sam przearan\u017cowa\u0142 si\u0119, by pe\u0142ni\u0107 funkcje brakuj\u0105cej p\u00f3\u0142kuli.<\/li>\n<li>Ch\u0142opak odgryz\u0142 sobie cz\u0119\u015b\u0107 m\u00f3zgu, odpowiadaj\u0105c\u0105 za wzrok. Z czasem inne cz\u0119\u015bci m\u00f3zgu przej\u0119\u0142y te funkcje. (nie pr\u00f3bujemy tego powtarza\u0107)<\/li>\n<\/ol>\n<p><\/p>\n<p>Tak i z Twojego modelu mo\u017cna usun\u0105\u0107 cz\u0119\u015b\u0107 s\u0142abych splot\u00f3w. W ostateczno\u015bci pozosta\u0142e sploty pomog\u0105 zast\u0105pi\u0107 usuni\u0119te. <\/p>\n<p><\/p>\n<h3 id=\"lyubish-transfer-learning-ili-uchish-s-nulya\">Lubisz Transfer Learning czy uczysz od podstaw?<\/h3>\n<p><\/p>\n<p><strong>Opcja numer jeden.<\/strong> U\u017cywasz Transfer Learning z Yolov3, Retina, Mask-RCNN lub U-Net. Jednak najcz\u0119\u015bciej nie musimy rozpoznawa\u0107 80 klas obiekt\u00f3w, jak w COCO. W mojej praktyce wszystko ogranicza si\u0119 do 1-2 klas. Mo\u017cna za\u0142o\u017cy\u0107, \u017ce architektura dla 80 klas jest w tym przypadku nadmierna. Nasuwa si\u0119 my\u015bl, \u017ce architektur\u0119 trzeba zmniejszy\u0107. Chcia\u0142bym to zrobi\u0107 bez utraty istniej\u0105cych wcze\u015bniej wyuczonych wag.<\/p>\n<p><\/p>\n<p><strong>Opcja numer dwa.<\/strong> Mo\u017ce masz du\u017co danych i zasob\u00f3w obliczeniowych lub po prostu potrzebujesz super dostosowanej architektury. To nie ma znaczenia. Ale uczysz sie\u0107 od podstaw. Zwyk\u0142y porz\u0105dek \u2014 patrzymy na struktur\u0119 danych, dobieramy NADMIERNIE mocn\u0105 architektur\u0119 i wprowadzamy drop-outy, aby zapobiec przeuczeniu. Widzia\u0142em drop-outy na poziomie 0.6, Karl. <\/p>\n<p><\/p>\n<p>W obu przypadkach sie\u0107 mo\u017cna zmniejszy\u0107. Zosta\u0142o to udowodnione. Teraz przejd\u017amy do wyja\u015bnienia, co to jest odcinanie pruning.<\/p>\n<p><\/p>\n<h3 id=\"obschiy-algoritm\">Og\u00f3lny algorytm<\/h3>\n<p><\/p>\n<p>Postanowili\u015bmy, \u017ce mo\u017cemy usun\u0105\u0107 niekt\u00f3re konwolucje. Wygl\u0105da to bardzo prosto:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1c01fa318d08550c9738c88d52e36b2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Usuni\u0119cie dowolnej konwolucji to stres dla sieci, kt\u00f3ry zwykle prowadzi do pewnego wzrostu b\u0142\u0119du. Z jednej strony, ten wzrost b\u0142\u0119du jest wska\u017anikiem tego, jak dobrze usuwamy konwolucje (na przyk\u0142ad, du\u017cy wzrost m\u00f3wi, \u017ce co\u015b robimy \u017ale). Ale niewielki wzrost jest jak najbardziej dopuszczalny i cz\u0119sto usuwa si\u0119 go dzi\u0119ki lekkiej dalszej nauce z ma\u0142ym LR. Dodajemy krok dalszej nauki:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d51df9606d65fd4e7e80209743f761c3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz musimy zrozumie\u0107, kiedy chcemy zatrzyma\u0107 nasz cykl Uczenia&lt;-&gt;Odcinania. Mo\u017cliwe s\u0105 egzotyczne warianty, gdy musimy zmniejszy\u0107 sie\u0107 do okre\u015blonego rozmiaru i szybko\u015bci dzia\u0142ania (na przyk\u0142ad dla urz\u0105dze\u0144 mobilnych). Jednak najcz\u0119\u015bciej jest to kontynuacja cyklu, dop\u00f3ki b\u0142\u0105d nie wzro\u015bnie powy\u017cej dopuszczalnego poziomu. Dodajemy warunek:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/9032018847833b54402124a29d3acbb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tak wi\u0119c algorytm staje si\u0119 jasny. Pozostaje nam rozwi\u0105za\u0107, jak okre\u015bli\u0107 usuwane konwolucje.<\/p>\n<p><\/p>\n<h3 id=\"poisk-udalyaemyh-svertok\">Wyszukiwanie usuwanych konwolucji<\/h3>\n<p><\/p>\n<p>Musimy usun\u0105\u0107 kilka pakiet\u00f3w. Rzucanie si\u0119 na nie i 'strzelanie' do wszystkich to z\u0142a strategia, mimo \u017ce mo\u017ce dzia\u0142a\u0107. Ale maj\u0105c g\u0142ow\u0119 na karku, mo\u017cna pomy\u015ble\u0107, aby spr\u00f3bowa\u0107 wyodr\u0119bni\u0107 do usuni\u0119cia 's\u0142abe' pakiety. Jest kilka opcji:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openreview.net\/pdf?id=rJqFGTslg\">Najmniejszy wska\u017anik L1 lub low_magnitude_pruning<\/a><\/noindex>. Idea g\u0142osi, \u017ce konwolucje o ma\u0142ych warto\u015bciach wag wnosz\u0105 niewielki wk\u0142ad w ostateczne podejmowanie decyzji. <\/li>\n<li>Najmniejszy wska\u017anik L1 z uwzgl\u0119dnieniem \u015bredniej i odchylenia standardowego. Uzupe\u0142niamy ocen\u0105 charakteru rozk\u0142adu.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.08571\">Maskowanie konwolucji i wykluczenie tych o najmniejszym wp\u0142ywie na ko\u0144cow\u0105 dok\u0142adno\u015b\u0107<\/a><\/noindex>. Bardziej precyzyjna identyfikacja ma\u0142o znacz\u0105cych konwolucji, ale bardzo czasoch\u0142onna i kosztowna w zasoby. <\/li>\n<li>Inne <\/li>\n<\/ol>\n<p><\/p>\n<p>Ka\u017cda z opcji ma prawo do \u017cycia i swoje cechy realizacji. Tutaj om\u00f3wimy wariant z najmniejsz\u0105 miar\u0105 L1<\/p>\n<p><\/p>\n<h3 id=\"ruchnoy-process-dlya-yolov3\">R\u0119czny proces dla YOLOv3<\/h3>\n<p><\/p>\n<p>W pierwotnej architekturze znajduj\u0105 si\u0119 bloki resztkowe. Jednak niezale\u017cnie od tego, jak \u015bwietne s\u0105 dla g\u0142\u0119bokich sieci, mog\u0105 nam w pewnym stopniu przeszkadza\u0107. Problematyczne jest to, \u017ce nie mo\u017cna usuwa\u0107 konwolucji z r\u00f3\u017cnymi indeksami w tych warstwach:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d516ab886a28d62a34e6a934fdd62c12.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dlatego wyodr\u0119bniamy warstwy, z kt\u00f3rych mo\u017cemy swobodnie usuwa\u0107 konwolucje:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/f9b69d9900d641e1d5835db9cc749189.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz zbudujmy cykl pracy:<\/p>\n<p><\/p>\n<ol>\n<li>Zrzucamy aktywacje<\/li>\n<li>Szacujemy, ile wyci\u0105\u0107 <\/li>\n<li>Wycinamy<\/li>\n<li>Uczymy przez 10 epok z LR=1e-4 <\/li>\n<li>Testowanie <\/li>\n<\/ol>\n<p><\/p>\n<p>Zrzucanie konwolucji jest przydatne, aby oceni\u0107, jak\u0105 cz\u0119\u015b\u0107 mo\u017cemy usun\u0105\u0107 na danym etapie. Przyk\u0142ady zrzut\u00f3w:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cd8202e6ce1aa0cc59fbdc4bd8562427.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Widzimy, \u017ce praktycznie wsz\u0119dzie 5% konwolucji ma bardzo nisk\u0105 norm\u0119 L1 i mo\u017cemy je usun\u0105\u0107. Na ka\u017cdym etapie taki zrzut powtarzano i dokonywano oceny, z jakich warstw i ile mo\u017cna wyci\u0105\u0107. <\/p>\n<p><\/p>\n<p>Ca\u0142y proces zmie\u015bci\u0142 si\u0119 w 4 krokach (tu i wsz\u0119dzie liczby odnosz\u0105 si\u0119 do RTX 2060 Super):<\/p>\n<p><\/p>\n<table>\n<thead>\n<tr>\n<th>Krok<\/th>\n<th>mAp75<\/th>\n<th>Liczba parametr\u00f3w, mln<\/th>\n<th>Rozmiar sieci, mb<\/th>\n<th>Od pierwotnego, %<\/th>\n<th>Czas przetwarzania, ms<\/th>\n<th>Warunek ci\u0119cia<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>0<\/td>\n<td>0.9656<\/td>\n<td>60<\/td>\n<td>241<\/td>\n<td>100<\/td>\n<td>180<\/td>\n<td>\u2014<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>0.9622<\/td>\n<td>55<\/td>\n<td>218<\/td>\n<td>91<\/td>\n<td>175<\/td>\n<td>5% wszystkich<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>0.9625<\/td>\n<td>50<\/td>\n<td>197<\/td>\n<td>83<\/td>\n<td>168<\/td>\n<td>5% wszystkich<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>0.9633<\/td>\n<td>39<\/td>\n<td>155<\/td>\n<td>64<\/td>\n<td>155<\/td>\n<td>15% dla warstw z 400+ konwolucjami<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>0.9555<\/td>\n<td>31<\/td>\n<td>124<\/td>\n<td>51<\/td>\n<td>146<\/td>\n<td>10% dla warstw z 100+ konwolucjami<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<p>W 2 kroku pojawi\u0142 si\u0119 jeden pozytywny efekt \u2014 w pami\u0119ci zmie\u015bci\u0142 si\u0119 rozmiar batcha 4, co znacz\u0105co przyspieszy\u0142o proces dalszego uczenia.<br \/>\nW 4 kroku proces zosta\u0142 zatrzymany, poniewa\u017c nawet d\u0142ugotrwa\u0142e dalsze uczenie nie podnios\u0142o mAp75 do dawnych warto\u015bci.<br \/>\nOstatecznie uda\u0142o si\u0119 przyspieszy\u0107 inference o <strong>15%<\/strong>, zmniejszy\u0107 rozmiar o<strong> 35% <\/strong>i nie straci\u0107 dok\u0142adno\u015bci. <\/p>\n<p><\/p>\n<h3 id=\"avtomatizaciya-dlya-bolee-prostyh-arhitektur\">Automatyzacja dla prostszych architektur<\/h3>\n<p><\/p>\n<p>Dla prostszych architektur sieci (bez warunkowych blok\u00f3w add, concatenate i residual) mo\u017cna spokojnie kierowa\u0107 si\u0119 przetwarzaniem wszystkich warstw konwolucyjnych i zautomatyzowa\u0107 proces wycinania konwolucji.<\/p>\n<p><\/p>\n<p>Taki wariant zaimplementowa\u0142em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">tutaj<\/a><\/noindex>.<br \/>\nJest to proste: potrzebujesz tylko funkcji strat, optymalizatora i generator\u00f3w batchy:<\/p>\n<p><\/p>\n<pre><code class=\"python\">import pruning\nfrom keras.optimizers import Adam\nfrom keras.utils import Sequence\n\ntrain_batch_generator = BatchGenerator...\nscore_batch_generator = BatchGenerator...\n\nopt = Adam(lr=1e-4)\npruner = pruning.Pruner(\"config.json\", \"categorical_crossentropy\", opt)\n\npruner.prune(train_batch, valid_batch)<\/code><\/pre>\n<p><\/p>\n<p>W razie potrzeby mo\u017cna zmieni\u0107 parametry konfiguracji:<\/p>\n<p><\/p>\n<pre><code class=\"json\">{\n    \"input_model_path\": \"model.h5\",\n    \"output_model_path\": \"model_pruned.h5\",\n    \"finetuning_epochs\": 10, # liczba epok do treningu mi\u0119dzy krokami przycinania\n    \"stop_loss\": 0.1, # strata do zatrzymania procesu\n    \"pruning_percent_step\": 0.05, # cz\u0119\u015b\u0107 konwolucji do usuni\u0119cia na ka\u017cdym kroku przycinania\n    \"pruning_standart_deviation_part\": 0.2 # przesuni\u0119cie do ograniczenia cz\u0119\u015bci przycinania\n}<\/code><\/pre>\n<p><\/p>\n<p>Dodatkowo wprowadzono ograniczenie na podstawie odchylenia standardowego. Celem jest ograniczenie cz\u0119\u015bci usuwanych, wykluczaj\u0105c pakiety z ju\u017c 'wystarczaj\u0105cymi' miarami L1:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/c2733d01a4d5b6e9a97a1e683d87ff45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W ten spos\u00f3b pozwalamy usun\u0105\u0107 tylko s\u0142abe konwolucje z rozk\u0142ad\u00f3w podobnych do prawego i nie wp\u0142ywa\u0107 na usuwanie z rozk\u0142ad\u00f3w podobnych do lewego:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/a9c9bee6322d268026ffb6713fc0bc86.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W miar\u0119 zbli\u017cania si\u0119 rozk\u0142adu do normalnego, wsp\u00f3\u0142czynnik pruning_standart_deviation_part mo\u017cna dostosowa\u0107 do:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/efee3eda6b8263de42e8f52541a3e949.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRekomenduj\u0119 tolerancj\u0119 na poziomie 2 sigm. Mo\u017cna r\u00f3wnie\u017c nie kierowa\u0107 si\u0119 t\u0105 cech\u0105, pozostawiaj\u0105c warto\u015b\u0107 &lt; 1.0.<\/p>\n<p><\/p>\n<p>Na wyj\u015bciu otrzymujemy wykres rozmiaru sieci, strat i czasu przetwarzania sieci przez ca\u0142y test, znormalizowany do 1.0. Na przyk\u0142ad tutaj rozmiar sieci zosta\u0142 zmniejszony prawie dwukrotnie bez utraty jako\u015bci (ma\u0142a sie\u0107 konwolucyjna z 100k wagami):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technika Jedi redukcji sieci konwolucyjnych \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1048ac38b12c753e54c8d8a2dc1dc394.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Czas przetwarzania podlega normalnym fluktuacjom i praktycznie si\u0119 nie zmieni\u0142. Istnieje na to wyja\u015bnienie:<\/p>\n<p><\/p>\n<ol>\n<li>Liczba konwolucji zmienia si\u0119 z wygodnych (32, 64, 128) na mniej wygodne dla kart graficznych \u2014 27, 51 itd. Mog\u0119 si\u0119 myli\u0107, ale prawdopodobnie ma to wp\u0142yw.<\/li>\n<li>Architektura nie jest szeroka, ale sekwencyjna. Zmniejszaj\u0105c szeroko\u015b\u0107, nie ingerujemy w g\u0142\u0119boko\u015b\u0107. W ten spos\u00f3b zmniejszamy obci\u0105\u017cenie, ale nie zmieniamy szybko\u015bci.<\/li>\n<\/ol>\n<p><\/p>\n<p>Dlatego poprawa przejawia si\u0119 w zmniejszeniu obci\u0105\u017cenia CUDA podczas przetwarzania o 20-30%, ale nie w zmniejszeniu czasu przetwarzania.<\/p>\n<p><\/p>\n<h3 id=\"itogi\">Podsumowanie<\/h3>\n<p><\/p>\n<p>Pochylmy si\u0119 nad tym. Rozwa\u017cali\u015bmy 2 warianty przycinania \u2014 dla YOLOv3 (kiedy trzeba dzia\u0142a\u0107 r\u0119cznie) i dla sieci z prostszymi architekturami. Wida\u0107, \u017ce w obu przypadkach mo\u017cna osi\u0105gn\u0105\u0107 zmniejszenie rozmiaru sieci i przyspieszenie bez utraty dok\u0142adno\u015bci. Wyniki:<\/p>\n<p><\/p>\n<ul>\n<li>Zmniejszenie rozmiaru<\/li>\n<li>Przyspieszenie przetwarzania<\/li>\n<li>Zmniejszenie obci\u0105\u017cenia CUDA<\/li>\n<li>W konsekwencji, ekologiczno\u015b\u0107 (Optymalizujemy przysz\u0142e wykorzystanie zasob\u00f3w obliczeniowych. Gdzie\u015b cieszy si\u0119 jedna <noindex><a rel=\"nofollow\" href=\"https:\/\/meduza.io\/feature\/2019\/12\/12\/kto-takaya-greta-tunberg-i-pochemu-ona-stala-chelovekom-goda-zhurnal-time\">Greta Thunberg<\/a><\/noindex>)<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"appendix\">Aneks<\/h3>\n<p><\/p>\n<ul>\n<li>Po kroku przycinania mo\u017cna r\u00f3wnie\u017c przeprowadzi\u0107 kwantyzacj\u0119 (na przyk\u0142ad z TensorRT)<\/li>\n<li>Tensorflow oferuje mo\u017cliwo\u015bci dla <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/model_optimization\/guide\/pruning\/pruning_with_keras\">low_magnitude_pruning<\/a><\/noindex>. Dzia\u0142a.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">Repozytorium<\/a><\/noindex> chc\u0119 rozwija\u0107 i b\u0119d\u0119 wdzi\u0119czny za pomoc<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/482050\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u043e\u0431\u043e\u0439 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u2014 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0411\u0435\u0440\u0435\u0448\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 YOLOv3 \u0438 \u0434\u043e\u043e\u0431\u0443\u0447\u0430\u0435\u0448\u044c. \u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c(mAp75) \u0431\u043e\u043b\u044c\u0448\u0435 0.95. \u041d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0432\u0441\u0451 \u0435\u0449\u0435 \u043d\u0438\u0437\u043a\u0430\u044f. \u0427\u0435\u0440\u0442. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043e\u0431\u043e\u0439\u0434\u0451\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u043a\u0432\u0430\u043d\u0442\u0438\u0437\u0430\u0446\u0438\u044e. \u0410 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c Model Pruning \u2014 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f Inference \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u2014 \u043e\u0442\u043a\u0443\u0434\u0430, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-54494","post","type-post","status-publish","format-standard","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0435\u0440\u0435\u0434 \u0442\u043e\u0431\u043e\u0439 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0434\u0430\u0447\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0414\u0436\u0435\u0434\u0430\u0439\u0441\u043a\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u2014 pruning | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0435\u0434 \u0442\u043e\u0431\u043e\u0439 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0434\u0430\u0447\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-26T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:30+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Technika Jedi do zmniejszania sieci konwolucyjnych \u2014 pruning | ProHoster","description":"Przed tob\u0105 znowu zadanie.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0414\u0436\u0435\u0434\u0430\u0439\u0441\u043a\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u2014 pruning | ProHoster","og:description":"\u041f\u0435\u0440\u0435\u0434 \u0442\u043e\u0431\u043e\u0439 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0434\u0430\u0447\u0430.","og:url":"https:\/\/prohoster.info\/pl\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-26T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:30+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54494","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 11:34:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:29:04","updated":"2026-01-24 11:34:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/54494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=54494"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/54494\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=54494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=54494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=54494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}