{"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\/de\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","title":{"rendered":"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cca85b86c64843707a2167a7fed19867.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vor dir steht wieder die Aufgabe der Objekterkennung. Priorit\u00e4t hat die Arbeitsgeschwindigkeit bei akzeptabler Genauigkeit. Du nimmst die Architektur YOLOv3 und bildest sie weiter. Die Genauigkeit (mAp75) liegt \u00fcber 0,95. Aber die Laufgeschwindigkeit ist immer noch niedrig. Verdammt. <\/p>\n<p><\/p>\n<p>Heute umgehen wir die Quantisierung. Im Nachfolgenden betrachten wir <strong>Model Pruning<\/strong> \u2014 das Entfernen \u00fcberfl\u00fcssiger Teile des Netzwerks zur Beschleunigung der Inferenz ohne Verlust der Genauigkeit. Verdeutlicht wird, wo, wie viel und wie man schneiden kann. Wir werden untersuchen, wie man dies manuell durchf\u00fchrt und wo Automatisierung m\u00f6glich ist. Am Ende \u2014 ein Repository auf Keras.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie\">Einf\u00fchrung<\/h3>\n<p><\/p>\n<p>An meinem vorherigen Arbeitsplatz, dem permischen Macroscop, habe ich mir eine Gewohnheit angeeignet \u2014 immer die Ausf\u00fchrungszeit der Algorithmen zu \u00fcberwachen. Die Laufzeit der Netzwerke \u00fcberpr\u00fcfe ich immer durch einen Angemessenheitsfilter. Normalerweise bestehen state-of-the-art Modelle diesen Filter nicht, was mich zum Pruning gef\u00fchrt hat. <\/p>\n<p><\/p>\n<p>Pruning \u2014 ein altes Thema, das in den <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=eZdOkDtYMoo\">Stanford-Vorlesungen<\/a><\/noindex> im Jahr 2017 behandelt wurde. Die Hauptidee ist die Reduzierung der Gr\u00f6\u00dfe eines trainierten Netzwerks, ohne die Genauigkeit zu verlieren, indem verschiedene Knoten entfernt werden. Klingt cool, aber ich h\u00f6re selten von seiner Anwendung. Wahrscheinlich fehlen Umsetzungen, es gibt keine russischsprachigen Artikel oder alle halten Pruning einfach f\u00fcr ein Geheimnis und schweigen.<br \/>\nAber lass uns das betrachten.<\/p>\n<p><\/p>\n<h3 id=\"vzglyad-v-biologiyu\">Ein Blick in die Biologie<\/h3>\n<p><\/p>\n<p>Ich liebe es, wenn im Deep Learning Ideen aus der Biologie aufblitzen. Ihnen, wie der Evolution, kann man vertrauen (wusstest du, dass ReLU sehr \u00e4hnlich ist wie <noindex><a rel=\"nofollow\" href=\"http:\/\/www.gatsby.ucl.ac.uk\/~lmate\/biblio\/dayanabbott.pdf\">die Aktivierungsfunktion von Neuronen im Gehirn<\/a><\/noindex>?) <\/p>\n<p><\/p>\n<p>Der Prozess des Model Pruning ist auch nahe an der Biologie. Die Reaktion des Netzwerks hier kann mit der Plastizit\u00e4t des Gehirns verglichen werden. Einige interessante Beispiele finden sich im Buch <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\">von Norman Doidge.<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ol>\n<li>Das Gehirn einer Frau, die von Geburt an nur eine Gehirnh\u00e4lfte hatte, hat sich selbst umprogrammiert, um die Funktionen der fehlenden H\u00e4lfte auszuf\u00fchren.<\/li>\n<li>Ein Junge hat sich einen Teil seines Gehirns entfernt, der f\u00fcr das Sehen verantwortlich war. Im Laufe der Zeit haben andere Teile des Gehirns diese Funktionen \u00fcbernommen. (Wiederholen wir nicht.)<\/li>\n<\/ol>\n<p><\/p>\n<p>So kann auch aus deinem Modell ein Teil schwacher Faltungen entfernt werden. Im schlimmsten Fall k\u00f6nnen die verbleibenden Faltungen die entfernten ersetzen. <\/p>\n<p><\/p>\n<h3 id=\"lyubish-transfer-learning-ili-uchish-s-nulya\">Liebst du Transfer Learning oder lernst du von Grund auf neu?<\/h3>\n<p><\/p>\n<p><strong>Option Nummer eins.<\/strong> Du verwendest Transfer Learning f\u00fcr Yolov3. Retina, Mask-RCNN oder U-Net. Aber meistens m\u00fcssen wir nicht 80 Klassen von Objekten erkennen, wie in COCO. In meiner Praxis beschr\u00e4nken sich die Klassen auf 1-2. Man k\u00f6nnte annehmen, dass die Architektur f\u00fcr 80 Klassen hier \u00fcberdimensioniert ist. Es liegt nahe, die Architektur zu reduzieren. Und das m\u00f6chte ich gerne tun, ohne die vorhandenen vortrainierten Gewichte zu verlieren.<\/p>\n<p><\/p>\n<p><strong>Variante Nummer zwei.<\/strong> Vielleicht hast du viele Daten und Rechenressourcen oder brauchst einfach eine super individuelle Architektur. Egal. Aber du trainierst das Netzwerk von Grund auf. Der \u00fcbliche Ablauf \u2014 wir schauen uns die Datenstruktur an, w\u00e4hlen eine \u00dcBERDIMENSIONIERTE Architektur aus und dr\u00fccken Dropouts gegen \u00dcberanpassung. Ich habe Dropouts von 0.6 gesehen, Karl. <\/p>\n<p><\/p>\n<p>In beiden F\u00e4llen kann das Netzwerk verkleinert werden. Das waren die Anreize. Jetzt lass uns kl\u00e4ren, was es mit dem Pruning auf sich hat.<\/p>\n<p><\/p>\n<h3 id=\"obschiy-algoritm\">Allgemeiner Algorithmus<\/h3>\n<p><\/p>\n<p>Wir haben beschlossen, dass wir Faltungen entfernen k\u00f6nnen. Das sieht ziemlich einfach aus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1c01fa318d08550c9738c88d52e36b2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Entfernung einer beliebigen Faltung ist ein Stress f\u00fcr das Netzwerk, der normalerweise mit einem gewissen Anstieg des Fehlers einhergeht. Einerseits ist dieser Anstieg des Fehlers ein Ma\u00df daf\u00fcr, wie korrekt wir die Faltungen entfernen (zum Beispiel zeigt ein gro\u00dfer Anstieg, dass wir etwas falsch machen). Aber ein kleiner Anstieg ist durchaus akzeptabel und wird oft durch anschlie\u00dfendes leichtes Nachtraining mit einem niedrigen LR behoben. Wir f\u00fcgen einen Schritt zum Nachtraining hinzu:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d51df9606d65fd4e7e80209743f761c3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jetzt m\u00fcssen wir verstehen, wann wir unseren Zyklus Learning&lt;-&gt;Pruning stoppen wollen. Hier kann es exotische F\u00e4lle geben, in denen wir das Netzwerk auf eine bestimmte Gr\u00f6\u00dfe und Geschwindigkeit reduzieren m\u00fcssen (zum Beispiel f\u00fcr mobile Ger\u00e4te). Der h\u00e4ufigste Fall ist jedoch, dass wir den Zyklus fortsetzen, bis der Fehler den zul\u00e4ssigen Wert \u00fcberschreitet. Wir f\u00fcgen eine Bedingung hinzu:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/9032018847833b54402124a29d3acbb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>So wird der Algorithmus klar. Es bleibt zu kl\u00e4ren, wie wir die zu entfernenden Faltungen bestimmen.<\/p>\n<p><\/p>\n<h3 id=\"poisk-udalyaemyh-svertok\">Suche nach zu entfernenden Faltungen<\/h3>\n<p><\/p>\n<p>Wir m\u00fcssen einige Zusammenfassungen entfernen. Blind vorw\u00e4rts zu gehen und einfach alles \"abzuschie\u00dfen\" ist keine gute Idee, auch wenn es funktionieren mag. Aber wenn man nachdenkt, kann man versuchen, die \"schwachen\" Zusammenfassungen f\u00fcr die Entfernung zu identifizieren. Es gibt mehrere M\u00f6glichkeiten:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openreview.net\/pdf?id=rJqFGTslg\">Kleinster L1-Ma\u00dfstab oder low_magnitude_pruning<\/a><\/noindex>. Die Idee besagt, dass Faltungen mit kleinen Gewichtswerten, einen geringen Beitrag zur endg\u00fcltigen Entscheidungsfindung leisten. <\/li>\n<li>Kleinster L1-Ma\u00dfstab unter Ber\u00fccksichtigung von Mittelwert und Standardabweichung. Wir erg\u00e4nzen die Bewertung der Verteilung.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.08571\">Maskierung von Faltungen und Ausschluss der am wenigsten einflussreichen auf die Gesamtabweichung<\/a><\/noindex>. Eine genauere Bestimmung der unwesentlichen Faltungen, jedoch zeit- und ressourcenintensiv. <\/li>\n<li>Andere <\/li>\n<\/ol>\n<p><\/p>\n<p>Jede der Varianten hat das Recht auf Existenz und eigene Umsetzungsmerkmale. Hier betrachten wir die Variante mit der kleinsten L1-Metrik<\/p>\n<p><\/p>\n<h3 id=\"ruchnoy-process-dlya-yolov3\">Manueller Prozess f\u00fcr YOLOv3<\/h3>\n<p><\/p>\n<p>In der urspr\u00fcnglichen Architektur sind Residualbl\u00f6cke enthalten. Doch egal wie beeindruckend sie f\u00fcr tiefe Netzwerke sind, sie st\u00f6ren uns etwas. Das Problem ist, dass Faltungen mit unterschiedlichen Indizes in diesen Schichten nicht entfernt werden k\u00f6nnen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d516ab886a28d62a34e6a934fdd62c12.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Deshalb bestimmen wir die Schichten, aus denen wir Faltungen frei entfernen k\u00f6nnen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/f9b69d9900d641e1d5835db9cc749189.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jetzt erstellen wir den Arbeitszyklus:<\/p>\n<p><\/p>\n<ol>\n<li>Wir laden die Aktivierungen hoch<\/li>\n<li>Wir sch\u00e4tzen ein, wie viel ausgeschnitten werden soll <\/li>\n<li>Wir schneiden aus<\/li>\n<li>Wir trainieren 10 Epochen mit LR=1e-4 <\/li>\n<li>Wir testen <\/li>\n<\/ol>\n<p><\/p>\n<p>Das Entfernen der Faltungen ist n\u00fctzlich, um zu bewerten, welchen Teil wir in einem bestimmten Schritt entfernen k\u00f6nnen. Beispiele f\u00fcr das Entfernen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cd8202e6ce1aa0cc59fbdc4bd8562427.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir sehen, dass fast \u00fcberall 5% der Faltungen eine sehr niedrige L1-Norm aufweisen und wir sie entfernen k\u00f6nnen. In jedem Schritt wurde solch ein Entfernen wiederholt und eine Bewertung durchgef\u00fchrt, aus welchen Schichten und wie viel entfernt werden kann. <\/p>\n<p><\/p>\n<p>Der gesamte Prozess war in 4 Schritte unterteilt (hier und \u00fcberall die Zahlen f\u00fcr RTX 2060 Super):<\/p>\n<p><\/p>\n<table>\n<thead>\n<tr>\n<th>Schritt<\/th>\n<th>mAp75<\/th>\n<th>Anzahl der Parameter, Mio.<\/th>\n<th>Gr\u00f6\u00dfe des Netzwerks, MB<\/th>\n<th>Von der urspr\u00fcnglichen, %<\/th>\n<th>Laufzeit, ms<\/th>\n<th>Bedingung zum Ausschneiden<\/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% von allen<\/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% von allen<\/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% f\u00fcr Schichten mit 400+ Faltungen<\/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% f\u00fcr Schichten mit 100+ Faltungen<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<p>Zu Schritt 2 kam ein positiver Effekt hinzu \u2013 eine Batch-Gr\u00f6\u00dfe von 4 passte in den Speicher, was den Prozess des weiteren Trainings erheblich beschleunigte.<br \/>\nIm Schritt 4 wurde der Prozess gestoppt, da auch ein l\u00e4ngeres weiteres Training mAp75 nicht auf die alten Werte erh\u00f6hen konnte.<br \/>\nLetztendlich konnte der Inferenzprozess beschleunigt werden um <strong>15%<\/strong>, die Gr\u00f6\u00dfe reduziert werden um<strong> 35% <\/strong>und es ging keine Genauigkeit verloren. <\/p>\n<p><\/p>\n<h3 id=\"avtomatizaciya-dlya-bolee-prostyh-arhitektur\">Automatisierung f\u00fcr einfachere Architekturen<\/h3>\n<p><\/p>\n<p>F\u00fcr einfachere Netzwerkarchitekturen (ohne bedingte add, concatenate und residual Bl\u00f6cke) kann man sich ganz auf die Verarbeitung aller Faltungsschichten konzentrieren und den Prozess des Ausschneidens von Faltungen automatisieren.<\/p>\n<p><\/p>\n<p>Solch eine Variante habe ich implementiert <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">hier<\/a><\/noindex>.<br \/>\nEs ist ganz einfach: Sie ben\u00f6tigen nur die Verlustfunktion, den Optimierer und die Batch-Generatoren:<\/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>Falls n\u00f6tig, k\u00f6nnen die Konfigurationsparameter ge\u00e4ndert werden:<\/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, # die Anzahl der Epochen zum Trainieren zwischen den Pruning-Schritten\n    \"stop_loss\": 0.1, # Verlust zum Stoppen des Prozesses\n    \"pruning_percent_step\": 0.05, # Anteil der Konvolutionen, die bei jedem Pruning-Schritt gel\u00f6scht werden\n    \"pruning_standart_deviation_part\": 0.2 # Verschiebung zur Begrenzung des Pruning-Anteils\n}<\/code><\/pre>\n<p><\/p>\n<p>Zus\u00e4tzlich wurde eine Begrenzung auf Basis der Standardabweichung implementiert. Ziel ist es, den Teil der entfernten Zusammenfassungen zu beschr\u00e4nken, wobei Zusammenfassungen mit bereits \"ausreichenden\" L1-Ma\u00dfnahmen ausgeschlossen werden:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/c2733d01a4d5b6e9a97a1e683d87ff45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Damit erlauben wir es, nur schwache Konvolutionen aus Verteilungen \u00e4hnlich der rechten zu l\u00f6schen und nicht die L\u00f6schung aus Verteilungen \u00e4hnlich der linken zu beeinflussen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/a9c9bee6322d268026ffb6713fc0bc86.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bei der Ann\u00e4herung der Verteilung an die Normalverteilung kann der Koeffizient pruning_standart_deviation_part ausgew\u00e4hlt werden aus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/efee3eda6b8263de42e8f52541a3e949.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIch empfehle eine Toleranz von 2 Sigma. Alternativ kann man diese Besonderheit ignorieren und den Wert &lt; 1.0 belassen.<\/p>\n<p><\/p>\n<p>Das Ergebnis ist ein Diagramm der Netzwerkgr\u00f6\u00dfe, Verluste und der Laufzeit des Netzwerks \u00fcber den gesamten Test, normiert auf 1.0. Zum Beispiel wurde hier die Netzwerkgr\u00f6\u00dfe fast halbiert, ohne an Qualit\u00e4t zu verlieren (ein kleines Convolutional-Netzwerk mit 100k Gewichten):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi-Technik zur Reduzierung von konvolutionalen Netzen \u2014 Pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1048ac38b12c753e54c8d8a2dc1dc394.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Laufgeschwindigkeit unterliegt normalen Schwankungen und hat sich praktisch nicht ver\u00e4ndert. Das hat einen Grund:<\/p>\n<p><\/p>\n<ol>\n<li>Die Anzahl der Konvolutionen wechselt von bequemen (32, 64, 128) zu weniger bequemen f\u00fcr Grafikkarten \u2014 27, 51 usw. Hier kann ich mich irren, aber wahrscheinlich hat das einen Einfluss.<\/li>\n<li>Die Architektur ist nicht breit, sondern durchg\u00e4ngig. Indem wir die Breite reduzieren, \u00e4ndern wir nicht die Tiefe. So verringern wir die Last, ohne die Geschwindigkeit zu beeinflussen.<\/li>\n<\/ol>\n<p><\/p>\n<p>Daher zeigt sich die Verbesserung in der Reduzierung der CUDA-Last beim Durchlauf um 20-30%, jedoch nicht in der Verringerung der Durchlaufzeit.<\/p>\n<p><\/p>\n<h3 id=\"itogi\">Ergebnisse<\/h3>\n<p><\/p>\n<p>Lass uns reflektieren. Wir haben zwei Varianten des Pruning betrachtet \u2014 f\u00fcr YOLOv3 (wenn man manuell arbeiten muss) und f\u00fcr Netzwerke mit einfacheren Architekturen. Es ist klar, dass in beiden F\u00e4llen eine Verringerung der Netzwerkgr\u00f6\u00dfe und Beschleunigung ohne Verlust an Genauigkeit erreicht werden kann. Ergebnisse:<\/p>\n<p><\/p>\n<ul>\n<li>Verringerung der Gr\u00f6\u00dfe<\/li>\n<li>Beschleunigung des Durchlaufs<\/li>\n<li>Verringerung der CUDA-Last<\/li>\n<li>Als Folge davon ist die Umweltfreundlichkeit (Wir optimieren die zuk\u00fcnftige Nutzung von Rechenressourcen. Irgendwo freut sich eine <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\">Anhang<\/h3>\n<p><\/p>\n<ul>\n<li>Nach dem Pruning-Schritt kann noch Quantisierung hinzugef\u00fcgt werden (zum Beispiel mit TensorRT)<\/li>\n<li>Tensorflow bietet M\u00f6glichkeiten f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/model_optimization\/guide\/pruning\/pruning_with_keras\">low_magnitude_pruning<\/a><\/noindex>. Es funktioniert.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">Repository<\/a><\/noindex> Ich m\u00f6chte mich weiterentwickeln und freue mich \u00fcber Hilfe.<\/li>\n<\/ul>\n<p>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Jedi-Technik zur Reduzierung von Convolutional-Netzen \u2014 Pruning | ProHoster","description":"Vor dir steht erneut eine Aufgabe.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/54494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=54494"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/54494\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=54494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=54494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=54494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}