{"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\/en\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","title":{"rendered":"Jedi technique for reducing convolutional networks \u2014 pruning","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cca85b86c64843707a2167a7fed19867.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>You are once again faced with the task of object detection. The priority is the speed of operation with acceptable accuracy. You take the YOLOv3 architecture and fine-tune it. The accuracy (mAP75) should be above 0.95. However, the processing speed is still low. Damn. <\/p>\n<p><\/p>\n<p>Today we will bypass quantization. Below, we will consider <strong>Model Pruning<\/strong> \u2014 trimming redundant parts of the network to speed up inference without losing accuracy. Clearly showing where, how much, and how you can cut. We will discuss how to do this manually and where automation can be applied. At the end \u2014 a repository on Keras.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie\">Introduction<\/h3>\n<p><\/p>\n<p>At my last job, at Macroscop in Perm, I acquired a habit \u2014 always monitoring the execution time of algorithms. And always checking the networks' processing times through a sanity filter. Usually, state-of-the-art models don\u2019t pass this filter in production, which led me to Pruning. <\/p>\n<p><\/p>\n<p>Pruning is an old topic, discussed in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=eZdOkDtYMoo\">Stanford lectures<\/a><\/noindex> in 2017. The main idea is to reduce the size of the trained network without losing accuracy by removing different nodes. It sounds great, but I rarely hear about its application. Perhaps, there\u2019s a lack of implementations, no articles in Russian, or maybe everyone considers pruning a proprietary technique and remains silent.<br \/>\nBut let's break it down<\/p>\n<p><\/p>\n<h3 id=\"vzglyad-v-biologiyu\">A glance at biology<\/h3>\n<p><\/p>\n<p>I love when ideas from biology peek into Deep Learning. You can trust them, just like evolution (did you know that ReLU is quite similar to <noindex><a rel=\"nofollow\" href=\"http:\/\/www.gatsby.ucl.ac.uk\/~lmate\/biblio\/dayanabbott.pdf\">the activation function of neurons in the brain?<\/a><\/noindex>?) <\/p>\n<p><\/p>\n<p>The Model Pruning process is also close to biology. The network's reaction can be compared to the plasticity of the brain. There are a couple of interesting examples in the book <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\">by Norman Doidge.<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ol>\n<li>A woman's brain, which was born with only one hemisphere, reprogrammed itself to perform the functions of the missing hemisphere.<\/li>\n<li>A guy shot himself in the part of the brain responsible for vision. Over time, other parts of the brain took over these functions. (We are not trying to repeat this)<\/li>\n<\/ol>\n<p><\/p>\n<p>Just as you can cut parts of weak convolutions from your model. In the worst case, the remaining convolutions will help compensate for the ones that were cut. <\/p>\n<p><\/p>\n<h3 id=\"lyubish-transfer-learning-ili-uchish-s-nulya\">Do you prefer Transfer Learning or start from scratch?<\/h3>\n<p><\/p>\n<p><strong>Option number one.<\/strong> You are using Transfer Learning with Yolov3, Retina, Mask-RCNN, or U-Net. But most often we don't need to recognize 80 object classes like in COCO. In my experience, it's usually limited to 1-2 classes. One might assume that the architecture for 80 classes is excessive here. It raises the question of reducing the architecture. Moreover, I would like to do this without losing the existing pretrained weights.<\/p>\n<p><\/p>\n<p><strong>Option two.<\/strong> Maybe you have a lot of data and computational resources or just need a highly customized architecture. It doesn't matter. But you are training the network from scratch. The usual order is to look at the data structure, select an OVERLY powerful architecture, and apply dropout to combat overfitting. I have seen dropouts of 0.6, Carl. <\/p>\n<p><\/p>\n<p>In both cases, the network can be reduced. You motivated me. Now let's figure out what pruning is.<\/p>\n<p><\/p>\n<h3 id=\"obschiy-algoritm\">General algorithm<\/h3>\n<p><\/p>\n<p>We decided that we can remove convolutions. This looks quite simple:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1c01fa318d08550c9738c88d52e36b2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Removing any convolution is a stress for the network, which usually leads to some increase in error. On one hand, this increase in error indicates how correctly we are removing convolutions (for example, a significant increase suggests that we are doing something wrong). However, a small increase is quite acceptable and is often mitigated by subsequent light retraining with a small LR. We add a retraining step:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d51df9606d65fd4e7e80209743f761c3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Now we need to understand when we want to stop our LearningPruning cycle. There can be exotic cases where we need to reduce the network to a specific size and speed of execution (for example, for mobile devices). However, the most common scenario is to continue the cycle until the error exceeds the acceptable level. We add a condition:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/9032018847833b54402124a29d3acbb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>So, the algorithm becomes clear. We just need to figure out how to identify removable convolutions.<\/p>\n<p><\/p>\n<h3 id=\"poisk-udalyaemyh-svertok\">Finding removable convolutions<\/h3>\n<p><\/p>\n<p>We need to remove certain wrappers. Blasting through and 'shooting' any of them is a bad idea, even if it might work. However, since we have intelligence, we can think and try to identify the 'weak' wrappers for removal. There are several options:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/openreview.net\/pdf?id=rJqFGTslg\">Smallest L1 measure or low_magnitude_pruning<\/a><\/noindex>. The idea here is that convolutions with small weight values contribute little to the final decision-making. <\/li>\n<li>Smallest L1 measure considering the mean and standard deviation. We complement with an evaluation of the distribution characteristics.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.08571\">Masking of convolutions and excluding those with minimal impact on the final accuracy<\/a><\/noindex>. A more accurate definition of insignificant convolutions, but quite time-consuming and resource-intensive. <\/li>\n<li>Others <\/li>\n<\/ol>\n<p><\/p>\n<p>Each option has its place and specific implementation characteristics. Here, we will consider the option with the least L1 measure<\/p>\n<p><\/p>\n<h3 id=\"ruchnoy-process-dlya-yolov3\">Manual process for YOLOv3<\/h3>\n<p><\/p>\n<p>The original architecture contains residual blocks. But no matter how effective they are for deep networks, they are somewhat obstructive for us. The complexity lies in the fact that we cannot remove convolutions with different indices in these layers:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/d516ab886a28d62a34e6a934fdd62c12.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Therefore, we will highlight the layers from which we can freely remove convolutions:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/f9b69d9900d641e1d5835db9cc749189.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Now let's construct the workflow loop:<\/p>\n<p><\/p>\n<ol>\n<li>Dumping activations<\/li>\n<li>Assessing how much to cut <\/li>\n<li>Cutting<\/li>\n<li>Training for 10 epochs with LR=1e-4 <\/li>\n<li>Testing <\/li>\n<\/ol>\n<p><\/p>\n<p>Dumping convolutions is useful to estimate what part we can remove at a given step. Examples of dumping:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/cd8202e6ce1aa0cc59fbdc4bd8562427.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>We see that almost everywhere 5% of the convolutions have a very low L1 norm, and we can remove them. This dumping was repeated at every step, and assessments were made regarding which layers and how much could be cut. <\/p>\n<p><\/p>\n<p>The entire process was completed in 4 steps (here and everywhere numbers are for RTX 2060 Super):<\/p>\n<p><\/p>\n<table>\n<thead>\n<tr>\n<th>Step<\/th>\n<th>mAp75<\/th>\n<th>Number of parameters, million<\/th>\n<th>Network size, MB<\/th>\n<th>From the original, %<\/th>\n<th>Run time, ms<\/th>\n<th>Trimming condition<\/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% of all<\/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% of all<\/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% for layers with 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% for layers with 100+ convolutions<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<p>By the second step, one positive effect emerged \u2014 the batch size of 4 fit into memory, significantly speeding up the retraining process.<br \/>\nAt the fourth step, the process was halted, as even prolonged retraining did not raise mAp75 to previous values.<br \/>\nIn the end, inference was accelerated by <strong>15%<\/strong>, reduced size by<strong> 35% <\/strong>and accuracy was not lost. <\/p>\n<p><\/p>\n<h3 id=\"avtomatizaciya-dlya-bolee-prostyh-arhitektur\">Automation for simpler architectures<\/h3>\n<p><\/p>\n<p>For simpler network architectures (without conditional add, concatenate, and residual blocks), it's quite feasible to focus on processing all convolutional layers and automate the process of trimming convolutions.<\/p>\n<p><\/p>\n<p>I implemented this approach <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">here<\/a><\/noindex>.<br \/>\nIt's simple: you only need to provide the loss function, optimizer, and batch generators:<\/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>If necessary, configuration parameters can be adjusted:<\/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, # the number of epochs for train between pruning steps\n    \"stop_loss\": 0.1, # loss for stopping process\n    \"pruning_percent_step\": 0.05, # part of convs for delete on every pruning step\n    \"pruning_standart_deviation_part\": 0.2 # shift for limit pruning part\n}<\/code><\/pre>\n<p><\/p>\n<p>Additionally, a constraint based on standard deviation has been implemented. The goal is to limit the portion being removed, excluding wrappers that already have 'sufficient' L1 measures:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/c2733d01a4d5b6e9a97a1e683d87ff45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Thus, we allow only weak convolutions to be removed from distributions similar to the right and not affect the removal from distributions similar to the left:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/a9c9bee6322d268026ffb6713fc0bc86.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>As the distribution approaches normality, the coefficient pruning_standart_deviation_part can be selected from:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/efee3eda6b8263de42e8f52541a3e949.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI recommend a tolerance of 2 sigma. Or you can disregard this feature, leaving the value &lt; 1.0.<\/p>\n<p><\/p>\n<p>The output generates a graph of the network size, loss, and execution time throughout the test, normalized to 1.0. For example, here the network size was reduced almost by half without loss in quality (a small convolutional network with 100k weights):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jedi technique for reducing convolutional networks \u2014 pruning\" src=\"\/wp-content\/uploads\/2019\/12\/1048ac38b12c753e54c8d8a2dc1dc394.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>The execution speed is subject to normal fluctuations and has changed little. There is an explanation for this:<\/p>\n<p><\/p>\n<ol>\n<li>The number of convolutions changes from convenient (32, 64, 128) to less convenient for graphics cards\u201427, 51, etc. I might be mistaken here, but this likely has an impact.<\/li>\n<li>The architecture isn\u2019t wide, but it is sequential. By decreasing the width, we do not touch the depth. Thus, we reduce the load without changing the speed.<\/li>\n<\/ol>\n<p><\/p>\n<p>Therefore, the improvement manifested as a 20-30% decrease in CUDA load during execution, but not in the execution time.<\/p>\n<p><\/p>\n<h3 id=\"itogi\">Summary<\/h3>\n<p><\/p>\n<p>Let's reflect. We examined 2 pruning options\u2014 for YOLOv3 (when manual intervention is needed) and for simpler architecture networks. It is evident that in both cases, a reduction in network size and acceleration can be achieved without loss of accuracy. Results:<\/p>\n<p><\/p>\n<ul>\n<li>Reduction in size<\/li>\n<li>Acceleration of execution<\/li>\n<li>Reduction in CUDA load<\/li>\n<li>Consequently, environmental friendliness (We optimize the future use of computational resources. Somewhere, a <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\">Appendix<\/h3>\n<p><\/p>\n<ul>\n<li>After the pruning step, quantization can also be fine-tuned (for example, with TensorRT)<\/li>\n<li>TensorFlow provides opportunities for <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/model_optimization\/guide\/pruning\/pruning_with_keras\">low_magnitude_pruning<\/a><\/noindex>. It works.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/PaginDm\/keras-L1-pruning\">Repository<\/a><\/noindex> I want to develop this and will be glad for assistance.<\/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 - 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\/en\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\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\/en\/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 technique for reducing convolutional networks \u2014 pruning | ProHoster","description":"Once again, you have a task.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/news\/dzhedajskaya-tehnika-umensheniya-svertochnyh-setej-pruning","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/54494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=54494"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/54494\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=54494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=54494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=54494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}