<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمدرضا رضائی</title>
        <link>https://virgool.io/feed/@Mr_Rezaei</link>
        <description>دانشجوی دکترای هوش مصنوعی دانشگاه تبریز، علاقمند به هوش مصنوعی</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:59:06</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2774/avatar/5eRYfi.png?height=120&amp;width=120</url>
            <title>محمدرضا رضائی</title>
            <link>https://virgool.io/@Mr_Rezaei</link>
        </image>

                    <item>
                <title>پدیده‌ی صفحه‌ی شطرنجی در شبکه‌های مبتنی بر کانوولوشن</title>
                <link>https://virgool.io/@Mr_Rezaei/%D9%BE%D8%AF%DB%8C%D8%AF%D9%87-%DB%8C-%D8%B5%D9%81%D8%AD%D9%87-%DB%8C-%D8%B4%D8%B7%D8%B1%D9%86%D8%AC%DB%8C-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D9%85%D8%A8%D8%AA%D9%86%DB%8C-%D8%A8%D8%B1-%DA%A9%D8%A7%D9%86%D9%88%D9%88%D9%84%D9%88%D8%B4%D9%86-f8fsqasstea0</link>
                <description>پدیده‌ی صفحه‌ی شطرنجی در شبکه‌های کانوولوشنیعملگر دیکانوولوشن (DeConvolution) یا به اصطلاح صحیح‌تر، کانوولوشن ترانهادهTransposed) (Convolution، در بسیاری از شبکه‌های عصبی استفاده می‌شود. به عنوان مثال، در بخش Up-sampling در برخی از معماری‌های U-Net، در بسیاری از Generator های مربوط به شبکه‌های GAN، در بخش Decoder در Auto-Encoder های تماما کانوولوشنی و همچنین در مدل‌های Diffusion.نامگذاری این عملگر، به علت رفتاری مشابه با عملگر‌های Convolution، اما اتصال‌های برعکس نسبت به آن‌ها انجام شده است. یعنی اگر لایه‌ی کانوولوشنی C1 با کرنل‌های 3x3 و اندازه گام 2، اندازه‌ی تصویر ورودی را از 100x100 به 49x49 تغییر می‌دهد، پس لایه‌ی دیکانوولوشنی D1 با همان مشخصات (کرنل‌های 3x3 و اندازه گام 2) می‌تواند اندازه‌ی یک تصویر 49x49 را به 100x100 پیکسل افزایش دهد.اما گاهی از اوقات، تصاویری که به کمک شبکه‌های حاوی عملگر دیکانوولوشن تولید می‌شوند، از کیفیت کمی برخوردار هستند و متاسفانه بسیاری از محققین کم‌تجربه که در شبکه‌ی عصبی خود از این عملگر استفاده کرده‌اند، از علت بروز این مشکل اطلاعی ندارند.اما اگر این محققین با پدیده‌ی صفحه‌ی شطرنجی (Checkerboard Artifact) آشنا باشند، می‌توانند تنها با مشاهده‌ی یکی از تصاویر حاصل از مدل، آن را تشخیص دهند. تصاویری که توسط یک مدل دیکانوولوشنی تولید شده‌اند، در صورت بروز پدیده‌ی صفحه‌ی شطرنجی، دارای الگو‌های چهارخانه و تکراری خواهند بود. این الگو‌های چهارخانه، ممکن است در تمام تصویر و یا تنها در بخشی از آن ظاهر شوند. در شکل 1 چند مثال از بروز پدیده‌ی صفحه‌ی شطرنجی مشاهده می‌کنید.شکل 1- چند مثال از بروز پدیده‌ی صفحه شطرنجیاما بروز پدیده‌ی صفحه‌ی شطرنجی، تنها محدود به تصاویر دامنه‌ی طبیعی نبوده و می‌توانند در خروجی‌های احتمالاتی مدل‌ها نیز رخ دهند. به عنوان مثال، زمانی که از شبکه‌ی U-Net برای قطعه بندی معنایی (Semantic Segmentation) استفاده شود، مدل به جای تولید یک تصویر واقعی، قصد تولید یک Segmentation Mask دارد. پدیده‌ی صفحه‌ی شطرنجی باعث می‌شود نقشه‌ی معنایی خروجی دارای همان الگوی تکراری و شطرنجی باشد. لکن غالبا این پدیده تنها در بخش‌های غیر از پس‌زمینه رخ می‌دهد. (محل‌هایی که خروجی مدل غیر صفر است) در شکل 2 یک مثال از پدیده‌ی صفحه‌ی شطرنجی در خروجی شبکه‌ی U-Net را مشاهده می‌کنید.شکل 2- مثالی از بروز پدیده‌ی صفحه‌ی شطرنجی در خروجی شبکه‌ی U-Net که برای قطعه‌بندی معنایی استفاده می‌شود.
از آن‌جا که عملگر‌های کانوولوشن، رفتار مشابهی در حالت یک، دو و سه بعدی دارند، لذا علاوه بر تصاویر دو بعدی، در صورت استفاده از عملگر‌های کانوولوشن و دیکانوولوشن یک یا سه بعدی نیز ممکن است شاهد بروز این پدیده باشیم. پدیده‌ی صفحه‌ی شطرنجی در داده‌های یک بعدی به صورت یک الگوی تکراری با فرکانس بالا و در داده‌های سه بعدی نیز به شکل یک مکعب تکراری در تمام تصویر مشاهده می‌شود. شکل 3 بروز پدیده‌ی صفحه‌ی شطرنجی را در داده‌های یک بعدی نشان می‌دهد.شکل 3- پدیده‌ی صفحه‌ی شطرنجی در داده‌های یک بعدی. (لایه‌ی دیکانوولوشن با اندازه‌ی کرنل 3 و اندازه‌ی گام 1)علت بروز پدیده‌ی صفحه‌ی شطرنجی، عدم تطابق اندازه‌ی گام و اندازه‌ی فیلتر‌های کانوولوشنی و دیکانوولوشنی است؛ به نحوی که برخی از پیکسل‌های خروجی، از تعداد پیکسل‌های ورودی بیشتری اطلاعات گرفته و بقیه‌ی پیکسل‌ها، اطلاعات را از تعداد پیکسل‌های کمتری دریافت می‌کنند. لذا برخی از پیکسل‌ها صرف نظر از ویژگی‌های استخراج شده توسط مدل و تنها به علت موقعیت مکانی، مقادیر روشن‌تر و بقیه‌ی پیکسل‌ها تیره‌تر خواهند بود. در شکل 4 با محاسبه‌ی تعداد پیکسل‌هایی که به هرکدام از پیکسل‌های خروجی تاثیر می‌گذارند، یک مثال از بروز این پدیده را مشاهده می‌کنید:شکل 4- محاسبه‌ی تعداد پیکسل‌هایی که بر هر پیکسل از خروجی تاثیر می‌گذارند. (لایه دیکانوولوشن با اندازه‌ی کرنل 3x3 و اندازه‌گام 2 پیکسلی)پدیده‌ی صفحه‌ی شطرنجی، قابل پیش‌گیری است و می‌توان با بررسی چند نکته هنگام طراحی مدل‌های کانوولوشنی، از بروز آن‌ها اجتناب کرد:اندازه‌ی فیلتر‌ها باید بر اندازه‌ی گام‌ها بخش‌پذیر باشد. یکی از پر‌کاربرد‌ترین حالت‌ها استفاده از فیلتر‌های 4x4 به همراه اندازه‌ی گام 2 در لایه‌های دیکانوولوشن و استفاده از اندازه‌ی گام 1 در لایه‌های کانوولوشنی است.در لایه‌هایی که هدف، افزایش ابعاد مکانی تصویر است، از Upsampling با یکی از روش‌هایNearest Neighbor یا Interpolation استفاده می‌شود. (شامل Linear/Bi-Linear/Tri-Linear Interpolation)بررسی کردن خروجی مدل در همه‌ی لایه‌ها در مراحل اولیه‌ی آموزش. (پدیده‌ی صفحه‌ی شطرنجی در همه‌ی مراحل آموزش شبکه‌های کانوولوشنی وجود دارد.)امیدوارم این نوشته به دانش شما در مورد شبکه‌های کانوولوشنی و پدیده‌ی صفحه‌ی شطرنجی افزوده باشد. لطفا با انتشار این نوشته، در ارتقای سطح دانش فنی در زمینه‌ی شبکه‌های عصبی مصنوعی سهیم باشید.</description>
                <category>محمدرضا رضائی</category>
                <author>محمدرضا رضائی</author>
                <pubDate>Sat, 17 Jun 2023 00:16:56 +0330</pubDate>
            </item>
                    <item>
                <title>لایه ی BatchNorm رو دقیقا کجا باید استفاده کنیم؟</title>
                <link>https://virgool.io/@Mr_Rezaei/batch-normalization-technique-and-some-tips-about-it-t8lopgsbnpzn</link>
                <description>منبع: https://cs231n.github.io/neural-networks-2/لایه ی Batch Normalization (یا همون BN)، اثرات خیلی مفیدی داره که باعث شده طراحای شبکه‌های عصبی، در بیشتر مدل‌هایی که طراحی می‌کنن ازش استفاده کنن. یکی از این دلایل سرعت بالای آموزش (یا به اصطلاح دقیق تر، Converge کردن وزن‌های مدل) هست.توی این پست، اول توضیح میدم که BN دقیقا چیکار می کنه و بعدش اثری که روی فاز Training شبکه‌های عصبی میذاره رو بررسی می‌کنم. در آخر هم بحث می‌کنم که بهترین محل برای استفاده از BN بعد از کدوم لایه‌ها توی شبکه‌ی عصبی هست.بخش اول: BN دقیقا چیکار می‌کنه؟به صورت خلاصه، کاری که توی الگوریتم BN انجام میشه، نرمال کردن توزیع دیتا هست. (نرمال کردن اینجا کلمه‌ی دقیقی نیست، ولی جایگزینی به ذهنم نرسید) دیتا بعد از این نرمال شدن، به شکلی در میاد که میانگینش حتما صفر و واریانسش حتما 1 باشه. (توی آمار کلاسیک، فرض میشه اکثر متغیر‌های تصادفی که در طبیعت دیده میشن توزیع گاوسی یا شبه گاوسی دارن. در نتیجه برای اینکه بهتر بشه مقایسشون کرد، هرکدوم رو به شکلی Transform می‌کنن که میانگینشون صفر و واریانسشون 1 بشه.) توزیع مهمی که میشناسیم و این خاصیت رو داره، توزیع نرمال هست. توزیع نرمال همون توزیع گاوسی، با میانگین صفر و واریانس 1 هست.توی BN، با این که میدونیم توزیع داده‌هامون گاوسی نیست، (در اصل توزیع داده‌های ما همیشه گسسته هست در حالی که توزیع‌های نرمال و حالت کلی ترش گاوسی، توزیع‌های احتمال پیوسته هستن.) سعی می‌کنیم مثل توزیع گاوسی باهاش رفتار کنیم. اگه یه متغیر تصادفی گاوسی با میانگین u و واریانس s داشته باشیم:X ~ Gaussian(u, s)میتونیم یه متغیر تصادفی جدید از روش بسازیم که میانگینش صفر و واریانسش 1 باشه:Y := (X - u) / s ~ Gaussian(0, 1) = Normal()حالا که این متغیر تصادفی جدید رو ساختیم، میتونیم به جای متغیر تصادفی قبلی ازش استفاده کنیم و اینبار مطمئن باشیم که خیلی از خواص زیبای ریاضیاتی که برای توزیع نرمال اثبات شدن، برای متغیر جدید ما هم برقرار هستن. به عنوان مثال، میتونیم از روی محاسبه‌ی فاصله‌ی یه نمونه از متغیر تصادفی جدید از صفر، میزان احتمال outlier بودن این نمونه رو مشخص کنیم. (متغیر تصادفی نرمال، احتمال کمی داره که از بازه‌ی (-1 تا 1) بیرون بیوفته. احتمال خیلی کمی داره که از بازه‌ی (-2 تا 2) بیرون بیوفته، احتمال خیلی خیلی کمی داره که از بازه‌ی (-3 تا 3) بیرون بیوفته و ... پس اگه مقدارش مثلا 5 باشه، یعنی احتمالا باید یه outlier باشه. (یعنی مثلا موقع ثبت اطلاعاتش، یه اشتباه رخ داده و نویزی شده))حالا توی شبکه‌های عصبی، چطوری از این نرمالیزیشن استفاده می‌کنیم؟ ساده است! وقتی یه دسته (Batch) از داده رو به شبکه‌ی عصبی مون دادیم، هر جا که قرار باشه BN انجام بشه، یه دور از داده‌ها میانگین میگیریم (میانگین داده‌ها رو در راستای Batch میگیریم. یعنی اگه یه ماتریس 128 در 100 داشته باشیم که 128 اندازه‌ی Batch و 100 تعداد نورون‌های لایه‌ی قبلی باشه، میانگینی که به دست میاریم باید یه بردار 100 تایی باشه.) و این میانگین به دست اومده رو از داده‌ها کم می‌کنیم. بعدش واریانس همین داده‌ها رو محاسبه می‌کنیم (واریانس رو هم باید دقیقا مثل میانگین به ازای هر نورون به صورت مجزا محاسبه کنیم. 100 تا نورون خروجی = 100 تا واریانس محاسبه شده.) حالا داده‌ها رو بر بردار واریانس‌ها تقسیم می‌کنیم. (یعنی همه‌ی 128 تا خروجی که برای نورون شماره‌ی 7 محاسبه شدن، اول میانگینشون ازشون کم میشه و بعد بر واریانسشون تقسیم میشن.) نتیجه‌ی حاصل، یه ماتریس 128 در 100 جدیده، که میانگین هر ستونش برابر صفر و واریانس هرکدوم از ستوناش هم 1 هست.گام بعدی توی اجرای BN، ضرب کردنش در بردار گاما و بعد جمع کردن سطر‌های این ماتریس با بردار بتا هست. عملا با این کار، میانگین توزیع جدیدمون رو برابر بتا و واریانسش رو برابر گاما تعیین می‌کنیم. بردار‌های بتا و گاما از کجا میان؟ خیلی ساده است، اجازه میدیم به کمک الگوریتم Back Propagation مثل بقیه‌ی پارامتر‌های مدل آموزش داده بشن. اینطوری مدل میتونه در صورتی که لازم باشه، توزیع رو از حالت نرمال خارج کنه.تا اینجا توضیح دادم که الگوریتم BN چیکارا انجام میده، اما این که چرا این کارارو انجام میده و با انجامشون، چه تاثیری روی عملکرد شبکه‌ی عصبی میذاره، توی بخش بعدی در موردش صحبت می‌کنم.بخش دوم: تاثیر استفاده از BN توی آموزش شبکه‌های عصبی چیه؟آموزش شبکه‌های عصبی، بعضی وقتا خیلی کند و اعصاب خورد کن میشه. خصوصا وقتی شبکه مون خیلی سنگین باشه و برای هر epoch از آموزشش، چندین ساعت زمان لازم باشه. اما چرا؟ دلیلش تغییر مکرر توزیع خروجی نورون‌های مخفی شبکه مون هست. فرض کنید نورون N قراره یاد بگیره که یه ویژگی به خصوص توی داده رو تشخیص بده و برای این کار، از خروجی نورون‌های A و B استفاده می‌کنه. حالا همونطور که توی روند آموزش، همه‌ی وزن‌ها همزمان آموزش داده بشن، با یه ذره تغییر کردن وزن‌های نورون‌های A و B، خروجی‌هاشون یکم شیفت پیدا می‌کنن. با این شیفت جزئی، ممکنه نورون N (که قبلا داشت کارش رو نسبتا خوب انجام می‌داد) دوباره نیاز داشته باشه که مقادیر وزن‌هاشو تغییر بده تا با ورودی‌های جدیدش هماهنگ باشه. در نتیجه، فرصت نمی‌کنه خروجی خودش رو هم بهبود بده و به دنبال هر تغییر کوچیک توی وزن‌های نورون‌های لایه‌ی قبلی، فرآیند یادگیری نسبتا ساده اش رو تکرار کنه. (حالا اتفاقی که توی شبکه‌های عصبی خیلی عمیق می‌افته رو تصور کنین... هر لایه هر بار باید یاد بگیره با ورودی‌هایی با توزیع جدید کار کنه... و این توزیع‌ها همش دارن تغییر می‌کنن...) حالا اگه توی همین سناریو، BN انجام بشه، با وجود تغییر مداوم توزیع خروجی‌های A و B، نورون N به خاطر اعمال BN همیشه با توزیع یکسان مواجهه (میانگین همیشه صفره و واریانس همیشه مقدار 1 داره) پس تغییرات جزئی یا حتی شدید توی مقادیر وزن‌های لایه‌های قبل، اثری روی آموزش نورون N نمیذاره و میتونه به کمک گرادیان‌هایی که دریافت می‎‌کنه، کار تشخیص اون ویژگی خاص توی داده‌ها رو مرتب بهبود بده.همچنین در یه سناریو‌ی دیگه، فرض کنید در ابتدای فرآیند آموزش، خروجی نورون‌های A و B قبل از اعمال تابع فعالساز ReLU، مقادیر منفی داشته باشن. پس خروجی نهایی شون حتما صفر میشه. نورون N برای این که بتونه هرگونه گرادیان رو به این نورون‌ها منتقل کنه، باید صبر کنه تا خروجی این نورون‌ها تغییر کنه و به ناحیه‌ی مثبت وارد بشه. پس عمل آموزش وزن‌های نورون N و در نتیجه A و B، شدیدا کند میشه. در حالی که اگه از BN استفاده کنیم، این وزن‌ها در وضعیتی خواهند بود که حدود نصفشون کمتر از صفر و بقیه بیشتر از صفر باشن. اینجوری میشه تضمین کرد که فرآیند آموزش هیچوقت متوقف نمیشه.یه اتفاق هست که وقتی از توابع loss خیلی خاص استفاده می‌کنیم ممکنه پیش بیاد، اون هم زمانیه که تابع loss خروجی به شکلیه که ممکنه در یه batch خاص، مقدار گرادیانش خیلی زیاد باشه (نزدیک به بینهایت) و در نتیجه، مقادیر وزن‌های شبکه رو با شدت زیادی تغییر بده. این کار بعضی وقتا باعث میشه همه یا بخشی از نورون‌ها به نورون‌های مرده تبدیل بشن. در نتیجه خروجی مدل مستقل از ورودی‌هاش، همیشه ثابت بمونه و دیگه آموزشی انجام نشه. اما اگه BN اعمال بشه، فرآیند آموزش دوباره میتونه از سر گرفته بشه چون هیچ نورونی بعد از اعمال BN نمیتونه نورون مرده‌ی ReLU باشه. (میانگین صفر داشتن داده‌های Batch باعث میشه همیشه یه تعداد از داده‌ها در سمت فعال تابع ReLU قرار بگیرن.)بخش سوم: کجا باید از BN استفاده کنیم؟این بخشو به صورت خلاصه میگم: اگه شبکه‌ی عصبی تون عمق چندان زیادی نداره، برای پیاده سازی BN خودتونو به زحمت نندازین، احتمالا تاثیر زیادی روی فرآیند آموزش مدلتون نمیذاره. اما اگه دارین یه شبکه‌ی عصبی ژرف آموزش میدین، که بیشتر از 5-6 لایه داره، بهتره بعد از اعمال activation function های هر لایه از BN استفاده کنین.یه نکته‌ی قابل بحث دیگه هم اینه که بعضی از محققین معتقد هستن باید BN رو قبل از activation function هر نورون اعمال کنیم نه بعدش. اما منم مثل آقای فرانسوا شوله فکر می‌کنم اعمال BN بعد از تابع فعالساز، کار عاقلانه‌تری محسوب میشه. اگه قبل از اعمال ReLU از BN استفاده کنیم، باعث میشیم همه‌ی نورون‌های شبکه‌مون برای حدود نصف داده‌های ورودی مقدار صفر به خودشون بگیرن. یعنی هر نورون برای نصف داده‌ها فعال و برای نصف دیگه غیرفعال میشه. در حالی که مثلا نورونی که میخواد یه ویژگی رو تشخیص بده، که احتمالش 10 درصد باشه، نیاز داره 90 درصد داده‌ها رو در نیمه‌ی غیرفعالش قرار بده و فقط برای 10 درصد باقی مونده از داده‌ها فعال بشه. ولی اگه BN رو بعد از activation اعمال کنیم، وزن‌های لایه‌ی بعدی خودشون میتونن داده‌ها رو به قدر نیاز شیفت بدن و این تفاوت رو اعمال کنن.یه جایی توی استک‌اوورفلو یه کامنت جالب دیدم، که [به درستی] اشاره می‌کرد اگه بعد از یه لایه‌ی کانوولوشنی، از pooling استفاده می‌کنین، بهتره BN لایه‌ی کانوولوشنی رو حذف کنین و بعد از pooling نرمالیزیشن رو اضافه کنین. دلیلش هم محاسبات کمتره. اگه مثلا pooling با کرنل‌های 2 در 2 استفاده می‌کنید، محاسبات و همچنین پارامتر‌هایی که برای BN استفاده می کردین، با انتقال BN به بعد از لایه‌ی pooling، می‌تونین محاسبات انجام شده برای BN رو چهار برابر سریعتر کنین.جمع بندی:توی این نوشته در مورد BN صحبت کردم، و توضیح دادم چطور کار می‌کنه. همینطور در مورد علت استفاده از این تکنیک و خواصی که در فرآیند آموزش شبکه‌های عصبی ایجاد می‌کنه حرف زدم. بعد از اون، چند تا توصیه در مورد نحوه‌ی استفاده از BN و باید‌ها و نباید‌هاش گفتم. امیدوارم مفید باشه.منابع:https://en.wikipedia.org/wiki/Normalization_(statistics)https://github.com/keras-team/keras/issues/1802#issuecomment-187966878https://stackoverflow.com/questions/47143521/where-to-apply-batch-normalization-on-standard-cnns#comment109995016_59939495</description>
                <category>محمدرضا رضائی</category>
                <author>محمدرضا رضائی</author>
                <pubDate>Fri, 05 Nov 2021 18:05:16 +0330</pubDate>
            </item>
                    <item>
                <title>1400/04/04 - یادداشتی برای رئیس جمهور</title>
                <link>https://virgool.io/@Mr_Rezaei/1400-04-04-%D8%AE%DB%8C%D8%B1-rmzmphwhkrz3</link>
                <description>اولین کنفرانس مطبوعاتی آقای رئیسی بعد از انتخابات 28 خرداد 1400چند روز پیش، (دقیقتر بگم 31 خرداد 1400) پیروز انتخابات سیزدهیم دوره ی ریاست جمهوری ایران در یک کنفرانس مطبوعاتی شرکت کرد و با رسانه های خارجی و داخلی ملاقات کرد. یکی از بخش های جنجالی این کنفرانس مطبوعاتی، سوال خبرنگار «راپلی» روسیه از آقای رئیسی بود. این خبرنگار از آقای رئیسی پرسید:آیا بعد از لغو تحریم‌ها حاضر به ملاقات با رئیس‌جمهور آمریکا هستید؟جواب کوتاه، قاطع و جنجالی آقای رئیسی اما این بود:خیر!سوالی که پیش میاد اینه که آیا این نوع پاسخ دادن به مطبوعات، روش درستی هست؟ آیا پاسخ بهتری هم می شد به این سوال داد؟ توی این نوشته میخوام اول تحلیل خودم از این پاسخ آقای رئیسی و بعدش یه پاسخ جایگزین برای پرسش این خبرنگار ارائه بدم.1- «خیر» گفتن آقای رئیسی چه اطلاعاتی به ما میده؟اولین برداشتی که میشه از این پاسخ داشت، بی برنامه بودن دولت آقای رئیسی برای هرگونه همکاری با دولت ایالات متحده ی آمریکاست. البته منظورم رو اشتباه برداشت نکنید، منظورم این نیست که آقای رئیسی باید با دولت آمریکا همکاری کنه، منظورم اینه که ایشون و احتمالا دولتشون آمادگی ذهنی برای هر گونه برخورد با این دولت رو ندارن. یعنی اگه دولت آمریکا همونطور که سیاستمدار ها دوست دارن انجام بدن، یه اقدام غافلگیر کننده انجام بده و توازن قدرت رو در روابط خارجی با ایران به هم بزنه، آقای رئیسی چون هیچ آمادگی قبلی برای برخورد با این دولت نداره، ممکنه در بهت فرو بره و دولتش بدون داشتن برنامه، وارد موضع منفعلانه بشه و تا وقتی که پاسخ مناسب برای این اقدام پیدا بشه، زمان بسیار زیادی بگذره و حتی ضرر قابل توجهی به کشور وارد بشه.دومین درسی که از این پاسخ قاطع می گیریم، شناخت نداشتن آقای رئیسی از رسانه و علی الخصوص رسانه های بین المللیه. همونطور که در چند روز گذشته شاهدش بودیم، بسیاری از رسانه های خارجی این پاسخ رئیس جمهور منتخب رو نشانه ی تخاصم، خشونت و حتی جنگ طلبی تعبیر کردن. یعنی آقای رئیسی نه تنها حاضر به تعامل با ایالات متحده نیست، بلکه حتی به برگزاری یه دیدار دیپلماتیک با رئیس جمهور این کشور هم نیست و یادمون هست که همچین رفتار هایی به راحتی میتونن یادآور رفتار سردمداران جنگ طلب بعضی کشور ها در تاریخ باشن. و توانایی فنی بالای رسانه های بین المللی در بزرگنمایی این خصیصه ها میتونه کشور رو از نظر دیپلماتیک در وضعیت ضعف (نه تنها در برابر ایالات متحده، بلکه در برابر سایر کشور هایی که تحت تاثیر رسانه های تحت سلطه ی ایالات متحده هستن) قرار بده. یعنی مثلا رئیس جمهور شیلی که هر از گاهی شبکه های تلویزیونی آمریکایی رو نگاه می کنه، این تحلیل های برزگ نمایانه رو ببینه و در نتیجه در رابطه با ایران رویکرد محافظه کارانه تری اتخاذ کنه. که این رویکرد ممکنه شامل برخورد محتاطانه یا جلوگیری از افزایش روابط اقتصادی و تجاری بشه. چون ممکنه با خودش فکر کنه ایران اگه بخواد در دوره ی آقای رئیسی وارد درگیری نظامی با آمریکا بشه، رابطه ی اقتصادی یا تجاری داشتن با ایران میتونه صدمه های بزرگی به کشورش بزنه. و به نظر من، برای دولتی که هدفش از تعاملات تجاری، همین کشور های غیر ابرقدرت هستن، رویکرد رسانه ای اشتباهیه. چون باعث میشه دسترسی به تعامل با این کشور ها سخت تر بشه.2- اگه من جای آقای رئیسی بودم، چه جوابی به این سوال میدادم و چرا؟به نظر من، آقای رئیسی میتونستن توپ رو به زمین دولت ایالات متحده بندازن. به این معنی که مقصر اصلی سرد بودن روابط بین دو دولت رو، اقدامات قبلی دولت آمریکا معرفی کنه. همچنین میتونست با اشاره به جنایاتی که این دولت در گذشته در حق مردم ایران مرتکب شده، خودش رو در موضع طلبکار قرار بده و رسانه های دنیا رو به این سمت هدایت کنه که برن و از ایالات متحده بپرسن که «چه دشمنی ای با ایران دارید که این بلایا رو بر سر مردمش آوردید؟» یا «آیا برای ایجاد تعامل سازنده با ایران، حاضر هستید اقدامات اشتباه دولت ایالات متحده در گذشته رو جبران کنید؟» یا... . در نتیجه با وجود عدم تکرار موضع اشتباه و ذلت بار دولت آقای روحانی، میتونست دولت خودش رو از قهر دیپلماتیک مبری نشون بده و حتی مظلومیت مردم ایران رو در چشم رسانه های بین المللی نشون بده.اگه من جای آقای رئیسی بودم، جوابی که به این سوال میدادم یکم طولانی تر از جواب ایشون میشد:دولت ایالات متحده ی آمریکا، در طول تاریخش اقدامات دشمنانه ی زیادی در حق ملت ایران انجام داده. از کودتای 28 مرداد (که باعث سرنگونی دکتر مصدق و چپاول دوباره ی نفت ایران توسط قدرت های جهانی شد) گرفته، تا حمایت از صدام و حزب بعث عراق، تا کمک به تشکیل و حمایت داعش، طالبان، القائده و دیگر گروه های تروریستی که باعث کاهش امنیت منطقه و کشته شدن تعداد زیادی از مردم بی گناه شد و تحریم بی دلیل اقتصادی علیه مردم ایران. یعنی این دولت همیشه با مردم و دولت ایران رفتار دشمنانه داشته.اگر دولت ایالات متحده اقدامات دشمنانه شون رو علیه مردم ایران جبران کنن، و چهره ی خودشون رو در چشم مردم ایران بازسازی کنن، بنده هم حاضر خواهم بود اولین رئیس جمهور دولت جمهوری اسلامی باشم که رئیس جمهور آمریکا رو برای شام به منزلش دعوت می کنه.این میتونست پاسخی باشه که باعث بشه دید رسانه های جهانی از دولت آینده، از «جنگ طلب» یا «انزوا گرا» به «مظلوم» و حتی «تعامل گرا» تغییر بده. و در نتیجه ابزاری باشه برای توسعه ی روابط، خصوصا روابط اقتصادی و تجاری با سایر کشور های جهان.در آخر باز میخوام توصیه ای به آقای رئیسی کنم، که امیدوارم به گوششون برسه و همچنین بهش گوش کنن:سخنور نبودن و خطیب نبودن، برای هیچ کس حتی رئیس جمهور آینده ی ایران عیب نیست. اما اصرار بر سخنرانی بدون برنامه ی قبلی، برگزاری کنفرانس خبری بدون حضور سخنگو (کسی که متخصص این نوع سوال و جواب ها باشه) با رسانه های خارجی، و دادن جواب هایی که از قبل در موردشون فکر نشده، برای یه رئیس جمهور عیب بزرگیه.صائب تبریزی، شاعر نابغه ی قرن یازدهم میفرماید:بی کمالی های انسان از سخن پیدا شود       ***       پسته ی بی مغز چون لب وا کند رسوا شودممنون که این مطلب رو مطالعه کردید. لطفا نظراتتون رو در کامنت ها بیان کنید. خوشحال میشم پاسخ پیشنهادی شما به این پرسش رو هم بشنوم.</description>
                <category>محمدرضا رضائی</category>
                <author>محمدرضا رضائی</author>
                <pubDate>Fri, 25 Jun 2021 17:25:01 +0430</pubDate>
            </item>
                    <item>
                <title>چطور عکس های غیر هم اندازه و/یا با نسبت غیر ثابت را به یک شبکه عصبی بدهیم؟</title>
                <link>https://virgool.io/@Mr_Rezaei/how-to-preprocess-my-image-dataset-cuhjjahz1emj</link>
                <description>شبکه های عصبی کانوولوشنی (CNN ها) نقطه ی تلاقی پردازش تصویر و هوش مصنوعی هستن. بعضی از نسخه های CNN ها، روی مجموعه داده های بزرگی مثل ImageNet به دقت های بالاتر از دقت سیستم بینایی انسان رسیدن جزو اولین حوزه هایی به حساب میان که کامپیوتر ها از انسان ها جلو افتادن.همونجوری که اطلاع دارید، شبکه های عصبی کانوولوشنی، لازم دارن که ورودی ای که بهشون میدیم، سایز یکسان و ثابتی داشته باشه. و این برای کسانی که میخوان توی یه کاربرد جدید از CNN ها استفاده کنن، یکم دردسر سازه. مثلا شما میاین از 10 تا منبع مختلف تصویر جمع می کنین، تا تعداد داده هایی که در اختیار دارین رو به حد قابل توجهی برسونین (و عمل training رو ممکن کنین) و مثلا تعداد داده هاتون به 5000 میرسه. اما وقتی شروع می کنین یه مدل هوش مصنوعی درست کنین، دقت می کنین و می بینین که هر کدوم از اون 10 تا منبع، عکس هایی با Resolution مختلف ارائه دادن و شبکه ی عصبی کانوولوشنی ای نمیتونه این عکسا رو دریافت کنه.امروز چند تا راهکار ساده برای سازگار کردن اندازه ی این تصاویر و آماده کردن دیتاست (DataSet) برای یه کار پردازش تصویری هیجان انگیز رو باهم مرور می کنیم.1- تغییر سایز به روش Stretch کردنفرض کنید یک تعداد تصویر با نسبت های مختلف و سایز های مختلف دارید. یک سایز استاندارد در نظر می گیرید (که بهتره یکی از پر تکرار ترین سایز های تصاویری که جمع آوری کردید باشه) مثلا اینجا در نظر می گیریم که این سایز 100*100 باشه. همه ی تصاویری که دارین رو به این سایز Stretch می کنین. مثلا یه تصویر که 120*120 هست، بدون تغییر نسبت طول به عرض و فقط با کمتر شدن Resolution به این سایز تبدیل میشه. و عکس هایی که نسبت متفاوتی دارن، با تغییر جزئی شکل به این سایز در میان. (که این یه مشکل جدی محسوب میشه)2- تغییر سایز به روش Zero Padding یا اضافه کردن قاب (*)فرض کنید بزرگترین سایز داخل مجموعه داده تون، 120*120 باشه. بعضی از عکس ها سایز 100*100 دارن و بعضی از اون ها سایز 120*50 و بعضی دیگه 70*120. توی این روش، هر تصویر رو در مرکز یه قاب 120*120 قرار میدیم، و بعدش هرجایی از قاب که خالی موند، رو با پیکسل های رنگ سیاه (یا هر رنگ دیگه ای که بر حسب کاربرد و تصاویر شما پس زمینه محسوب میشه) پر می کنیم. اینجوری، باعث میشیم تصویر 100*100، از هر طرف 10 پیکسل سیاه بهش اضافه بشه. همینطور تصویر 120*50 از بالا و پایین 35 پیکسل قاب سیاه بهش اضافه میشه. تصویر 70*120 هم از راست و چپ 25 پیکسل سیاه بهش اضافه میشه. (*: اینستاگرامی ها خوب میدونن این روش چجوری کار می کنه :دی)3- بریدن تصاویر به اندازه ی دلخواه (Crop کردن)این روش تقریبا برعکس روش قبلیه. اینجا یه سایز کوچیک (مثلا کوچیکترین سایز عکس داخل مجموعه داده) رو در نظر می گیریم و بقیه ی تصاویر رو وسط یه قاب به این اندازه میذاریم و اضافی هاشونو میبریم و میندازیم دور. همونطور که مشخصه، ممکنه اینجوری قسمت های مهمی از تصاویر رو دور انداخته باشیم پس موقع استفاده از این روش، خیلی دقت کنید. اگه میتونید، به صورت دستی، به جای این که مرکز تصاویر رو داخل قاب بذارید، مرکز توجه تصویر رو داخل قاب بذارید تا مطمئن بشین اطلاعات مهمی از تصویر رو حذف نمی کنید.4- ترکیب روش اول و روش دوم (Zero Padding + Stretching)این روش یه جورایی خوبی های دو روش اول رو باهم ترکیب می کنه. اینجوری که اولش میایم یه Ratio برای تصاویر در نظر میگیریم، مثلا 1:1 یعنی تصاویر مربعی. بعدش هر تصویر داخل مجموعه داده رو، با Zero Padding به این نسبت تبدیل می کنیم. یعنی اگه یه تصویر 100*90 داشته باشیم، 5 پیکسل از بالا و پایین بهش قاب سیاه اضافه می کنیم. بعد از این مرحله، همه ی تصاویر مربعی ای که داریم رو، به یه سایز مشخص مثلا 100*100 Stretch می کنیم. همونطوری که مشخصه، توی این روش، مشکل تغییر شکل ایجاد شده به خاطر Stretch کردن به نسبت های متفاوت، وجود نداره. البته هنوز یه مشکل وجود داره و اینه که رنگ سیاه اضافه شده ممکنه بر حسب کاربردی که مد نظر دارید، براتون مشکل ایجاد کنه و مثلا بخواید به جاش سبز یا قرمز استفاده کنید.5- تولید Patch های کوچیک از تصاویر، به صورت تصادفیاین روش یکی از روش هاییه که جدیدا بیشتر مورد استفاده قرار می گیره. توی این روش، به جای این که هر تصویر رو یک بار استفاده کنیم، از هر تصویر چندین Patch (تکه) با سایز ثابت برمیداریم و به مجموعه داده اضافه می کنیم. مثلا فرض کنید یه تصویر با اندازه ی 200*200 داریم. ولی اندازه ی Patch رو 100*100 در نظر گرفتیم. میایم یه تعداد نقطه ی شروع تصادفی داخل تصویر انتخاب می کنیم. مثلا نقاط (100, 100) (100, 25) (40, 90) (19, 0) و بعد میایم Patch های به اندازه ی 100*100 رو با شروع از این نقاط انتخاب می کنیم. برای این مثال، Patch هامون میشن:100, 100 ~ 200, 200100, 25 ~ 200, 12540, 90 ~ 140, 19019, 0 ~ 119, 100و حالا این Patch ها که هرکدوم اندازه اش 100*100 هست رو به مجموعه داده مون اضافه می کنیم. خب همونطور که اطلاع دارید، این روش علاوه بر این که مشکل سایز های مختلف تصاویر رو حل می کنه، یه تکنیک Data Augmentation هم محسوب میشه. (که خیلی به درد میخوره)6- هر روش ترکیبی دیگه ای که به ذهنتون میرسه...همونجوری که میدونین، هوش مصنوعی بدون خلاقیت، هیچ معنایی نداره. اگه یه نفر بیاد و بهتون بگه توی هوش مصنوعی برای حل فلان مشکل فقط و فقط یه راه وجود داره، میتونین با احتمال 99 درصد بهش بگین که &quot;اشتباه می کنی!&quot; برای این مشکل که امروز بررسی کردیم هم، فقط این چند تا راه حل وجود نداره و بر اساس کاربردی که مد نظر دارین و خلاقیتی که به خرج میدین، میتونین کار های خارق العاده ی دیگه ای انجام بدین.یه نکته هم که آخر کار میخوام اضافه کنم، توجه کردن به نوع ذخیره شدن تصاویر هست. مثلا اگه تصویری رو با استفاده از کتابخانه ی Opencv از روی حافظه میخونید، باید توجه کنید که این تصویر رو به فرمت BGR در میاره. در حالی که اگه همین کارو با استفاده از matplotlib انجام بدید، بهتون فرمت RGB میده. (یعنی محل کانال های رنگی این دو روش باهم فرق می کنه.) پس لطفا دقت کنید تا دیتای Consistent ای داشته باشید.همچنین حواستون باشه که هیچوقت دیتای اولیه رو دور نریزین. چون ممکنه بعدا متوجه بشین که توی یکی از مراحل Preprocessing، یه مشکل به وجود اومده و دیتا تون رو خدای ناکرده از دست بدین.امیدوارم نکاتی که امروز باهم بررسی کردیم به دردتون خورده باشه.اگه نظری در مورد این پست یا پیشنهادی در مورد پست های بعدی دارین، خوشحال میشم که بهم اطلاع بدینخوش باشین :)</description>
                <category>محمدرضا رضائی</category>
                <author>محمدرضا رضائی</author>
                <pubDate>Tue, 28 May 2019 16:02:50 +0430</pubDate>
            </item>
            </channel>
</rss>