{"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\/fr\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","title":{"rendered":"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cca85b86c64843707a2167a7fed19867.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voici \u00e0 nouveau une t\u00e2che de d\u00e9tection d'objets. La priorit\u00e9 est la rapidit\u00e9 de fonctionnement avec une pr\u00e9cision acceptable. Vous utilisez l'architecture YOLOv3 et vous l'affinez. La pr\u00e9cision (mAp75) est sup\u00e9rieure \u00e0 0,95. Mais la vitesse d'ex\u00e9cution est encore faible. Zut. <\/p>\n<p><\/p>\n<p>Aujourd'hui, nous allons ignorer la quantification. Sous ce lien, nous allons examiner <strong>L'\u00e9lagage de mod\u00e8les<\/strong> \u2014 la suppression des parties redondantes du r\u00e9seau pour acc\u00e9l\u00e9rer l'inf\u00e9rence sans perte de pr\u00e9cision. Visuellement \u2014 d'o\u00f9, combien et comment on peut couper. Nous examinerons comment le faire manuellement et o\u00f9 nous pouvons automatiser. \u00c0 la fin \u2014 un d\u00e9p\u00f4t sur keras.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie\">Introduction<\/h3>\n<p><\/p>\n<p>Dans mon ancien emploi, chez Macroscop \u00e0 Perm, j'ai pris l'habitude de toujours surveiller le temps d'ex\u00e9cution des algorithmes. Et je v\u00e9rifiais toujours le temps d'ex\u00e9cution des r\u00e9seaux \u00e0 travers un filtre d'ad\u00e9quation. En g\u00e9n\u00e9ral, les state-of-the-art ne passent pas ce filtre en production, ce qui m'a conduit \u00e0 l'\u00e9lagage. <\/p>\n<p><\/p>\n<p>L'\u00e9lagage est un sujet ancien, dont il a \u00e9t\u00e9 question dans <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=eZdOkDtYMoo\">les cours de Stanford<\/a><\/noindex> en 2017. L'id\u00e9e principale est de r\u00e9duire la taille du r\u00e9seau entra\u00een\u00e9 sans perte de pr\u00e9cision en supprimant divers n\u0153uds. Cela semble cool, mais j'entends rarement parler de son application. Peut-\u00eatre qu'il manque des impl\u00e9mentations, qu'il n'y a pas d'articles en langue russe, ou tout simplement que tout le monde consid\u00e8re l'\u00e9lagage comme un savoir-faire et se tait.<br \/>\nMais allons y jeter un \u0153il<\/p>\n<p><\/p>\n<h3 id=\"vzglyad-v-biologiyu\">Un coup d'\u0153il en biologie<\/h3>\n<p><\/p>\n<p>J'aime quand des id\u00e9es provenant de la biologie p\u00e9n\u00e8trent dans le Deep Learning. Elles peuvent \u00eatre dignes de confiance, tout comme l'\u00e9volution (savais-tu que la ReLU ressemble beaucoup \u00e0 <noindex><a rel=\"nofollow\" href=\"http:\/\/www.gatsby.ucl.ac.uk\/~lmate\/biblio\/dayanabbott.pdf\">la fonction d'activation des neurones dans le cerveau<\/a><\/noindex>?) <\/p>\n<p><\/p>\n<p>Le processus d'\u00e9lagage de mod\u00e8les est aussi proche de la biologie. La r\u00e9action du r\u00e9seau peut ici \u00eatre compar\u00e9e \u00e0 la plasticit\u00e9 du cerveau. Il y a quelques exemples int\u00e9ressants dans le livre <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\">de Norman Doidge<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ol>\n<li>Le cerveau d'une femme, qui n'avait qu'une moiti\u00e9 depuis sa naissance, s'est reprogramm\u00e9 pour effectuer les fonctions de l'autre moiti\u00e9<\/li>\n<li>Un gar\u00e7on s'est tir\u00e9 une balle dans la partie du cerveau responsable de la vision. Avec le temps, d'autres parties du cerveau ont pris en charge ces fonctions. (nous ne tentons pas de r\u00e9p\u00e9ter cela)<\/li>\n<\/ol>\n<p><\/p>\n<p>Ainsi, il est possible d'\u00e9laguer certaines convolutions faibles de votre mod\u00e8le. En dernier recours, les convolutions restantes peuvent aider \u00e0 remplacer celles qui ont \u00e9t\u00e9 supprim\u00e9es. <\/p>\n<p><\/p>\n<h3 id=\"lyubish-transfer-learning-ili-uchish-s-nulya\">Aimes-tu le transfert d'apprentissage ou tu commences de z\u00e9ro ?<\/h3>\n<p><\/p>\n<p><strong>Option num\u00e9ro un.<\/strong> Vous utilisez le Transfer Learning avec Yolov3, Retina, Mask-RCNN ou U-Net. Mais le plus souvent, nous n'avons pas besoin de reconna\u00eetre 80 classes d'objets comme dans COCO. Dans ma pratique, cela se limite souvent \u00e0 1 ou 2 classes. On peut supposer que l'architecture pour 80 classes est ici excessive. L'id\u00e9e vient alors qu'il faudrait r\u00e9duire l'architecture, et ce, sans perdre les poids pr\u00e9-entra\u00een\u00e9s existants.<\/p>\n<p><\/p>\n<p><strong>Option num\u00e9ro deux.<\/strong> Peut-\u00eatre avez-vous beaucoup de donn\u00e9es et de ressources de calcul, ou simplement besoin d'une architecture hyper personnalis\u00e9e. Peu importe. Mais vous entra\u00eenez le r\u00e9seau depuis le d\u00e9but. L'ordre habituel est de regarder la structure des donn\u00e9es, de choisir une architecture DE PUISSANCE EXCESSIVE et de pousser les drops out pour \u00e9viter le surapprentissage. J'ai vu des drops out \u00e0 0,6, Carl. <\/p>\n<p><\/p>\n<p>Dans les deux cas, le r\u00e9seau peut \u00eatre r\u00e9duit. Nous en avons \u00e9t\u00e9 motiv\u00e9s. Passons maintenant \u00e0 la question de la r\u00e9duction, le pruning.<\/p>\n<p><\/p>\n<h3 id=\"obschiy-algoritm\">Algorithme g\u00e9n\u00e9ral<\/h3>\n<p><\/p>\n<p>Nous avons d\u00e9cid\u00e9 que nous pouvions supprimer des convolutions. Cela semble assez simple :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1c01fa318d08550c9738c88d52e36b2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La suppression de toute convolution est un stress pour le r\u00e9seau, ce qui entra\u00eene g\u00e9n\u00e9ralement une certaine augmentation de l'erreur. D'un c\u00f4t\u00e9, cette augmentation de l'erreur est un indicateur de la mani\u00e8re dont nous supprimons correctement les convolutions (par exemple, une grande augmentation signifie que quelque chose ne va pas). Mais une l\u00e9g\u00e8re augmentation est tout \u00e0 fait acceptable et se r\u00e9sout souvent par un l\u00e9ger r\u00e9entra\u00eenement avec un LR faible. Ajoutons une \u00e9tape de r\u00e9entra\u00eenement :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d51df9606d65fd4e7e80209743f761c3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous devons maintenant comprendre quand nous souhaitons arr\u00eater notre cycle Apprentissage&lt;-&gt;Pruning. Il peut y avoir des cas exotiques o\u00f9 nous devons r\u00e9duire le r\u00e9seau \u00e0 une certaine taille et vitesse d'ex\u00e9cution (par exemple, pour des appareils mobiles). Cependant, le cas le plus fr\u00e9quent est de poursuivre le cycle tant que l'erreur ne d\u00e9passe pas un seuil acceptable. Ajoutons une condition :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/9032018847833b54402124a29d3acbb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ainsi, l'algorithme devient clair. Reste \u00e0 d\u00e9terminer quelles convolutions supprimer.<\/p>\n<p><\/p>\n<h3 id=\"poisk-udalyaemyh-svertok\">Recherche de convolutions \u00e0 supprimer<\/h3>\n<p><\/p>\n<p>Nous devons supprimer certaines enveloppes. Fondre \u00e0 travers et 'tirer' n'importe quelle enveloppe est une mauvaise id\u00e9e, m\u00eame si cela fonctionne. Mais comme nous avons un cerveau, nous pouvons r\u00e9fl\u00e9chir et essayer d'identifier les enveloppes 'faibles' \u00e0 supprimer. Il existe plusieurs options :<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openreview.net\/pdf?id=rJqFGTslg\">La plus petite mesure L1 ou low_magnitude_pruning<\/a><\/noindex>. L'id\u00e9e stipule que les convolutions avec de petits poids contribuent peu \u00e0 la prise de d\u00e9cision finale. <\/li>\n<li>La plus petite mesure L1 prenant en compte la moyenne et l'\u00e9cart type. Compl\u00e9t\u00e9 par une \u00e9valuation de la nature de la distribution.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.08571\">Masquer les convolutions et exclure celles ayant le moins d'impact sur la pr\u00e9cision finale.<\/a><\/noindex>. Une d\u00e9finition plus pr\u00e9cise des convolutions insignifiantes, mais tr\u00e8s co\u00fbteuse en temps et en ressources. <\/li>\n<li>Autres <\/li>\n<\/ol>\n<p><\/p>\n<p>Chacune des options a le droit d'exister et ses sp\u00e9cificit\u00e9s de mise en \u0153uvre. Nous allons examiner l'option avec la plus petite mesure L1.<\/p>\n<p><\/p>\n<h3 id=\"ruchnoy-process-dlya-yolov3\">Processus manuel pour YOLOv3<\/h3>\n<p><\/p>\n<p>L'architecture de base contient des blocs r\u00e9siduels. Mais quel que soit leur niveau de sophistication pour les r\u00e9seaux profonds, ils peuvent nous poser probl\u00e8me. La difficult\u00e9 r\u00e9side dans le fait qu'il n'est pas possible de supprimer des convolutions avec des indices diff\u00e9rents dans ces couches :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d516ab886a28d62a34e6a934fdd62c12.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous allons donc identifier les couches dont nous pouvons supprimer librement les convolutions :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/f9b69d9900d641e1d5835db9cc749189.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous allons maintenant construire la boucle de travail :<\/p>\n<p><\/p>\n<ol>\n<li>D\u00e9chargeons les activations<\/li>\n<li>Estimons combien couper <\/li>\n<li>D\u00e9coupons<\/li>\n<li>Entra\u00eenons pendant 10 \u00e9poques avec LR=1e-4 <\/li>\n<li>Testons <\/li>\n<\/ol>\n<p><\/p>\n<p>D\u00e9charger les convolutions est utile pour \u00e9valuer quelle partie nous pouvons supprimer \u00e0 un moment donn\u00e9. Exemples de d\u00e9charge :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cd8202e6ce1aa0cc59fbdc4bd8562427.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous voyons que presque partout 5 % des convolutions ont une norme L1 tr\u00e8s faible et nous pouvons les supprimer. \u00c0 chaque \u00e9tape, cette d\u00e9charge \u00e9tait r\u00e9p\u00e9t\u00e9e et il a \u00e9t\u00e9 \u00e9valu\u00e9 de quelles couches et combien il \u00e9tait possible de couper. <\/p>\n<p><\/p>\n<p>Le processus entier s'est d\u00e9roul\u00e9 en 4 \u00e9tapes (ici et partout, les nombres pour RTX 2060 Super) :<\/p>\n<p><\/p>\n<table>\n<thead>\n<tr>\n<th>\u00c9tape<\/th>\n<th>mAp75<\/th>\n<th>Nombre de param\u00e8tres, millions<\/th>\n<th>Taille du r\u00e9seau, Mo<\/th>\n<th>Par rapport \u00e0 l'initial, %<\/th>\n<th>Temps d'ex\u00e9cution, ms<\/th>\n<th>Condition de coupure<\/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 % de l'ensemble<\/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 % de l'ensemble<\/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 % pour les couches avec 400+ convolutions<\/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 % pour les couches avec 100+ convolutions<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<p>\u00c0 la 2\u00e8me \u00e9tape, un effet positif a \u00e9t\u00e9 ajout\u00e9 : la taille de lot de 4 est entr\u00e9e dans la m\u00e9moire, ce qui a consid\u00e9rablement acc\u00e9l\u00e9r\u00e9 le processus de r\u00e9entra\u00eenement.<br \/>\n\u00c0 la 4\u00e8me \u00e9tape, le processus a \u00e9t\u00e9 arr\u00eat\u00e9, car m\u00eame un long r\u00e9entra\u00eenement n'augmentait pas le mAp75 aux anciens niveaux.<br \/>\nAu final, il a \u00e9t\u00e9 possible d'acc\u00e9l\u00e9rer l'inf\u00e9rence de <strong>15%<\/strong>, de r\u00e9duire la taille de<strong> 35% <\/strong>et de ne pas perdre en pr\u00e9cision. <\/p>\n<p><\/p>\n<h3 id=\"avtomatizaciya-dlya-bolee-prostyh-arhitektur\">Automatisation pour des architectures plus simples<\/h3>\n<p><\/p>\n<p>Pour des architectures de r\u00e9seaux plus simples (sans blocs conditionnels add, concaterner et r\u00e9siduels), il est tout \u00e0 fait possible de se concentrer sur le traitement de toutes les couches convolutives et d'automatiser le processus de d\u00e9coupe des convolutions.<\/p>\n<p><\/p>\n<p>J'ai impl\u00e9ment\u00e9 une telle option <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">ici<\/a><\/noindex>.<br \/>\nC'est simple : vous avez juste besoin de la fonction de perte, de l'optimiseur et des g\u00e9n\u00e9rateurs de lots :<\/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>Si n\u00e9cessaire, vous pouvez modifier les param\u00e8tres de configuration :<\/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, # le nombre d'\u00e9poques pour l'entra\u00eenement entre les \u00e9tapes de pruning\n    \"stop_loss\": 0.1, # perte pour arr\u00eater le processus\n    \"pruning_percent_step\": 0.05, # part des convs \u00e0 supprimer \u00e0 chaque \u00e9tape de pruning\n    \"pruning_standart_deviation_part\": 0.2 # d\u00e9calage pour limiter la partie prune\n}<\/code><\/pre>\n<p><\/p>\n<p>De plus, une restriction a \u00e9t\u00e9 mise en place bas\u00e9e sur l'\u00e9cart-type. L'objectif est de limiter la part des enveloppes supprim\u00e9es, en excluant celles avec des mesures L1 d\u00e9j\u00e0 'suffisantes' :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/c2733d01a4d5b6e9a97a1e683d87ff45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ainsi, nous permettons de supprimer uniquement les faibles convolutions des distributions similaires \u00e0 celle de droite sans influencer la suppression des distributions similaires \u00e0 celle de gauche :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/a9c9bee6322d268026ffb6713fc0bc86.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 mesure que la distribution se rapproche de la normale, le coefficient pruning_standart_deviation_part peut \u00eatre ajust\u00e9 \u00e0 partir de :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/efee3eda6b8263de42e8f52541a3e949.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJe recommande un \u00e9cart de 2 sigmas. Ou vous pouvez ne pas vous fier \u00e0 cette particularit\u00e9, en laissant une valeur &lt; 1,0.<\/p>\n<p><\/p>\n<p>Le r\u00e9sultat est un graphique de la taille du r\u00e9seau, de la perte et du temps d'ex\u00e9cution du r\u00e9seau tout au long du test, normalis\u00e9 \u00e0 1,0. Par exemple, ici la taille du r\u00e9seau a \u00e9t\u00e9 presque r\u00e9duite de moiti\u00e9 sans perte de qualit\u00e9 (un petit r\u00e9seau de convolution avec 100k poids) :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Technique Jedi de r\u00e9duction des r\u00e9seaux de neurones convolutifs \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1048ac38b12c753e54c8d8a2dc1dc394.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La vitesse d'ex\u00e9cution est sujette \u00e0 des fluctuations normales et n'a pratiquement pas chang\u00e9. Cela s'explique par :<\/p>\n<p><\/p>\n<ol>\n<li>Le nombre de convolutions change de pratiques (32, 64, 128) \u00e0 des valeurs moins adapt\u00e9es aux cartes graphiques \u2014 27, 51, etc. Je peux me tromper, mais cela influence probablement.<\/li>\n<li>L'architecture n'est pas large, mais s\u00e9quentielle. En diminuant la largeur, nous ne touchons pas \u00e0 la profondeur. Ainsi, nous r\u00e9duisons la charge sans changer la vitesse.<\/li>\n<\/ol>\n<p><\/p>\n<p>Par cons\u00e9quent, l'am\u00e9lioration s'est traduite par une r\u00e9duction de la charge CUDA lors de l'ex\u00e9cution de 20 \u00e0 30 %, mais pas par une diminution du temps d'ex\u00e9cution.<\/p>\n<p><\/p>\n<h3 id=\"itogi\">R\u00e9sultats<\/h3>\n<p><\/p>\n<p>R\u00e9fl\u00e9chissons. Nous avons consid\u00e9r\u00e9 2 options de pruning \u2014 pour YOLOv3 (quand il faut travailler manuellement) et pour des r\u00e9seaux avec des architectures plus simples. Il est \u00e9vident que dans les deux cas, il est possible d'atteindre une r\u00e9duction de la taille du r\u00e9seau et une acc\u00e9l\u00e9ration sans perte de pr\u00e9cision. R\u00e9sultats :<\/p>\n<p><\/p>\n<ul>\n<li>R\u00e9duction de la taille<\/li>\n<li>Acc\u00e9l\u00e9ration de l'ex\u00e9cution<\/li>\n<li>R\u00e9duction de la charge CUDA<\/li>\n<li>Par cons\u00e9quent, \u00e9cologiquement (nous optimisons l'utilisation future des ressources de calcul. Quelque part, une personne se r\u00e9jouit : <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\">Annexe<\/h3>\n<p><\/p>\n<ul>\n<li>Apr\u00e8s l'\u00e9tape de pruning, on peut aussi proc\u00e9der \u00e0 la quantification (par exemple avec TensorRT)<\/li>\n<li>Tensorflow offre des possibilit\u00e9s pour <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/model_optimization\/guide\/pruning\/pruning_with_keras\">low_magnitude_pruning<\/a><\/noindex>. \u00c7a fonctionne.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">D\u00e9p\u00f4t<\/a><\/noindex> je veux d\u00e9velopper et je serais heureux de toute aide<\/li>\n<\/ul>\n<p>Source : <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.2.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\/fr\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Technique Jedi de r\u00e9duction des r\u00e9seaux de convolution \u2014 pruning | ProHoster","description":"Vous avez \u00e0 nouveau un d\u00e9fi.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/54494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=54494"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/54494\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=54494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=54494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=54494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}