{"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\/pt\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","title":{"rendered":"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cca85b86c64843707a2167a7fed19867.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voc\u00ea tem novamente a tarefa de detec\u00e7\u00e3o de objetos. A prioridade \u00e9 a velocidade de opera\u00e7\u00e3o com uma precis\u00e3o aceit\u00e1vel. Voc\u00ea utiliza a arquitetura YOLOv3 e a ajusta. A precis\u00e3o (mAP75) \u00e9 maior que 0,95. Mas a velocidade de execu\u00e7\u00e3o ainda \u00e9 baixa. Droga. <\/p>\n<p><\/p>\n<p>Hoje vamos evitar a quantiza\u00e7\u00e3o. E abaixo veremos <strong>Model Pruning<\/strong> \u2014 a remo\u00e7\u00e3o de partes redundantes da rede para acelerar a infer\u00eancia sem perda de precis\u00e3o. De forma visual \u2014 de onde, quanto e como \u00e9 poss\u00edvel cortar. Vamos discutir como fazer isso manualmente e onde \u00e9 poss\u00edvel automatizar. No final \u2014 reposit\u00f3rio em keras.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie\">Introdu\u00e7\u00e3o<\/h3>\n<p><\/p>\n<p>No meu antigo emprego, na Macroscop de Perm, adquiri um h\u00e1bito \u2014 sempre acompanhar o tempo de execu\u00e7\u00e3o dos algoritmos. E o tempo de execu\u00e7\u00e3o das redes deve sempre ser verificado por meio de um filtro de adequa\u00e7\u00e3o. Normalmente, o state-of-the-art n\u00e3o passa por esse filtro, o que me levou ao Pruning. <\/p>\n<p><\/p>\n<p>O Pruning \u00e9 um tema antigo, apresentado nas <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=eZdOkDtYMoo\">aulas de Stanford<\/a><\/noindex> em 2017. A ideia principal \u00e9 reduzir o tamanho da rede treinada sem perder precis\u00e3o, removendo v\u00e1rios n\u00f3s. Parece \u00f3timo, mas raramente ou\u00e7o sobre sua aplica\u00e7\u00e3o. Provavelmente, faltam implementa\u00e7\u00f5es, h\u00e1 escassez de artigos em russo ou simplesmente todos acham o pruning um segredo e permanecem em sil\u00eancio.<br \/>\nMas vamos analisar.<\/p>\n<p><\/p>\n<h3 id=\"vzglyad-v-biologiyu\">Uma vis\u00e3o na biologia<\/h3>\n<p><\/p>\n<p>Gosto quando ideias da biologia s\u00e3o incorporadas ao Deep Learning. Elas, assim como a evolu\u00e7\u00e3o, podem ser confi\u00e1veis (e voc\u00ea sabia que a ReLU \u00e9 bastante semelhante \u00e0 <noindex><a rel=\"nofollow\" href=\"http:\/\/www.gatsby.ucl.ac.uk\/~lmate\/biblio\/dayanabbott.pdf\">fun\u00e7\u00e3o de ativa\u00e7\u00e3o dos neur\u00f4nios no c\u00e9rebro?<\/a><\/noindex>?) <\/p>\n<p><\/p>\n<p>O processo de Model Pruning tamb\u00e9m \u00e9 similar \u00e0 biologia. A rea\u00e7\u00e3o da rede aqui pode ser comparada \u00e0 plasticidade do c\u00e9rebro. H\u00e1 alguns exemplos interessantes no livro <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>O c\u00e9rebro de uma mulher, que tinha apenas uma metade desde o nascimento, reprogramou a si mesmo para realizar as fun\u00e7\u00f5es da metade que faltava.<\/li>\n<li>Um rapaz se atirou na cabe\u00e7a e atingiu a parte do c\u00e9rebro respons\u00e1vel pela vis\u00e3o. Com o tempo, outras partes do c\u00e9rebro assumiram essas fun\u00e7\u00f5es. (n\u00e3o estamos tentando repetir isso)<\/li>\n<\/ol>\n<p><\/p>\n<p>Assim, \u00e9 poss\u00edvel cortar partes das suas convolu\u00e7\u00f5es fracas. No pior dos casos, as convolu\u00e7\u00f5es restantes ajudar\u00e3o a substituir as cortadas. <\/p>\n<p><\/p>\n<h3 id=\"lyubish-transfer-learning-ili-uchish-s-nulya\">Voc\u00ea prefere Transfer Learning ou est\u00e1 aprendendo do zero?<\/h3>\n<p><\/p>\n<p><strong>Op\u00e7\u00e3o n\u00famero um.<\/strong> Voc\u00ea est\u00e1 usando Transfer Learning no Yolov3, Retina, Mask-RCNN ou U-Net. Mas, na maioria das vezes, n\u00e3o precisamos reconhecer 80 classes de objetos, como no COCO. Na minha experi\u00eancia, tudo se limita a 1-2 classes. Pode-se supor que a arquitetura para 80 classes \u00e9 excessiva aqui. Surge a ideia de que a arquitetura precisa ser reduzida, e isso deve ser feito sem perder os pesos pr\u00e9-treinados existentes.<\/p>\n<p><\/p>\n<p><strong>A segunda op\u00e7\u00e3o.<\/strong> Talvez voc\u00ea tenha muitos dados e recursos computacionais ou simplesmente precise de uma arquitetura super personalizada. N\u00e3o importa. Mas voc\u00ea est\u00e1 treinando a rede do zero. A ordem comum \u00e9 observar a estrutura dos dados, escolher uma arquitetura EXCESSIVA em pot\u00eancia e aplicar dropout para evitar overfitting. Eu j\u00e1 vi dropouts de 0.6, cara. <\/p>\n<p><\/p>\n<p>Em ambos os casos, a rede pode ser reduzida. Motivados. Agora vamos entender o que \u00e9 o pruning.<\/p>\n<p><\/p>\n<h3 id=\"obschiy-algoritm\">Algoritmo geral<\/h3>\n<p><\/p>\n<p>Decidimos que podemos remover as convolu\u00e7\u00f5es. Isso parece bastante simples:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1c01fa318d08550c9738c88d52e36b2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Remover qualquer convolu\u00e7\u00e3o \u00e9 um estresse para a rede, que geralmente leva a um aumento do erro. Por um lado, esse aumento de erro \u00e9 um indicativo de qu\u00e3o corretamente estamos removendo as convolu\u00e7\u00f5es (por exemplo, um grande aumento indica que estamos fazendo algo errado). Mas um pequeno aumento \u00e9 aceit\u00e1vel e muitas vezes \u00e9 eliminado por um leve re-treinamento com uma baixa taxa de aprendizado. Vamos adicionar um passo de re-treinamento:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d51df9606d65fd4e7e80209743f761c3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora precisamos entender quando queremos parar nosso ciclo de LearningPruning. Aqui podem existir op\u00e7\u00f5es ex\u00f3ticas, onde precisamos reduzir a rede a um determinado tamanho e velocidade de execu\u00e7\u00e3o (por exemplo, para dispositivos m\u00f3veis). No entanto, a op\u00e7\u00e3o mais comum \u00e9 continuar o ciclo at\u00e9 que o erro se torne maior do que o permitido. Vamos adicionar uma condi\u00e7\u00e3o:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/9032018847833b54402124a29d3acbb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ent\u00e3o, o algoritmo se torna claro. Resta entender como identificar as convolu\u00e7\u00f5es a serem removidas.<\/p>\n<p><\/p>\n<h3 id=\"poisk-udalyaemyh-svertok\">Busca por convolu\u00e7\u00f5es remov\u00edveis<\/h3>\n<p><\/p>\n<p>Precisamos remover algumas agrega\u00e7\u00f5es. Atacar de forma obstinada e \"descarregar\" qualquer uma delas \u00e9 uma m\u00e1 ideia, mesmo que funcione. Mas, j\u00e1 que temos a cabe\u00e7a, podemos pensar e tentar identificar as agrega\u00e7\u00f5es \"fracas\" para remo\u00e7\u00e3o. Existem v\u00e1rias op\u00e7\u00f5es:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openreview.net\/pdf?id=rJqFGTslg\">Menor medida L1 ou low_magnitude_pruning<\/a><\/noindex>. A ideia \u00e9 que convolu\u00e7\u00f5es com valores de peso baixos t\u00eam uma pequena contribui\u00e7\u00e3o na decis\u00e3o final. <\/li>\n<li>Menor medida L1 considerando a m\u00e9dia e o desvio padr\u00e3o. Complementamos com uma avalia\u00e7\u00e3o do tipo de distribui\u00e7\u00e3o.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.08571\">M\u00e1scara de convolu\u00e7\u00f5es e exclus\u00e3o das que t\u00eam menor impacto na precis\u00e3o final<\/a><\/noindex>. Defini\u00e7\u00e3o mais precisa de convolu\u00e7\u00f5es insignificantes, mas bastante dispendiosa em termos de tempo e recursos. <\/li>\n<li>O status est\u00e1vel (GA) foi obtido para os seguintes recursos: <\/li>\n<\/ol>\n<p><\/p>\n<p>Cada uma das op\u00e7\u00f5es tem seu valor e suas caracter\u00edsticas de implementa\u00e7\u00e3o. Aqui, vamos considerar a op\u00e7\u00e3o com a menor medida L1<\/p>\n<p><\/p>\n<h3 id=\"ruchnoy-process-dlya-yolov3\">Processo manual para YOLOv3<\/h3>\n<p><\/p>\n<p>A arquitetura original cont\u00e9m blocos residuais. Mas, por mais avan\u00e7ados que sejam para redes profundas, eles podem atrapalhar um pouco. O problema \u00e9 que n\u00e3o podemos remover convolu\u00e7\u00f5es com \u00edndices diferentes nessas camadas:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d516ab886a28d62a34e6a934fdd62c12.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Portanto, vamos destacar as camadas das quais podemos remover as convolu\u00e7\u00f5es livremente:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/f9b69d9900d641e1d5835db9cc749189.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora vamos construir um ciclo de trabalho:<\/p>\n<p><\/p>\n<ol>\n<li>Exportamos as ativa\u00e7\u00f5es<\/li>\n<li>Estimamos quanto cortar <\/li>\n<li>Cortamos<\/li>\n<li>Treinamos por 10 \u00e9pocas com LR=1e-4 <\/li>\n<li>Testando <\/li>\n<\/ol>\n<p><\/p>\n<p>Exportar convolu\u00e7\u00f5es \u00e9 \u00fatil para avaliar qual parte podemos remover em uma determinada etapa. Exemplos de exporta\u00e7\u00e3o:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cd8202e6ce1aa0cc59fbdc4bd8562427.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vemos que praticamente em todos os lugares, 5% das convolu\u00e7\u00f5es t\u00eam uma norma L1 bastante baixa e podemos remov\u00ea-las. Em cada etapa, essa exporta\u00e7\u00e3o foi repetida e foram feitas avalia\u00e7\u00f5es de quais camadas e quanto poder\u00edamos cortar. <\/p>\n<p><\/p>\n<p>Todo o processo se resolveu em 4 etapas (aqui e em todos os lugares, n\u00fameros para RTX 2060 Super):<\/p>\n<p><\/p>\n<table>\n<thead>\n<tr>\n<th>Passo<\/th>\n<th>mAp75<\/th>\n<th>N\u00famero de par\u00e2metros, milh\u00f5es<\/th>\n<th>Tamanho da rede, MB<\/th>\n<th>Em rela\u00e7\u00e3o ao original, %<\/th>\n<th>Tempo de execu\u00e7\u00e3o, ms<\/th>\n<th>Condi\u00e7\u00e3o de corte<\/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% do total<\/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% do total<\/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% para camadas com 400+ convolu\u00e7\u00f5es<\/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% para camadas com 100+ convolu\u00e7\u00f5es<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<p>No passo 2, surgiu um efeito positivo \u2014 o tamanho do lote 4 cabia na mem\u00f3ria, o que acelerou bastante o processo de re-treinamento.<br \/>\nNo passo 4, o processo foi interrompido, pois mesmo um longo re-treinamento n\u00e3o elevou o mAp75 aos valores antigos.<br \/>\nNo final, conseguimos acelerar a infer\u00eancia em <strong>15%<\/strong>, reduzir o tamanho em<strong> 35% <\/strong>e n\u00e3o perder precis\u00e3o. <\/p>\n<p><\/p>\n<h3 id=\"avtomatizaciya-dlya-bolee-prostyh-arhitektur\">Automatiza\u00e7\u00e3o para arquiteturas mais simples<\/h3>\n<p><\/p>\n<p>Para arquiteturas de rede mais simples (sem blocos condicionais add, concatenate e residuais), \u00e9 poss\u00edvel focar em processar todas as camadas convolucionais e automatizar o processo de remo\u00e7\u00e3o de convolu\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p>Esse tipo de implementa\u00e7\u00e3o eu realizei <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">aqui<\/a><\/noindex>.<br \/>\n\u00c9 simples: voc\u00ea s\u00f3 precisa da fun\u00e7\u00e3o de perda, otimizador e geradores de lote:<\/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>Se necess\u00e1rio, voc\u00ea pode alterar as configura\u00e7\u00f5es dos par\u00e2metros:<\/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, # o n\u00famero de \u00e9pocas para treinar entre as etapas de poda\n    \"stop_loss\": 0.1, # perda para interromper o processo\n    \"pruning_percent_step\": 0.05, # parte das convolu\u00e7\u00f5es a serem eliminadas a cada etapa de poda\n    \"pruning_standart_deviation_part\": 0.2 # deslocamento para limitar a parte de poda\n}<\/code><\/pre>\n<p><\/p>\n<p>Al\u00e9m disso, foi implementada uma limita\u00e7\u00e3o baseada no desvio padr\u00e3o. O objetivo \u00e9 restringir a parte removida, excluindo agrega\u00e7\u00f5es com medidas L1 j\u00e1 \"suficientes\":<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/c2733d01a4d5b6e9a97a1e683d87ff45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Com isso, permitimos a remo\u00e7\u00e3o apenas de convolu\u00e7\u00f5es fracas de distribui\u00e7\u00f5es semelhantes \u00e0 direita e n\u00e3o influenciamos a remo\u00e7\u00e3o de distribui\u00e7\u00f5es semelhantes \u00e0 esquerda:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/a9c9bee6322d268026ffb6713fc0bc86.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 medida que a distribui\u00e7\u00e3o se aproxima da normal, o coeficiente pruning_standart_deviation_part pode ser escolhido a partir de:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/efee3eda6b8263de42e8f52541a3e949.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRecomendo uma margem de 2 sigmas. Ou pode-se n\u00e3o se basear nessa particularidade, deixando o valor &lt; 1.0.<\/p>\n<p><\/p>\n<p>O resultado \u00e9 um gr\u00e1fico do tamanho da rede, perda e tempo de execu\u00e7\u00e3o da rede em todo o teste, normalizados para 1.0. Por exemplo, aqui o tamanho da rede foi reduzido quase pela metade sem perda de qualidade (uma pequena rede convolucional com 100k pesos):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00e9cnica Jedi de redu\u00e7\u00e3o de redes convolucionais \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1048ac38b12c753e54c8d8a2dc1dc394.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A velocidade de execu\u00e7\u00e3o est\u00e1 sujeita a flutua\u00e7\u00f5es normais e praticamente n\u00e3o mudou. Existe uma explica\u00e7\u00e3o para isso:<\/p>\n<p><\/p>\n<ol>\n<li>O n\u00famero de convolu\u00e7\u00f5es muda de formatos convenientes (32, 64, 128) para op\u00e7\u00f5es menos convenientes para placas gr\u00e1ficas \u2014 27, 51 etc. Posso estar errado, mas provavelmente isso influencia.<\/li>\n<li>A arquitetura n\u00e3o \u00e9 ampla, mas sequencial. Ao reduzir a largura, n\u00e3o alteramos a profundidade. Assim, reduzimos a carga, mas n\u00e3o mudamos a velocidade.<\/li>\n<\/ol>\n<p><\/p>\n<p>Portanto, a melhoria se traduz em uma redu\u00e7\u00e3o na carga do CUDA durante a execu\u00e7\u00e3o em 20-30%, mas n\u00e3o na redu\u00e7\u00e3o do tempo de execu\u00e7\u00e3o.<\/p>\n<p><\/p>\n<h3 id=\"itogi\">Resultados<\/h3>\n<p><\/p>\n<p>Vamos refletir. Consideramos 2 variantes de poda \u2014 para YOLOv3 (quando \u00e9 necess\u00e1rio trabalhar manualmente) e para redes com arquiteturas mais simples. \u00c9 evidente que em ambos os casos \u00e9 poss\u00edvel alcan\u00e7ar a redu\u00e7\u00e3o do tamanho da rede e acelera\u00e7\u00e3o sem perda de precis\u00e3o. Resultados:<\/p>\n<p><\/p>\n<ul>\n<li>Redu\u00e7\u00e3o de tamanho<\/li>\n<li>Acelera\u00e7\u00e3o da execu\u00e7\u00e3o<\/li>\n<li>Redu\u00e7\u00e3o da carga do CUDA<\/li>\n<li>Como consequ\u00eancia, sustentabilidade (Estamos otimizando o futuro uso de recursos computacionais. Em algum lugar, algu\u00e9m fica feliz <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\">Ap\u00eandice<\/h3>\n<p><\/p>\n<ul>\n<li>Ap\u00f3s o passo de poda, pode-se ajustar tamb\u00e9m a quantiza\u00e7\u00e3o (por exemplo, com TensorRT)<\/li>\n<li>O Tensorflow oferece recursos para <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/model_optimization\/guide\/pruning\/pruning_with_keras\">low_magnitude_pruning<\/a><\/noindex>. Funciona.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">Reposit\u00f3rio<\/a><\/noindex> Quero desenvolver e ficarei feliz com a ajuda<\/li>\n<\/ul>\n<p>Fonte: <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.3 - 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\/pt\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47T\u00e9cnica Jedi para redu\u00e7\u00e3o de redes convolucionais \u2014 pruning | ProHoster","description":"Diante de voc\u00ea novamente est\u00e1 a tarefa.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/54494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=54494"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/54494\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=54494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=54494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=54494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}