<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Amin Zare</title><link>https://virgool.ir/feed/@amin.zare</link><description></description><language>fa</language><pubDate>2026-11-12 02:24:52</pubDate><image><url>https://files.virgool.ir/upload/users/54875/avatar/avatar.png</url><title>Amin Zare</title><link>https://virgool.ir/@amin.zare</link></image><item><title>شبکه های عصبی کانوولوشن (CNN)در ایران!</title><link>https://virgool.ir/@amin.zare/شبکه-های-عصبی-کانوولوشن-cnnدر-ایران-t0mnd4cyndy2</link><description>سلامدر دوره تحصیل و تحقیق و پژوهش برای چاپ مقاله بدنبال شبکه های عصبی کانوولوشن (CNN)رفتم وقت زیادی صرف تئوری، کدنویسی و یادگیری فریم وررک های مختلف یادگیری عمیق کردم. هر چه بیشتر مقاله می خواندم متوجه میشدم که اگر اسمی از شبکه های عصبی کانوولوشن (CNN)در تحقیقت نباشد انتشار آن بسیار دشوار می شود. در عمل نیز به این تجربه رسیدم . دو مقاله متفاوت [1،2] که یکی با wavelet و دیگری با شبکه های عصبی کانوولوشن بود چقدر در انتشار متفاوت بودند و نام شبکه های عصبی کانوولوشن باعث می شد مقاله ات زودتر بررسی گردد.انگار در این دهه ها هوش مصنوعی گرفتار موج یادگیری عمیق شده است. موجی که با پول و سرمایه گره خورده و با تحریم می توان جلو گسترش و توسعه آن در کشور را گرفت. موجی که کمتر نیاز به ایده پردازی، تفکر و تئوری سازی دارد و بیشتر مدیون سخت افزارهای گرانقیمت است. شما به صورت انفرادی نمی توانید در این زمینه تحقیق کنید چرا که نیاز به تست و اجرا برنامه هایتان را دارید که نیازمند کارت های گرافیک گرانقیمت است. سخت افزاری که بعد از یک سال چنان قدیمی می شود که از خرید آن پشیمان می شوید. دانشگاه ها نیز هزینه زیادی برای تهیه این سخت افزارها نمی کنند، سرویس های پردازشی ارزان قیمت و مناسب و دائمی نیز در کشورما یافت نمی شود. سرویس های خارجی نیز با تحریم های خارجی و خودتحریمی ، برای ما در ایران کارایی قابل قبول ندارند. بنابراین به شما توصیه می کنم اگر در ایران و بصورت انفرادی و یا تیم های دو، سه نفره دنبال کار و تحقیق در این شاخه هستید آن را کنار بگذارید. مگر اینکه حامیان مالی بسیار قوی داشته باشید.ممنون میشم نظرتان را بگویید و اگر من اشتباه فکر میکنم راه حل هایتان رابنویسید و من را راهنمایی کنید.1-  “Video spatiotemporal mapping for human action recognition by convolutional neural network,” A. Zare, H. Abrishami Moghaddam, and A. Sharifi, Pattern Anal. Appl., Feb. 2019. https://doi.org/10.1007/s10044-019-00788-12- “Spatiotemporal wavelet correlogram for human action recognition,” H. Abrishami Moghaddam and A. Zare, Int. J. Multimed. Inf. Retr., 2019. https://doi.org/10.1007/s13735-018-00167-2</description><category>Amin Zare</category><author>Amin Zare</author><pubDate>Thu, 07 Apr 2022 13:01:26 +0430</pubDate></item><item><title>تنظیمات نمایش صفحه خطا Error Pages در IIS و رفع خطای Missing Error Handling برای وب سایت</title><link>https://virgool.ir/@amin.zare/تنظیمات-نمایش-صفحه-خطا-error-pages-در-iis-و-رفع-خطای-missing-error-handling-برای-وب-سایت-t6gwivijli7b</link><description>سلامگزارش خطابرای رفع آسیب پذیری بالا ابتدا صفحه یا صفحاتی دلخواه برای Error code های مختلف طراحی کنید (به عنوان نمونه فایل html اینجا را save نمایید) و آن را در سرور در پوشه وب سایت کپی کنید. سپس به سراغ IIS بروید و تنظیمات زیر را در IIS برای وب سایت مورد نظر انجام دهیدمراحل در IISمی توانید تمام انواع خطا ها را ریدارکت کنید. متاسفانه IISتنظیمات صحیح را در فایل webconfig اعمال نمی کند و لازم است بصورت دستی شما اینکار را انجام دهید:1- &lt;system.web&gt;&lt;customErrors mode=&#34;RemoteOnly&#34; /&gt;&lt;/system.web&gt;2 -&lt;system.webServer&gt;&lt;httpErrors existingResponse=&#34;Replace&#34; errorMode=&#34;Custom&#34; defaultResponseMode=&#34;ExecuteURL&#34;&gt;&lt;remove statusCode=&#34;404&#34; subStatusCode=&#34;-1&#34; /&gt;&lt;error statusCode=&#34;404&#34; prefixLanguageFilePath=&#34;&#34; path=&#34;/404.html&#34; responseMode=&#34;ExecuteURL&#34; /&gt;&lt;/httpErrors&gt;&lt;/system.webServer&gt;</description><category>Amin Zare</category><author>Amin Zare</author><pubDate>Mon, 14 Sep 2020 11:42:56 +0430</pubDate></item><item><title>تنظیمات X-Frame-Options در IIS برای جلوگیری از Click Jacking</title><link>https://virgool.ir/@amin.zare/تنظیمات-x-frame-option-در-iis-برای-جلوگیری-از-click-jacking-u3mapthgqj7h</link><description>تنظیمات X-frame-option در IIS برای جلوگیری از Click Jackingاین Headerدارای سه دستورالعمل و روش کار می باشد که به شرح زیر هستند:1- تنظیم Deny : در این حالت بالا آوردن Frame و استفاده از Frame های مختلف درون صفحه غیرفعال می شود.2- تنظیم Sameorigin: در این حالت به وب سایت های خاصی اجازه بالا آوردن Frame و استفاده از Frame هارا داده می شود.3- تنظیم Allow-From URI: در این حالت اجازه بالا آوردنFrame و استفاده از آنها در یک Domin  می باشد.برای اطمینان از غیرفعال شدن لود iframe توسط تنظیمات X-Frame-Optionsصفحه html زیر را بسازید و دامنه مربوط را در این صفحه به صورت iframe لود کنید.</description><category>Amin Zare</category><author>Amin Zare</author><pubDate>Sun, 13 Sep 2020 10:59:51 +0430</pubDate></item><item><title>شبکه های عصبی کانوولوشن (Convolution Neural Networks- CNN) در Tensorflow</title><link>https://virgool.ir/coderlife/شبکه-های-عصبی-کانوولوشن-convolution-neural-networks-cnn-در-tensorflow-omcy5vrlg1pf</link><description>شبکه عصبی کانوولوشن (Convolution Neural Networks- CNN) در این پست می خواهیم ابتدا مقدمه ای بر شبکه های عصبی کانوولوشن بیان کنیم. در این مقدمه فرض شده است شما با واژه هایی مانند يادگيري ماشين، يادگيري عميق، پردازش تصوير آشنا هستید. سپس برای یک پیاده سازی واقعی، مسئله Classification مجموعه داده آزمایشی MNIST  را به زبان پایتون شرح دهیم. برای حل این مسئله از ابزار Tensorflow و امکاناتی که برای پیاده سازی شبکه های CNN بر روی GPU در اختیارمون گذاشته استفاده خواهیم کرد. CNNها از رايجترين روش­هاي يادگيري عميق در حل مسائل يادگيري ماشين مي­باشند و بویژه بطور گسترده در پردازش تصوير و ویدئو بکارگرفته شده­اند. CNN با ارتباطات محلي بين نورون­هاي لايه­هاي مجاور، همبستگي مکاني محلي ورودي را ا ستخراج مي­کند. معماري سه سطحي آن در شکل 1 نشان داده شده استساختار کلي شبکه عصبی کانولوشن   [1]در سطح اول لايه کانولوشن قرار دارد که با استفاده از kernel های متنوع مي­تواند ويژگي­ها جديدي را از تصوير استخراج کند. به دنبال آن عمليات Max pooling انجام مي­شود که وظيفه کاهش ابعاد و تعداد پارامترهاي شبکه را انجام مي­دهد. خروجي اين لايه بعد از تبديل به بردار يک بعدي به لايه شبکه اتصال کامل ارسال مي­شود. در اين لايه از الگوريتم­ها رايج شبکه­هاي عصبي استفاده مي­شود. بلاک convolution + max pooling که به عنوان لایهconvolution  آن را میشناسیم می تواند به دفعات تکرار شود و شبکه ای عمیق تر ساخته شود. تعداد لایه های Fully connected نیز توسط کاربر تعیین می شود.در سطح اول لايه کانولوشن قرار دارد که با استفاده از kernel های متنوع مي­تواند ويژگي­ها جديدي را از تصوير استخراج کند. به دنبال آن عمليات Max pooling انجام مي­شود که وظيفه کاهش ابعاد و تعداد پارامترهاي شبکه را انجام مي­دهد. خروجي اين لايه بعد از تبديل به بردار يک بعدي به لايه شبکه اتصال کامل ارسال مي­شود. در اين لايه از الگوريتم­ها رايج شبکه­هاي عصبي استفاده مي­شود. بلاک convolution + max pooling که به عنوان لایهconvolution  آن را میشناسیم می تواند به دفعات تکرار شود و شبکه ای عمیق تر ساخته شود. تعداد لایه های Fully connected نیز توسط کاربر تعیین می شود.شبکه های عصبی کانوولوشن در کاربردهاي مختلف پردازش تصوير مانند طبقه­بندي تصاوير، تشخيص اشياء و بازيابي محتوايي تصاوير کارايي خود را نشان داده است. در حل مسئله طبقه­بندي تصاوير براي مجموعه داده­هاي آزمايشي مانند Imagenet [2]، CIFAR [3] و MINST [4] به نتايج خوبي دست يافته است. در مسئله تشخيص اشياء نيز به عنوان مثال براي مجموعهPASCAL VOC  به دقت­هاي بالایي رسيده است [5]. در بازيابي محتوايي تصاوير نيز به کارايي خوبي نسبت به روش­هاي کلاسيکي مانند ويژگي­هاي رنگ، شکل و بافت دست يافته است [6], [7].تعداد بسيار زياد پارامترهاي قابل­يادگيري در CNN يکي از چالش­هاي آن مي­باشد. امروزه پياده­سازي محاسباتي آن بر روي GPU توسط چارچوب­هايي متن بازي مانند Tensorflow [8] و CNTK [9] که توسعه­دهنگان قوي از آن حمايت مي­کنند استفاده گسترده از CNN را امکانپذير نموده است و آن را به ابزار کاربردي و عملي در مطالعات پردازش تصوير و ويدئو تبديل کرده است.بررسی یک کد واقعی بهترین روش برای تسلط بر برنامه نویسی و مفاهیم CNN می باشد. به این منظور من کد Classificationمجموعه داده آزمایشی MNIST  به زبان پایتون و توسط Tensorflow را انتخاب کردم که در سایت ها و کتاب ها مختلف آموزشی شرح داده شده است. من چندین نوع از این کدها را بررسی کردم اما ساختار کد موجود در https://easy-tensorflow.com/tf-tutorials/convolutional-neural-nets-cnns/cnn1 را از همه بیشتر پسندیدم و می خواهم به بررسی آن بپردازم و آن را تکمیل کنم. البته لازم است شما کمی هم پایتون بلد باشید. ضمناً توابع Tensorflow استفاده شده را هم توضیح خواهیم داد.# https://easy-tensorflow.com/tf-tutorials/convolutional-neural-nets-cnns/cnn1&#xA; &#xA; import tensorflow as tf&#xA; import numpy as np&#xA; import matplotlib.pyplot as plt&#xA; import input_dataخب برای شروع کار این چندتا import  را اول برنامه قرار می دهیم. برای راحتی خواندن و باز کردن و کار کردن با دیتاست MINST  کتابخانه input_data در اختیار شما قرار گرفته است. input_data را می توانید از اینجا دانلود و به پروژه تون اضافه کنید.توابع load_data و reformat برای خواندن داده ها از دیتاست MNIST و تغییر شکل آن برای اعمال به ورودی شبکه CNN می باشند. اگر دیتاست MNIST را تاکنون دانلود نکرده اید تابع read_data_sets اینکار را برای شما انجام میدهد. این تابع در اولین بار پوشه &#34;MNIST_data&#34; را ایجاد می کند و داده ها را با اسکریپت پایتون دانلود می کند (حجم آن حدود 11 مگابایت است) البته به شرطی که اتصال اینترنت برقرار باشد و سایت &#39;http://yann.lecun.com/exdb/mnist/&#39;بسته نباشد (تا این لحظه بسته نیست). در دفعه های بعدی داده ها در پوشه ذکر شده وجود دارند و دیگر عملیات دانلود انجام نمی شود. ورودی one_hot در این تابع کدینگ one_hot را بر روی برچسب کلاس ها اعمال میکند.def load_data(mode=&#34;train&#34;):&#xA;  &#34;&#34;&#34;&#xA;  Function to (download and) load the MNIST data&#xA;  :param mode: train or test&#xA;  :return: images and the corresponding labels&#xA;  &#34;&#34;&#34;&#xA;  mnist = input_data.read_data_sets(&#34;MNIST_data/&#34;, one_hot=True)&#xA;  if mode == &#34;train&#34;:&#xA;  x_train, lbl_train, x_valid, lbl_valid = mnist.train.images, mnist.train.labels,mnist.validation.images, mnist.validation.labels&#xA;  x_train, _ = reformat(x_train, lbl_train)&#xA;  x_valid, _ = reformat(x_valid, lbl_valid)&#xA;  return x_train, lbl_train, x_valid, lbl_valid&#xA;  elif mode == &#34;test&#34;:&#xA;  x_test, lbl_test = mnist.test.images, mnist.test.labels&#xA;  x_test, _ = reformat(x_test, lbl_test)&#xA;   return x_test, lbl_testdef reformat(x, lbl):&#xA;  &#34;&#34;&#34;&#xA;  Reformats the data to the format acceptable for convolutional layers&#xA;  :param x: input array&#xA;  :param lbl: corresponding labels&#xA;  :return: reshaped input and labels&#xA;  &#34;&#34;&#34;&#xA;  img_size, num_ch, num_class = int(np.sqrt(x.shape[-1])), 1, len(np.unique(np.argmax(lbl, 1)))&#xA;  dataset = x.reshape((-1, img_size, img_size, num_ch)).astype(np.float32)&#xA;  labels = (np.arange(num_class) == lbl[:, None]).astype(np.float32)&#xA;  return dataset, labelsاین دیتا ست مجموعه تصاویر دستنویس 0 تا 9 به ابعاد 28 در 28 می باشد و از 55000 تصویر train، 5000 تصویر validation و 10000 تصویر تست تشکیل شده است. در داده های موجود، هر تصویر 28*28 به صورت یک آرایه یک بعدی به طول 784 ذخیره شده است. بنابراین لازم است توسط تابع reformat به صورت تنسور (-1, 28, 28, 1) تغییر شکل داده شود. خروجی labelsتابع reformatزمانی استفاده می شود که کدینگ one_hotمقدار Falseداشته باشد و در ادامه از این خروجی استفاده نمی کنیم.فرمت ورودی یا همان data format در تابع covolution دو بعدی (conv2d) در تنسورفلو می تواند بر اساس فرمت های NHWC و NCHWباشد. N به معنی تعداد تنسورها ، H به معنی ارتفاع ، W به معنی پهنا و Cنشان دهنده تعداد کانال تنسورهای وروردی است. در صورت انتخاب NHWCتنسور ورودی باید به صورت [batch, height, width, channels]باشد که حالت پیش فرض تابع covolution دوبعدی می باشد. بعد از فرخوانی تابع reformat در تابع load_dataداده های x_train به شکل (55000, 28, 28, 1) در می آیند که اماده اعمال به تابع conv2d است. بدلیل اینکه تصاویر این دیتاست graylevel می باشند تعداد کانال ورودی، یک در نظر گرفته می شود.برای تعریف شبکه CNN خود از توابع زیر استفاده می کنیم. بنابراین ابتدا آن ها را شرح می دهیم.def weight_variable(shape):    &#34;&#34;&#34;    Create a weight variable with appropriate initialization    :param name: weight name    :param shape: weight shape    :return: initialized weight variable    &#34;&#34;&#34;    initer = tf.truncated_normal_initializer(stddev=0.01)    return tf.get_variable(&#39;W&#39;, shape=shape, dtype=tf.float32, initializer=initer)&#xA;def bias_variable(shape):    &#34;&#34;&#34;    Create a bias variable with appropriate initialization    :param name: bias variable name    :param shape: bias variable shape    :return: initialized bias variable    &#34;&#34;&#34;    initial = tf.constant(0., shape=shape, dtype=tf.float32)    return tf.get_variable(&#39;b&#39;, dtype=tf.float32, initializer=initial)def conv_layer(x, filter_size, num_filters, stride, phase_train, name):    &#34;&#34;&#34;    Create a 2D convolution layer    :param x: input from previous layerphase_train    :param filter_size: size of each filter    :param num_filters: number of filters (or output feature maps)    :param stride: filter stride    :param name: layer name    :return: The output array    &#34;&#34;&#34;    with tf.variable_scope(name):        num_in_channel = x.get_shape().as_list()[-1]        shape = [filter_size, filter_size, num_in_channel, num_filters]        W = weight_variable(shape)        tf.summary.histogram(&#39;weight&#39;, W)        b = bias_variable(shape=[num_filters])        tf.summary.histogram(&#39;bias&#39;, b)        layer = tf.nn.conv2d(x, W, strides=[1, stride, stride, 1], padding=&#34;SAME&#34;)        layer += b        bn_layer = tf.layers.batch_normalization(inputs=layer, training=phase_train)        return tf.nn.relu(bn_layer)تابع weight_variable(shape) : ماتریس وزن W را با مقداردهی تصادفی تعریف می کند. tf.get_variable در صورت عدم وجود متغیر W در scope خود، آن را تعریف می کند و در صورت وجود آن را بر میگرداند.تابع bias_variable(shape): : ماتریس بایاس b را با مقداردهی تصادفی تعریف می کند.تابع conv_layer(x, filter_size, num_filters, stride, phase_train, name) : عملیات conv2d با فراخوانی این تابع انجام می شود. پارامترهای این تابع به ترتیب: تنسور تصاویر ورودی، اندازه فیلتر کانولوشن یا همان اندازه ماتریس وزن W (یا همان کرنل کانولوشن)، گام کانولوشن، تعیین مرحله train یا تست و نام نود گراف تنسورفلو می باشد.تنسور shape در این تابع ابعاد ماتریس وزن W (یا همان کرنل کانولوشن) را تعریف میکند. استاندار تنسورفلو برای تعریف آن به صورت [filter_height, filter_width, in_channels, out_channels] می باشد. یعنی بعد از عملیات کانولوشن تعداد کانال های خروجی out_channels می باشد. بعد از تعریف W  و ماتریس b یا همان بایاس تابع conv2d را برای اجرای عملیات کانولوشن فراخوانی می کنیم. پارامتر stride، گام جابه جایی کرنل را در راستای افقی و عمودی را تعیین می کند. اگر data formatبرابر با NHWCباشد stride = [1, vertical stride, horizontal stride, 1] تعیین می شود. پارامتر padding می تواند مقادیر SAME یا VALID را بگیرد. مقدار SAME با اعمال zero paddingابعاد تصویر ورودی را بعد از عملیات کانولوشن تغییر نمی دهد. اما مقدار VALIDباعث down sample شدن تصویر ورودی می شود.عملکرد تابع batch_normalization در اینجا توضیح داده شده است.def max_pool(x, ksize, stride, name):&#xA;    &#34;&#34;&#34;&#xA;    Create a max pooling layer&#xA;    :param x: input to max-pooling layer&#xA;    :param ksize: size of the max-pooling filter&#xA;    :param stride: stride of the max-pooling filter&#xA;    :param name: layer name&#xA;    :return: The output array&#xA;    &#34;&#34;&#34;&#xA;    return tf.nn.max_pool(x,&#xA;                          ksize=[1, ksize, ksize, 1],&#xA;                          strides=[1, stride, stride, 1],&#xA;                          padding=&#34;SAME&#34;,&#xA;                          name=name)&#xA;&#xA;&#xA;def flatten_layer(layer):&#xA;    &#34;&#34;&#34;&#xA;    Flattens the output of the convolutional layer to be fed into fully-connected layer&#xA;    :param layer: input array&#xA;    :return: flattened array&#xA;    &#34;&#34;&#34;&#xA;    with tf.variable_scope(&#39;Flatten_layer&#39;):&#xA;        layer_shape = layer.get_shape()&#xA;        num_features = layer_shape[1:4].num_elements()&#xA;        layer_flat = tf.reshape(layer, [-1, num_features])&#xA;    return layer_flat&#xA;&#xA;&#xA;def fc_layer(x, num_units, name, use_relu=True):&#xA;    &#34;&#34;&#34;&#xA;    Create a fully-connected layer&#xA;    :param x: input from previous layer&#xA;    :param num_units: number of hidden units in the fully-connected layer&#xA;    :param name: layer name&#xA;    :param use_relu: boolean to add ReLU non-linearity (or not)&#xA;    :return: The output array&#xA;    &#34;&#34;&#34;&#xA;    with tf.variable_scope(name):&#xA;        in_dim = x.get_shape()[1]&#xA;        W = weight_variable(shape=[in_dim, num_units])&#xA;        tf.summary.histogram(&#39;weight&#39;, W)&#xA;        b = bias_variable(shape=[num_units])&#xA;        tf.summary.histogram(&#39;bias&#39;, b)&#xA;        drop_x = tf.cond(phase_train, lambda: tf.nn.dropout(x, keep_prob=keep_prob), lambda: x)   # tf.cond or by keep_prob=1&#xA;        layer = tf.matmul(drop_x, W)&#xA;        layer += b&#xA;        if use_relu:&#xA;            layer = tf.nn.relu(layer)&#xA;        return layerتابع max_pool(x, ksize, stride, name) : پارامترهای تابع max_poolشبیه پارامترهای تابع conv2d می باشد. با تغییر strideضریب downsampling را تنظیم میکنیم.تابع flatten_layer(layer) : برای اتصال ویژگی های Spatialاستخراج شده توسط لایه های کانولوشن به لایه fully connectedلازم است ویژگی های Spatial بصورت خطی تغییر شکل یابند و به لایه fully connectedمتصل شوند. این عملیات توسط flatten_layerانجام می شود.تابع fc_layer(x, num_units, name, use_relu=True) : برای تعریف لایه fully connected از آن استفاده می شود. عملیات dropout قبلا در اینجا توضیح داده شده است.[1] Y. Guo, Y. Liu, A. Oerlemans, S. Lao, S. Wu, and M. S. Lew, “Deep learning for visual understanding: A review,” Neurocomputing, vol. 187, pp. 27–48, 2016.[2] A. Krizhevsky, I. Sutskever, and G. E. Hinton, “ImageNet Classification with Deep Convolutional Neural Networks,” in Advances In Neural Information Processing Systems, 2012, pp. 1–9.[3] K. He, X. Zhang, S. Ren, and J. Sun, “Deep Residual Learning for Image Recognition,” in 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016, pp. 770–778.[4] L. Wan, M. Zeiler, S. Zhang, Y. LeCun, and R. Fergus, “Regularization of neural networks using dropconnect,” Icml, no. 1, pp. 109–111, 2013.[5] X. Wang, L. Zhang, L. Lin, Z. Liang, and W. Zuo, “Deep joint task learning for generic object extraction,” in Advances in Neural Information Processing Systems, 2014, pp. 523–531.[6] Y. Liu, Y. Guo, S. Wu, and M. S. Lew, “Deepindex for accurate and efficient image retrieval,” in Proceedings of the 5th ACM on International Conference on Multimedia Retrieval, 2015, pp. 43–50.[7] J. Wan et al., “Deep learning for content-based image retrieval: A comprehensive study,” in Proceedings of the 22nd ACM international conference on Multimedia, 2014, pp. 157–166.[8] Martín Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo et al., “TensorFlow: Large-Scale Machine Learning on Heterogeneous Systems.” 2015.[9] D. Yu et al., “An Introduction to Computational Networks and the Computational Network Toolkit,” Microsoft Research, Oct. 2014.</description><category>Amin Zare</category><author>Amin Zare</author><pubDate>Fri, 20 Sep 2019 18:52:54 +0430</pubDate></item><item><title>فراخوانی تابع Drop out برای کاهش overfitting در شبکه های عصبی کانوولوشن (CNN) در TensorFlow</title><link>https://virgool.ir/@amin.zare/فراخوانی-تابع-drop-out-برای-کاهش-overfitting-در-شبکه-های-cnn-در-tensorflow-csups5bxpizr</link><description>  معمولا برای کاهش overfitting مدل در شبکه های CNN از عملگر DropOut استفاده می شود. Drop out باید در هنگام train بر روی اتصالات بین لایه ها اعمال شوند و در هنگام ارزیابی و تست شبکه نباید اعمال گردد. به این منظور می توان در هنگام ارزیابی و تست شبکه مقدار احتمال حذف یالها را صفر کرد تا DropOut نادیده گرفته شود و یا از تابع tf.cond برای اعمال شرط بر روی تابع DropOut استفاده کرد و اعمال آن را در هنگام train و تست مدیریت نمود.نمایی از اعمال عملگر DropOut اما دقیقا تابع DropOut در تنسورفلو را کجا باید فراخوانی کنیم؟ قبل از انجام عملیات tf.matmul. یعنی دقیقا قبل از اینکه عملیات ضرب وزن ها با ورودی لایه قبل انجام شود باید DropOut را فراخوانی کنیم. در تنسورفلو تابع DropOut (پیاده سازی مقاله [1]) به صورت زیر انجام می شود:dropped = tf.nn.dropout(prev_layer,keep_prob=current_keep_prob) dense = tf.matmul(dropped,W)+bاز تابع tf.layers.dropout نیز به عنوان یک تابع سطح بالاتر می توان برای DropOut استفاده کرد. در تابع tf.layers.dropout بجای مقدار keep_prob (احتمال نگه داشتن یال ها) مقدار rate=1-keep_prob (احتمال حذف یال ها) باید استفاده شود. همچنین ورودی training که مقدار true یا false  می گیرد نیز برای تعیین مد train یا تست استفاده می شود. این پارامتر در تابع batch_normalization نیز توضیح داده شده است.dropped = tf.layers.dropout(prev_layer, rate=dropout_rate, training=is_training) عملگر DropOut بین لایه های fullyconnected قرار می گیرد. اینکه عملگر DropOut را بین کدام یک از این لایه ها قرار دهیم و تعیین احتمال صحیح DropOut معمولا به صورت تجربی است. اما قاعدتاً بهتر است بین لایه هایی که بیشترین اتصالات در آن ها وجود دارد اعمال شود.کد نهایی را در پست های بعدی خواهید دیدReferences: [1] https://arxiv.org/abs/1207.0580</description><category>Amin Zare</category><author>Amin Zare</author><pubDate>Sat, 29 Jun 2019 15:48:22 +0430</pubDate></item><item><title>فراخوانی تابع batch_normalization در Tensorflow برای آموزش شبکه عصبی کانوولوشن (Convolution Neural Network)</title><link>https://virgool.ir/@amin.zare/فراخوانی-تابع-batchnormalization-در-tensorflow-برای-آموزش-شبکه-عصبی-کانوولوشن-convolution-neural-network-rwgkvjyltl7p</link><description>یک بلاک از لایه کانوولوشن شبکه CNN یکی از تکنیک های افزایش سرعت train و بهبود دقت در شبکه های CNN استفاده از لایه batch normalization می باشدbn_layer = tf.layers.batch_normalization(inputs=layer, training=phase_train)Arguments:inputs: تنسور ورودیaxis: جهتی که نرمال سازی در آن راستا انجام می شود یا همون راستای نمایش ویژگی داده هاtraining : True or Falseبرای انجام batch_normalization (پیاده سازی مقاله [1]) باید آن را بعد از تابع conv2d قرار می دهیم. ما در این مثال مقادیر پیش فرض را برای کدمون انتخاب می کنیم. اما در تنظیم پارامترهای مهم زیر باید دقت کنیم.1- در مورد پارامتر Axis دقت کنید که از چه استاندارد داده ای در tf استفاده می کنید و تنسور ورودی را چگونه به عملگر conv ارسال می کنید. اگر از استاندار data_format=&#34;channels_first&#34; استفاده می کنید مقدار Axis=1 و اگر از استاندار data_format=&#34;channels_last&#34; استفاده می کنید مقدار Axis=-1 که همان مقدار پیش فرض است می باشد. دقت کنید در channels_last شکل تنسور ورودی (batch, ..., channels) می باشد و در channels_first شکل تنسور به صورت (batch, channels, ...) می باشد.2- در مورد پارامتر training باید توجه داشته باشیم در فاز train مقدار آن True و در فاز ارزیابی و تست داده مقدار آن را False انتخاب کنیم.فرایند بروزرسانی moving_mean  و moving_variance بطور مستقیم در tf.layers.batch_normalization قرار ندارد بنابراین ما باید بروش زیر این کار در مرحله آموزش تزریق کنیم و در ساختار گراف برنامه مون قرار دهیم دهیم. update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) # it`s critical for batch normalization with tf.control_dependencies(update_ops): # is critical for batch normalization  with tf.variable_scope(&#39;Optimizer&#39;):  Optimizer = tf.train.AdamOptimizer(learning_rate=lr, name=&#39;Adam-optim&#39;).minimize(loss)کد نهایی را در پست های بعدی خواهید دید[1] Reference: http://arxiv.org/abs/1502.03167 ,&#34;Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift&#34;, Sergey Ioffe, Christian Szegedy</description><category>Amin Zare</category><author>Amin Zare</author><pubDate>Sat, 29 Jun 2019 12:02:17 +0430</pubDate></item></channel></rss>