<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های alikarimi120</title>
        <link>https://virgool.io/feed/@alikarimi120</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-18 19:24:23</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/161522/avatar/6bvHUr.jpeg?height=120&amp;width=120</url>
            <title>alikarimi120</title>
            <link>https://virgool.io/@alikarimi120</link>
        </image>

                    <item>
                <title>گوگل کولب چیست؟</title>
                <link>https://virgool.io/@alikarimi120/%DA%AF%D9%88%DA%AF%D9%84-%DA%A9%D9%88%D9%84%D8%A8-%DA%86%DB%8C%D8%B3%D8%AA-bq3hpqkev6cm</link>
                <description>سلام، تو این نوشتار میخوام در ارتباط با گوگل کولب یا Google Colab صحبت کنم.کولب کوتاه شده واژه Colaboratoryاست. واژه Colaboratory یعنی آزمایشگاه مشترک، حالا Google Colab که کوتاه شده واژه Google Colaboratoryهست به معنای آزمایشگاه مشترک گوگل هست که شما می تونید به صورت آنلاین از اون استفاده کنید و در مرورگرهای خود کدهای پایتونی رو بنویسید و اجرا کنید. در واقع Goole Colab یک میزبان آنلاین برای پروژه های  شما است که امکان پردازش با CPU یا GPU یا TPU را برای شما فراهم می کند. Google Colab می تواند کدهای شما را از گیت هاب و یا گوگل درایو شما فراخوانی یا به آن ها ارسال کند.Google Colabداخل گوگل کولب به شما منابعی شامل Hard Disk، RAM، CPU و در صورت انتخاب توسط شما GPU یا TPU هم به شما داده میشه ولی به صورت پیش فرض این منابع در اختیارتون قرار نمی گیره.منابع گوگل کولبشما در محیط گوگل کولب یک محیط ژوپیتر در اختیار دارید که می تونید کدهای پایتونی رو اجرا و استفاده کنید، به طور مثال اگر می خواهید یک NumPy array ایجاد کنید یک cell جدید ایجاد کنید و سپس کدتون رو بنویسید و روی دکمه run cell کلیک کنید ، کد شما اجرا میشه:اجرای کد در محیط Google Colabچطور از GPU یا TPU برای اجرای کدها استفاده کنیم؟از منوی بالا صفحه گزینه Runtime را انتخاب کنید و سپس از منوی باز شده گزینه Change Runtime type رو انتخاب کنید ، اینجا می تونید انتخاب کنید که همچنان روی CPU اجرا بشه که باید گزینه None رو انتخاب کنید یا انتخاب کنید روی GPU یا TPU کد شما اجرا بشه.Change runtime typeاگه می خواهید ببینید چه GPU ای در اختیار شما قرار داده شده است دستور nvidia-smi! را اجرا کنیدنمایش مشخصات GPUچطور دستورهای لینوکس رو داخل گوگل کولب اجرا کنیم؟برای اجرای دستورهای لینوکس ابتدای هر دستورتون یک علامت تعجب (!) استفاده کنید مثلا اگر می خواهید دستور ls را اجرا کنید ls! را بنویسید یا اگر میخواهید کتابخانه تنسورفلو رو نصب کنید به جای pip install tensorflow دستور pip install tensorflow! رو بنویسید.چطور از گوگل کولب خروجی بگیریم؟با کلیک روی گزینه File می تونید از منوی File گزینه Download رو انتخاب کنید و بنا به نیاز به یکی از دو فرمت py یا ipynb فایل کدتون رو دانلود کنید.</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Thu, 03 Mar 2022 13:52:02 +0330</pubDate>
            </item>
                    <item>
                <title>چطور کدمون رو داخل فایل ورد قرار بدیم؟</title>
                <link>https://virgool.io/@alikarimi120/%DA%86%D8%B7%D9%88%D8%B1-%DA%A9%D8%AF%D9%85%D9%88%D9%86-%D8%B1%D8%A7-%D8%AF%D8%A7%D8%AE%D9%84-%D9%81%D8%A7%DB%8C%D9%84-%D9%88%D8%B1%D8%AF-%D9%82%D8%B1%D8%A7%D8%B1-%D8%A8%D8%AF%DB%8C%D9%85-qsjykdgc32sr</link>
                <description>راه های مختلفی رو احتمالا تاکنون برای قرار دادن کدتون داخل فایل ورد امتحان کردید، از کپی اسکرین شات کد تا خود کد که هر کدوم مشکلات خودشو دارن ، کپی اسکرین شات کد حالت زشت و نامنظمی به گزارش شما میده و کپی خود کد هم معمولا هایلایت ها و شماره سطرهای کد رو از بین میبره، تو این نوشتار راه حلی رو به شما توضیح میدم تا کدی که نوشتید رو عینا با همون هایلات ها به فایل ورد انتقال بدید و داخل گزارشتون استفاده کنید. فرقی نمیکنه برای نوشتن کد از چه کامپایلری استفاده می کنید، کدتون رو داخل سایت http://hilite.me کپی کنید و زبان برنامه نویسی که با استفاده از اون کدتون رو نوشتید انتخاب کنید.سایت hilite.meشما داخل این سایت می تونید انتخاب کنید که style کد شما به چه صورت باشه و همینطور آیا کدتون خط گذاری بشه یا نه، اگه کمی CSS بلد باشید می تونید پارامترهای بیشتری رو از طریق باکس CSS به صورت  دستی تغییر بدید و استایل خاص خودتون رو بسازید.حالا می تتونید کد رو کپی کنید و به داخل word ببرید، داخل Word هم می تونید مستقیما کد رو کپی کنید ولی یک راه حل بهتر استفاده از Object ها هست . برای اینکار وارد تب Insert بشید و از قسمت Text گزینه Object رو انتخاب کنید، در این مرحله صفحه object که شبیه تصویر زیر هست برای شما باز میشه ، در این قسمت در منو Object type شما باید گزینه OpenDocument Text رو انتخاب کنید و بعد رو گزینه Ok کلیک کنیدمنو Objectبعد از انتخاب گزینه Object صفحه جدیدی برای شما باز میشه که می تونید کدتون رو داخل صفحه ورد جدید paste کنید و بعد صفحه رو ذخیره کنید و ببنید ، شبیه به تصویر زیر:بعد از اینکه ذخیره کردید، دوباره به صفحه اصلی Word بر می گردید و کدتون داخل صفحه به شکل زیر نمایش داده میشه </description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Thu, 03 Mar 2022 13:18:58 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده سازی اولین شبکه عصبی برای طبقه بندی تصاویر  با استفاده از پایتورچ (قسمت چهارم)</title>
                <link>https://virgool.io/@alikarimi120/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%B4%D8%A8%DA%A9%D9%87-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B7%D8%A8%D9%82%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D8%B1%DA%86-%D9%82%D8%B3%D9%85%D8%AA-%DA%86%D9%87%D8%A7%D8%B1%D9%85-sdgaugldrojo</link>
                <description>سلام، امیدوارم تا قسمت پایانی خسته نشده باشید، در ادامه مطالب در قسمت پایانی نحوه آموزش یک طبقه بند تصویر رو به شما توضیح بدم، امیدوارم از مطالب استفاده ببرید.کتابخانه pyTorchآموزش طبقه بند :داده ها رو چطور باید استفاده کنیم؟ داده ها می تونن صدا، تصویر، متن یا حتی ویدیو باشند، ابزارهای استانداردی از قبل برای کار با  این داده ها وجود داشته که می تونستیم این داده ها رو داخل آرایه های NumPy بارگذاری کنیم، چون پکیج های آماده برای NumPy وجود داره می تونیم اول  اونها رو داخل NumPy array بارگذاری کنیم و بعد به تنسور تبدیل کنیم. به طور خاص برای بینایی ماشین کتابخانه Torchvision رو داریم که Dataloader های خوبی برای دیتاست های benchmark تعریف شده مانند CIFAR10 و MNIST ، برای این دیتاست ها loader ها به طور پیش فرض تو کتابخانه تعریف شده است.برای load کردن داده های CIFAR10 از Torchvision استفاده می کنیم. روند به این صورت است که ابتدا داده ها دریافت میشه ، در ادامه نیاز به نرمالسازی داریم که از تابع transform کتابخانه Torchvision استفاده می کنیم . با استفاده از Torchvision مسیر دانلود مجموعه داده برای آموزش و تست رو تعیین می کنیم. همچنین سایز batch ها رو هم تعیین می کنیم، به طور مثال در اینجا اندازه batch رو 4 تعیین کردیم، همینطور می تونیم تعیین کنیم که آیا داده ها shuffle بشود یا خیر و تعداد worker ها رو هم تعریف کنیم که تعدادشون بستگی به GPU ما داره،  در ادامه کلاس های موجود رو هم تعریف می کنیم. https://gist.github.com/alikarimi120/05b44233e26248531597842185d652f2 نمونه ای از نحوه نمایش تصاویر مجموعه داده CIFAR10 رو در این قطعه کد مشاهده می کنید. https://gist.github.com/alikarimi120/d5f078dcd56fe91f5cae1408fc6f0855 نمونه داده های CIFAR10در ادامه در گام اول آموزش شبکه، شبکه را تعریف می کنیم که شبکه ای تشکیل شده از لایه های کانولوشنی و طبقه بندی هست. https://gist.github.com/alikarimi120/f6b5eab238c2d5a907c56695a860ec44 تابع هزینه رو تعریف می کنیم که اینجا تابع هزینه Cross Entropy هست ، همینطور Optimizer رو SGD تعریف می کنیم. https://gist.github.com/alikarimi120/0567dc483a2215e461a6fab43b953d90 در این مرحله حلقه آموزش شروع میشه، به تعداد epoch ای که میخواهیم شبکه رو آموزش بدیم حلقه for رو اجرا می کنیم که در اینجا برابر با 2 هست. یک حلقه روی batch هایی که از train loader دریافت میشه اجرا میشه . بعد از دریافت داده ها گرادیان رو صفر می کنیم و از روی ورودی با استفاده از شبکه خروجی رو حساب می کنیم و با استفاده از تابع هزینه اختلاف میان هدف و خروجی رو محاسبه می کنیم و نهایتا گرادیان رو بدست میاریم و با استفاده از optimizer وزن های شبکه رو به روزرسانی می کنیم. https://gist.github.com/alikarimi120/e915ca3207c507f4a2d28e1fc43f4dea یکی از گام های مهم، ذخیره مدل هست که با استفاده از دستور زیر مدل رو ذخیره می کنید. https://gist.github.com/alikarimi120/1c32717795b33f094cca0ff1bffcd39e حالا بعد از آموزش نوبت تست هست و  برای این کار از loader مجموعه داده تست استفاده میکنیم با استفاده از تابع iter یک batch برای تست دریافت می کنیم. https://gist.github.com/alikarimi120/086724c7a6f526035d3db0b28cdcf698 حالا این batch رو به شبکه میدیم و برای اینکار یک instance از شبکه میسازیم و وزن های ساخته شده رو load می کنیم و با استفاده از آن ورودی رو به شبکه میدیم و خروجی محاسبه میشه. می دونید که خروجی ما یک بردار هست که به ازای هر دسته احتمال اون دسته هم قرار داره. https://gist.github.com/alikarimi120/b52c0222490b4970d0b02561361511ee در این گام می بینیم حداکثر مقدار بردار خروجی متعلق به کدوم دسته است و آیا شبکه ما به درستی پیش بینی رو انجام داده یا نه. https://gist.github.com/alikarimi120/c39fd4d74db5d478c97461e8d4d3cd9b یک گام خیلی مهم در فرآیند آموزش شبکه عصبی، ارزیابی مناسب مدل است، در انتها تمام داده های تست رو برای ارزیای مدل استفاده می کنیم، یادمون باشه با استفاده از دستور with torch_no_grad مشخص کنیم که شبکه نیاز به بروزرسانی نداره چون فقط داریم ارزیابی می کنیم. https://gist.github.com/alikarimi120/02913836281c2add982fad4ae76d8264 حالا چطور مدل رو روی GPU اجرا کنیم؟تابع  torch.device(&quot;gpu&quot;) رو فراخوانی می کنیم که اجرای مدل به GPU منتقل بشه. https://gist.github.com/alikarimi120/935efd64e3ce227512344c8184163e03 با توجه به حجم مطالب مورد نیاز نوشته به 4 قسمت تقسیم شده و لطفا برای مطالعه قسمت اول به این لینک و برای مطالعه قسمت دوم به این لینک مراجعه کنید و در نهایت برای مطالعه قسمت سوم به این لینک مراجعه کنید.</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Wed, 02 Mar 2022 09:49:00 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده سازی اولین شبکه عصبی برای طبقه بندی تصاویر با استفاده از پایتورچ (قسمت سوم)</title>
                <link>https://virgool.io/@alikarimi120/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%B4%D8%A8%DA%A9%D9%87-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B7%D8%A8%D9%82%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D8%B1%DA%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-qnmvx7bikwze</link>
                <description>سلام ، امیدوارم از مطالب تا اینجا استفاده برده باشید، تو این قسمت میخوام در مورد نحوه ساخت و آموزش شبکه عصبی در پایتورچ صحبت کنم.کتابخانه PyTorchروش ساخت و آموزش شبکه در پایتورچ :پکیج دیگه ای که در کنار AutoGrad باهاش کار داریم پکیج nn.Module هست، در حقیقت این پیکیج دارای تعریف لایه های پیش فرض هست و یک  مجموعه template در این پکیج داریم که می تونیم استفاده کنیم. https://gist.github.com/alikarimi120/3da625140a5af3a7034d872b06263534 یک رویه متداول برای آموزش به این شکل است:1- ابتدا شبکه رو تعریف می کنیم که حتما یک سری پارامترهای قابل تنظیم داره یا به عبارتی قابل آموزش دادن هستند و به عبارت زبان پایتورچ یک سری تنسور داره که requires_grad اونها True هست.2 - یک دیتاست داریم که به صورت batch به batch به شبکه می دیم.3- داده های ورودی پردازش میشه4 - بر اساس تابع هزینه یا همون loss function مقدار Loss رو محاسبه می کنیم5 - گرادیان ها رو بدست میاریم6 - با استفاده از گرادیان ها و قاعده optimizer وزن ها رو آپدیت می کنیم.تعریف شبکه :از پکیج nn استفاده می کنیم . هر شبکه رو به صورت یک کلاس تعریف می کنیم و از کلاس instance میسازیم، همه کلاس ها یک ارث بری از nn.Module انجام می دهند. تابع init در اینجا برای مقداردهی اولیه شبکه استفاده میشه، در این تابع همانطور که در کد زیر می بیند تابع init کلاس nn.Module با استفاده از دستور super فراخوانی میشه و در ادامه لایه های کانولوشنی و طبقه بندی تعریف می شوند. https://gist.github.com/alikarimi120/0f7824fc8dd795333a5ce9dc5c5b6946 در تابع forward اول x دریافت میشه و کانولوشن اعمال میشه سپس تابع فعالساز ReLU اعمال میشه و در نهایت لایه maxpooling اعمال میشه. این روند یک بار دیگه تکرار میشه و در انتها از لایه flatten برای تبدیل feature map ها به یک بردار استفاده میشه و بعد از چند لایه طبقه بند نهایتا خروجی ساخته میشه و برگردانده میشه.تابع num_flat_features هم تعداد feature ها رو محاسبه میکنهدر نهایت از کلاس Net یک instance ساخته میشه و قابل استفاده هست.دقت داشته باشید نیازی به تعریف تابع backward نیست، تابع backward با توجه به ساختار شبکه که تعریف کردیم به صورت اتوماتیک درست میشه. https://gist.github.com/alikarimi120/f1fd4256a0d34379d9d8ee22e5af21e0 همانطور که می بینید یک tensor ورودی ساختیم که به شبکه میدیم که این اجرای گام forward هست و بعد اینکه خروجی حساب شد به گام بعدی میریم https://gist.github.com/alikarimi120/c572acd00317fd5bd20e3984acbab527 مقدار گرادیان ها رو محاسبه می کنیم. https://gist.github.com/alikarimi120/8f06ded40165e3be8419fac91c4b5fed تابع هزینه : وقتی ورودی رو داریم، که در واقعیت یک دسته از ورودی ها هست، این دسته رو به شبکه میدیم و خروجی بدست میاد، در نظر بگیرید که هدف واقعی رو هم داریم ، یک تابع هزینه هم تعریف می کنیم که در اینجا از mse loss استفاده کردیم، در حقیقت اینجا instance ای از mse loss ایجاد کردیم. اینجا mse loss اختلاف بین هدف و خروجی رو محاسبه میکنه. https://gist.github.com/alikarimi120/2bcc33b52e82ba66eea36f88e0739e67 گرادیان ها در این مرحله حساب میشن. https://gist.github.com/alikarimi120/721271175cd09557e2977d431d9f9170 دقت داشته باشید توابع هزینه های مختلفی می تونیم استفاده کنیم و محدود به این توابع هزینه نیست.به روزرسانی وزن ها:قاعده های مختلفی مثل SGD داریم ، یا Adam ، می تونید راجع به Optimizer ها از اینجا بخونید.وقتی از optimizer  استفاده می کنیم در حقیقت قاعده به روزرسانی وزن ها رو تنظیم می کنیم، اگه این optimizer های پایتورچ وجود نداشت مجبور بودیم گام به روزرسانی وزن ها رو دستی انجام بدیم. https://gist.github.com/alikarimi120/fa2343cc9ae0a9db1206b90f7d1e40e3 ماژول optim برای استفاده از optimizer ها هست که ما در اینجا از SGD استفاده می کنیم و اینجا مقدار پارامترها رو به این optimizer پاس میدیم. https://gist.github.com/alikarimi120/ef7109b49ec53f440891021d94636575 با توجه به حجم مطالب مورد نیاز نوشته به 4 قسمت تقسیم شده و لطفا برای مطالعه قسمت اول به این لینک و برای مطالعه قسمت دوم به این لینک مراجعه کنید و در نهایت برای مطالعه قسمت پایانی به این لینک مراجعه کنید.</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Wed, 02 Mar 2022 09:48:48 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده سازی اولین شبکه عصبی برای طبقه بندی تصاویر  با استفاده از پایتورچ (قسمت دوم)</title>
                <link>https://virgool.io/@alikarimi120/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%B4%D8%A8%DA%A9%D9%87-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B7%D8%A8%D9%82%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D8%B1%DA%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-tm28hhvtxwwg</link>
                <description>سلام :) امیدوار مطالب قسمت اول براتون مفید بوده باشه، در قسمت دوم میخوام به این موضوع بپردازم که اساسا چطور شبکه های عصبی رو آموزش میدیم. با من همراه باشید.کتابخانه PyTorchچطور شبکه های عصبی رو آموزش بدیم؟میدونیم شبکه های عصبی عمدتا با الگوریتم backpropagation انجام میشه. آموزش شبکه عصبی دو مرحله داره : 1- Forward propagation: ورودی اعمال میشه و خروجی بدست میاد که در مرحله بعد استفاده میشه 2-backward propagation: خطای نتایج با نتایج واقعی بدست میاد و این خطا رو در شبکه اعمال می کنیم تا گرادیان ها رو بدست بیاریم. حالا توی پایتورچ ابزاری که اجازه میده که این کار رو انجام بدیم . ابزار AutoGrad هست.در واقع در پایتورچ به این صورت عمل می کنیم که هر تابعی که داخل این کتابخانه پیاده سازی شده و هر operator ای که می تونیم استفاده کنیم gradient اش تعریف شده است، و AutoGrad میاد این گرادیان ها رو حساب میکنه و ذخیره میکنه.بذارید یک شبکه رو مثال بزنید، فرض کنید از کتابخانه Torchvision مدل از پیش آموزش داده شده resnet18 رو استفاده می کنیم. ورودی رندوم رو میسازم . مدل رو میسازیم. https://gist.github.com/alikarimi120/56e6d0065574a1e408222f6b673c2a69 ورودی رو به شبکه میدیم و مجموع خطا رو در تنسوری به اسم loss ذخیره می کنیم و بعد در فاز backward با استفاده از تابع backward تمام گرادیان ها به صورت backward بدست میاد. https://gist.github.com/alikarimi120/3f7ba69b51a7f902f92a04cd1ebe4de4  https://gist.github.com/alikarimi120/d16f2f12dbf1b0be66a7f44e3c13da97 روش های مختلفی برای به روزرسانی وزن های شبکه وجود داره، معروف ترین آنها Stochastic Gradient Descent هست، حالا  تابع optim که فراخوانی میشه وزن های شبکه یک مرحله به روزرسانی میشه. https://gist.github.com/alikarimi120/dfcf2c1a9f869eb01593c14557e780d9 و در نهایت با تابع stop عملکرد آموزش شبکه متوقف میشه. https://gist.github.com/alikarimi120/1731ab6ff3f8eeb5be2aba63daca3382 در این مرحله یک گام از الگوریتم نزول گرادیان اجرا شد!برای درک بهتر AutoGrad یک مثال میزنم.ما دو تنسور A و B داریم که آنها را تعریف کردیم. نکته ای که وجود داره این هست که از کجا متوجه میشه گرادیان رو برای پارامترهای شبکه حساب میکنه. وقتی شبکه رو تعریف می کنید مجموعه ای از وزن ها هست که هر وزن هم در یک تنسور ذخیره میشه https://gist.github.com/alikarimi120/ec6abfe087ce24deceb9e8a67c759e52 در مجموع برای تنسورهای AutoGrad گرادیان رو حساب میکنه که مقدار requires_grad برابر True باشد شبیه کاری که برای تنسور A و B کردیم.یک تابع درجه 3 به اسم Q تعریف می کنیم  ، حاالا می خوایم گرادیان رو به روش تحلیلی و با استفاده از AutoGrad استفاده کنیم که متوجه بشیم آیا AutoGrad درست کار میکنه یا نه. https://gist.github.com/alikarimi120/c67cfa98ab9ae4d9977e3fce087f88f4 همانطور که می دونید گرادیان Q نسبت به a میشه 9 ضرب در a به توان 2 و گرادیان Q نسبت به b میشه 2b .بردار ورودی رو میدیم و مقایسه می کنیم آیا این دو تا هم با هم مساوی هستن یا نه! و خوب نتیجه True هست. https://gist.github.com/alikarimi120/2a3de4f3efa17551d06c46104ff34d0d ابزار AutoGrad برای محاسبه گرادیان ها از مفهوم گراف محاسباتی استفاده میکنه، در واقع گراف محاسباتی گرافی جهت دار و بدون دور هست که فرآیند رسیدن از ورودی ها به خروجی ها رو نشون میده. تو این گراف جهت دار برگ های گراف تنسورهای ورودی هستند و ریشه ها تنسورهای خروجی هستند و کافی هست که ما از ریشه ها به سمت برگ ها حرکت کنیم تا متوجه بشیم چه مسیری طی شده و با به کارگیری قاعده مشتق زنجیره ای بتونیم گرادیان ها رو بدست بیاریم.یادتون باشه در پایتورچ هر operation ای که استفاده می کنید گرادیانش تعریف شدس. پس در نظر داشته باشید اگه بخواهید operation جدید تعریف کنید باید تابع گرادیانش هم پیاده سازی کنید تا AutoGrad از اون تابع گرادیان استفاده کنه.وقتی در گام فوروارد قرار دارید کاری که AutoGrad انجام میده دو بخش همزمان هست : 1 - در واقع operation هایی که شما تعریف کردید رو محاسبه میکنه و تنسورهای خروجی رو میسازه 2- به صورت همزمان تابع گرادیان هر operation رو هم ذخیره میکنه تا بتونه در گام backward از اونها استفاده کنه.همانطور که گفته شد برای اینکه بتونید گرادیان خروجی رو نسبت به پارامترهای شبکه استفاده کنید باید از تابع backward استفاده کنید ، کافیه تابع backward روی ریشه گراف محاسباتی پیاده سازی کنید.تابع backward که به ازای هر operation استفاده میشه تابع grad_fn هست ، هر operation به ازاش یک تابع grad_fn وجود داره. وقتی grad_fn رو محاسبه می کنید با استفاده از قاعده زنجیره ای گرادیان ها به دست میاد و از بالا به پایین propagate میشه. نکته ای که باید درنظر داشته باشد وقتی backward رو فراخوانی می کنید این مقادیر گرادیان ها در نودها انباشته میشه وقتی دو بار فراخوانی می کنید گرادیان ها که در دو مرحله به دست اومدند با هم جمع میشن. پس اگه می خواید تاریخچه گرادیان ها جمع نشه باید مقادیر گرادیان ها رو قبل از تابع backward صفر کنید..به عنوان مثال یه گراف محاسباتی رو مشاهده کنید:گراف محاسباتینکته ای که در مورد پایتورچ وجود داره، پایتورچ از نظر ساخت گراف محاسباتی یک کتابخانه داینامیک هست، گراف محاسباتی زمانی ساخته میشه که تابع backward رو فراخوانی کنید. بسته به شرایط اجرا میتونه گراف متفاوتی ساخته بشه و به همین دلیل گراف داینامیک یا همان پویا هست.همانطور که گفته شد AutoGrad با backward رو فراخوانی می کنیم برای پارامترهایی گرادیان رو محاسبه میکنه که requires_grad برابر True باشه، اگه نمی خواهید حساب بشه باید False کنید. حالا چرا باید لازم بشه؟در دو حالت می تونیم بگیم امکان حساب نکردن گرادیان یا خارج کردن تنسور از گراف محاسباتی به ما کمک میکنه:1- درنظر بگیرید وقتی یک شبکه چند لایه دارید، از جایی به بعد نمی خواهید بعضی لایه ها به روزرسانی بشن و لایه های خاصی فقط به روز بشن مثلا می دونیم وزن ها در لایه های پایینی همگرا شده و حساب کردن آنها در گراف محاسباتی صرفا سربار محاسباتی هست.2- وقتی شما از شبکه های pretrain استفاده می کنید که اینها رو می تونیم به دو بخش feature extraction و Classification تقسیم می کنیم، گاهی مدل قبلا رو مجموعه داده بزرگی آ»وزش دیده و ما در اینجا feature extraction رو مجددا آموزش نمی دیم و فقط لایه classification رو مجدد آموزش میدیم.مثلا اینجا ما RESnet18 رو استفاده می کنیم، میایم پارامترها رو freeze می کنیم، پارامترهای شبکه با استفاده از تابع model.parameters بدست میاد. https://gist.github.com/alikarimi120/91f054e46af584cf709cac340e6bd017 یک لایه  fully connected هم در ادامه اضافه می کنیم https://gist.github.com/alikarimi120/e54bf2452a448fe888c86afd006da998 دقت داشته باشید ها رو فقط به ازای لایه fully connected محاسبه می کنیم.با توجه به حجم مطالب مورد نیاز نوشته به 4 قسمت تقسیم شده و لطفا برای مطالعه قسمت اول به این لینک و برای مطالعه قسمت سوم به این لینک مراجعه کنید و در نهایت برای مطالعه قسمت پایانی به این لینک مراجعه کنید.</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Wed, 02 Mar 2022 09:48:39 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده سازی اولین شبکه عصبی برای طبقه بندی تصاویر  با استفاده از پایتورچ (قسمت اول)</title>
                <link>https://virgool.io/@alikarimi120/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%B4%D8%A8%DA%A9%D9%87-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B7%D8%A8%D9%82%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-pytorch-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-metqv15wgfu8</link>
                <description>سلام ، تو این نوشتار میخوام به شما آموزش بدم که چطوری اولین شبکه عصبی خودتون رو با استفاده از کتابخانه معروف یادگیری عمیق PyTorch آموزش بدید، این آموزش از 4 قسمت تشکیل شده که از ابتدا با آموزش با نحوه نصب کتابخانه PyTorch شروع میشه و در ادامه به بحث تنسورها می پردازم و بعد وارد بحث گراف های محاسباتی میشم و در نهایت به شما آموزش داده میشه چطور اولین شبکه عصبی خودتون رو پیاده سازی کنید.کتابخانه PyTorchکتابخانه PyTorch از محبوب ترین کتابخانه های حوزه یادگیری عمیق هست که از معماری CUDA برای محاسبه روی کارت های گرافیکی استفاده میکنه.این کتابخانه به دو هدف استفاده میشه : 1- معادل کتابخانه NumPy هست با این تفاوت که میشه محاسبات رو روی GPU و سایر دستگاه های مشابه انجام داد 2 - ابزاری به نام automatic differentiation داره که به ما کمک میکنه شبکه های عصبی رو پیاده سازی کنیمنصب کتابخانه Torch و کتابخانه جانبی TorchVison :برای نصب PyTorch می تونید به صفحه PyTorch مراجعه کنید و با توجه به پیکربندی سیستمون و با توجه به package manager پایتون شما که آیا pip هست یا Conda و آیا می خواهید روی CPU نصب کنید یا روی GPU اجرا کنید ، یک دستورالعمل نصب آماده میکنه که با استفاده از اون کار نصب رو انجام می دید.نحوه انتخاب گزینه های مورد نیاز برای نصب کتابخانه PyTorchسنگ بنای PyTorch تنسور است. در پایتورچ تنسور رو برای ذخیره کردن و بیان کردن ورودی و خروجی های مدل استفاده می کنیم و همینطور وزن ها و پارامترهای مدل رو توی تنسور قرار میدیم. به طور واضح میشه گفت تنسور معادل NumPy array هست با این تفاوت که می تونیم روی GPU قرار بدیم.برای مقدار دهی اولیه تنسور روش های متفاوتی وجود داره:1- ساخت تنسور از رو لیست: https://gist.github.com/alikarimi120/ea04261f6c1933aa13c9b5e6f85981b9 2- ساخت تنسور از روی NumPy array که بسیار پرکاربرد است و در آینده استفاده آن را خواهید دید:شما می تونید از روی تنسور عکس این عمل رو هم انجام بدید و یک NumPy array بسازید. https://gist.github.com/alikarimi120/1d0421818078b70f9e1248af1b578640 3- ساخت تنسور از روی تنسور دیگه هم بسیار پر استفاده هست، نکته ای که وجود داره این هست که علاوه بر اینکه می تونیم مقدار رو از تنسور کپی کنیم، ویژگی ها نظیر نوغ مقادیر داخل تنسور و همینطور ابعاد تنسور رو هم می تونیم کپی کنیم. راه های مختلفی برای این کار وجود داره . برای نمونه درنظر بگیرید ما تنسور x_data را تعریف کردیم می تونیم یک تنسور جدید به نام x_ones با ویژگی های تنسور x_data تعریف کنیم. https://gist.github.com/alikarimi120/3b7f56281cc99639dbb1a6df4e192cb6 4 - برای تعریف تنسور 0 یا 1 یا رندوم می تونیم از shape هم استفاده کنیم و با استفاده از shape دلخواه تنسور رو بسازیم.برای مشخص کردن این موضوع می تونیم از دستور .to استفاده کنیم، با دستور cuda_is_avaliable چک می کنیم که آیا GPU ای روی دستگاه وجود دارد یا خیر و اگر وجود داشت تنسور به روی CUDA منتقل میشه. اگه نه به صورت پیش فرض روی CPU باقی بماند. https://gist.github.com/alikarimi120/f3a75973c6c3bcf31aae91af0b17061d نکته بعدی این هست که ما در بحث NumPy مفهوم Slicing داشتیم اینجا هم همچین قابلیتی به طور کامل برقرار است. پیشنهاد میکنم اگه با بحث slicing آشنایی ندارید این مطلب رو بخونید. https://gist.github.com/alikarimi120/90bf04391e17f6d731586abb8e951bbd دو دستور پر کاربرد برای ترکیب دو تنسور وجود داره ، دستور torch.cat دو یا چند تنسور رو به هم متصل میکنه. اینجا سه نسخه از تنسور 4 در 4 رو به هم چسباندیم، چسباندن می تواند روی سطرها یا ستون ها انجام شود و با استفاده از آرگومان dim می توانیم این موضوع را کنترل کنیم. https://gist.github.com/alikarimi120/a023d183881082f72418e437ca839f17 به جز cat دستور Stack هم وجود داره که شبیه cat هست ولی یک بعد جدیدی ایجاد میکنه، مثلا وقتی تنسورهای 4 در 4 رو برای چسباندن استفاده می کنیم یک بعد سوم جدیدی ساخته میشه و یک تنسور 3 در 4 در 4 خواهیم داشت. https://gist.github.com/alikarimi120/264b92f212a67f279e109594ee597781 عملیات های مختلفی نظیر ضرب مولفه به مولفه رو می تونید روی تنسورها انجام بدید. تنسورها با ابعاد یکسان رو به صورت مولفه ای می تونید ضرب کنید که برای این کار از تابع mul می تونید استفاده کنید یا اگر از * استفاده کنیم هم فرآیند ضرب مولفه ای انجام میشه. دقت کنید اینجا ستاره برای ضرب مولفه به مولفه است نه ضرب ماتریسی! https://gist.github.com/alikarimi120/264b92f212a67f279e109594ee597781 برای ضرب ماتریسی از تابع matmul استفاده کنید، میشه از اپراتور @ هم استفاده کرد و ضرب ماتریسی رو انجام داد. https://gist.github.com/alikarimi120/23309f118e095199db252649569dc2ce فرآیندهای In-Place در پایتورچ حائز اهمیت هست. در چنین شرایطی ماتریس جدیدی ایجاد نمیشه معمولا این توابع آخر اسمشون یک Underline دارن. مثلا add_ ، در چنین تابعی عملیات روی همان ماتریس انجام میشه و ماتریس جدیدی ایجاد نمیشه! به عبارتی عملیات In-place انجام  میشه  و حافظه کمتری انجام میشه چون ماتریس جدیدی ایجاد میشه. اما توصیه میکنم از این عملیات استفاده نکنید چون معمولا تو Automatic differentiation به مشکل می خورید! https://gist.github.com/alikarimi120/2e75b0437956f328051b987d53def589 سه ویژگی مهم تنسورها : نوع، ابعاد و اینکه تنسور روی چه دستگاهی اجرا می شود، منظور این هست که قرار هست روی CPU اجرا بشود یا قرار است روی GPU اجرا شود.با توجه به حجم مطالب مورد نیاز نوشته به 4 قسمت تقسیم شده و لطفا برای مطالعه قسمت دوم به این لینک و برای مطالعه قسمت سوم به این لینک مراجعه کنید و در نهایت برای مطالعه قسمت پایانی به این لینک مراجعه کنید.</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Wed, 02 Mar 2022 08:58:03 +0330</pubDate>
            </item>
                    <item>
                <title>پیش نیازهای یادگیری عمیق (قسمت سوم)</title>
                <link>https://virgool.io/@alikarimi120/%D9%BE%DB%8C%D8%B4-%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7%DB%8C-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B9%D9%85%DB%8C%D9%82-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-t0c6qmeow1xo</link>
                <description>سلام :) امیدوارم تا این قسمت خسته نشده باشین، در ادامه مطالب قسمت اول و دوم ، در قسمت سوم به معرفی توابع و کلاس ها و دو کتابخانه پایتون معروف مورد استفاده در یادگیری عمیق می پردازیم. توابع :برای تعریف تابع از کلمه کلیدی def استفاده می کنیم، کلمه کلیدی def قبل از اسم تابعمون قرار می گیره، آرگومان ورودی رو داخل پرانتز تعریف می کنیمنکته جالب توجه در پایتون اینه وقتی که تابع تعریف می کنید شبیه زبان برنامه نوسی C++ از {} استفاده نمی کنید و از tab  استفاده می کنید. https://gist.github.com/alikarimi120/3c4fc910957c3ffcde0ce941e5830646 هنگام استفاده تنها کافی است نام تابع را بنویسید و آرگومان های تابع رو داخل پرانتز بنویسید. https://gist.github.com/alikarimi120/a934884bec962fdadfb99d4373345023 جالبه بدونید که می تونید تابع رو پرینت کنید که در چنین شرایطی پایتون آدرس تابع رو برای شما پرینت میکنه. https://gist.github.com/alikarimi120/305876ede64bc6dbd1bde670326be8a2 برای پاس کردن یک آرگومان به تابع درنظر داشته باشید، مقادیر آرگومان یک تابع می تونن مقادیر پیش فرض داشته باشن و بدون تعیین مقادیر آرگومان ازش استفاده کنید. اگه آرگومان رو تعیین نکنید از مقادیر پیش فرض استفاده میشه و در غیر این صورت می تونید مقادیر رو خودتون هم تعریف کنید. https://gist.github.com/alikarimi120/df942b4800c5db69b8d67cb8c5226af1 این چند تا نکته رو در نظر داشته باشید:1 - می تونستیم آرگومان hi رو نذاریم و یک اشتباه رخ میداد پس چه کار کنیم؟ می تونیم اسم آرگومان ها رو بنویسیم و به راحتی و بدون مشکل ارسال  کنیم ، حتی می تونیم ترتیب رو جا به جا کنیم و خیالمون از این بابت راحته.2 - فرض کنید یکی از آرگومان ها مقدار پیش فرض داره و آرگومان دیگه مقدار پیش فرض نداره! در نظربگیرید جای دو تا آرگومان رو عوض می کنید، اینجا در واقع پایتون یک خطا به ما برمیگردونه از نوع Syntax error ! کلاس ها :شما در پایتون هم می تونید از شی گرایی بهره ببرید، برای هر کلاس می تونیم یک سری تابع، متغیر و ... تعریف کنید.مثلا اینجا کلاس Greeter تعریف شده و تابع hello_bye هم براش تعریف شده. https://gist.github.com/alikarimi120/8b96089159a18df050e9652ca0cc59c5 توابع داخل کلاس به دو دسته تقسیم میشن:1 - توابع instance : که از طریق object ها فراخوانی میشن. یک پارامتر self هم همون اول دارن.2 - توابع سطح کلاس : با استفاده از اسم کلاس میشه این توابع رو فراخوانی کرد.نمونه ها رو در کد بالا می بینید. می بینید که نمی تونیم greeter.hello_bye رو نمی تونیم چون تابع instance هست فراخوانی کنیم و خطا دریافت می کنیم.برای یک کلاس در پایتون یک سی توابع پیش فرض آماده داریم که با __ شروع و با __ هم به پایان میرسن که اینها توابع پیش فرض پایتون برای کلاس ها هستن . به اینها میگن داندرها و یکی از پر استفاده ترینهاش init هست که وقتی یک آبجکت از کلاس ساخته میشه فراخوانی میشه. مثلا در کد زیر یک آرگومان Name هم ارسال شده که در تابع init استفاده شده ، پس تا الان متوجه شدید آرگومان های کلاس رو از طریق تابع init می تونیم مشخص کنیم.کتابخانه ها :این قسمت دو کتابخانه معروف Numpy و Matplotlib رو معرفی میکنم.1 - NumPy:هدف این کتابخانه اینه که تمام قابلیت هایی که در متلب برای محاسبات برداری و ماتریس داریم رو برای ما فراهم کنه و حسابی به ما در محاسبات جبرخطی کمک میکنه.برای نصبش می تونید از دستور زیر استفاده کنید. https://gist.github.com/alikarimi120/cbf47806572654a87eea0509b833081d با دستور زیر هم می تونید داخل کد خودتون import اش کنید. چرا حالا از as np نوشتیم؟ معمولا به خاطر طولانی بودن اسم کتابخانه ها از این دستور استفاده میکنن تا اسامی کتابخونه ها خلاصه تر بشه . معمولا NumPyرا با استفاده از np می نویسن. https://gist.github.com/alikarimi120/f52969bf8211d3e282d5636761fe1d44 معروف ترین ساختار داده NumPy array ها هستند که تا حدی شبیه لیست هستند ولی تفاوت هایی دادرند. مثلا همه اعضا نوعشون مثل هم هست و نمی تونن شبیه لیست متغیرهایی از نوع متفاوت باشند. https://gist.github.com/alikarimi120/28a417e3e8de815a9474b7ebefd469d9 برای تعریف NumPy array می تونیم یک لیست رو به NumPy array پاس بدیم ، تابع لیست رو دریافت میکنه و در خروجی یک NumPy array برگردونه میشه! https://gist.github.com/alikarimi120/a82275d5a80beadfc6ae64c43d15cb2c شبیه تابع Len هم shape در NumPy array هست که یه مقدار Tuple به ما برمیگردونه که با استفاده از اندیس می تونیم بهش دسترسی داشته باشیم. از طریق اندیس ها می تونیم مقدار NumPy array رو تغیییر بدیم. تابع ndim هم تعداد ابعاد آرایه رو برمیگردونه.نحوه دسترسی در یک لیست تو در تو و تفاوت اون رو با NumPy array در کد زیر مشاهده می کنید: https://gist.github.com/alikarimi120/d1d99a7986db0224b0500f47686681d0 2- Matplotlib:کتابخانه پر استفاده ای در پایتون برای رسم نمودارها هست. حسابی در یادگیری عمیق ازش استفاده می کنید! https://gist.github.com/alikarimi120/7e2ea69486d0cb3725965372f095d10c دستور زیر هم برای این هست که در نوتبوک مورد استفاده هر چیزی که بخواهیم plot کنیم داخل همون صفحه plot کنه و پنجره جدیدی باز نشه! https://gist.github.com/alikarimi120/273f70cbda98f77f9ff475eee8498ade اینجا متغیر x رو با Np.arrange تعریف می کنیم که کاربردی شبیه range در لیست داره. میگه از 0 تا 3p با فاصله یک دهم یک Numpy array بساز و Y هم مقدار SinX میشه و بعد این نمودار رو رسم می کنیم. https://gist.github.com/alikarimi120/322b5449e4310ad2d9caa890b1b78dab نمودار رسم شدهامیدوارم مطالعه این منبع براتون مفید بوده باشه، اگه قصد داشتید از اول این مقاله رو مطالعه کنید قسمت اول رو از طریق این لینک و قسمت دوم رو از طریق این لینک می تونید مطالعه کنی</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Tue, 01 Mar 2022 13:44:19 +0330</pubDate>
            </item>
                    <item>
                <title>پیش نیازهای یادگیری عمیق (قسمت دوم)</title>
                <link>https://virgool.io/@alikarimi120/%D9%BE%DB%8C%D8%B4-%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7%DB%8C-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B9%D9%85%DB%8C%D9%82-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-yyks4yrvstem</link>
                <description>سلام :)در ادامه مطالب قسمت اول، در این قسمت داده ساختارها رو در پایتون بررسی می کنیم.داده ساختارها در پایتون :ساختار داده های اصلی در زبان پایتون شامل لیست ها ، دیکشنری ها ، مجموعه ها و زوج مرتب ها هستند.1 - لیست:لیست در زبان پایتون مانند یک آرایه است با این تفاوت که اندازه آن ثابت نیست و می تواند تغییر کند و به عبارتی یک آرایه پویا است.ابتدا لیست را تعریف می کنیم و سپس از آن استفاده می کنیم. خانه اول در لیست برابر صفر است و خانه n ام در لیست برابر با n-1 است. همچنین می توانیم از اندیس های منفی استفاده کنیم که لیست را  از انتها به ابتدا پیمایش می کند. https://gist.github.com/alikarimi120/355847747bca2f77345a65c1c24e220a لیست ها در پایتون یک نوع pointer هستند، به طور مثال در کد زیر هنگامی که ys=xs را نوشتیم دو لیست متفاوت ساخته نمی شود و لیست کپی نمی شود و اگه شما xs را تغییر  بدید می بینید که مقادیر لیست ys هم تغییر می کند. https://gist.github.com/alikarimi120/a8ece51c20b4e9844a75791e454d4be8 اگر خواستید یک لیست مشخص بسازید و به معنای واقعی داده کپی بشود می توانید از تابع copy استفاده کنید.اگر می خواهیم ببینیم دو متغیر یکی هستند از دستور is استفاده می کنیم. https://gist.github.com/alikarimi120/19f51dcb28274bb8a8263a4e86f7d528 یکی از توابع لیست تابع append است ، هنگامی که می خواهیم یک عضو به لیست اضافه کنیم از تابع append اضافه می کنیم و مقدار ورودی به انتهای لیست اضافه می شود و هنگامی که از تابع pop استفاده می کنیم آخرین عضو از لیست برداشته می شود. https://gist.github.com/alikarimi120/add557217b4fa1f036f7376612e5526a  https://gist.github.com/alikarimi120/e788f05346158fe860d2c9f089d484c2 یک تابع دیگر که خیلی پر استفاده هست بحث چسباندن دو لیست به یکدیگر است که با عملگر + انجام می شود. https://gist.github.com/alikarimi120/07d60de28c2c470eac600462d97fc528 می توانید در لیست های پایتون به بازه ای از یک لیست دسترسی داشته باشید، هنگامی که می خواهید به بازه ای از لیست دسترسی داشته باشید همانند کد زیر اندیس های مدنظرتون رو تعیین می کنید، به طور مثال در کد زیر اندیس های بین 2 تا 4 به ما برگردونه میشن، دقت داشته باشید که خود 4 برنمی گرده!هنگامی که عددی در یکی از طرفین قرار ندید از اول یا ابتدای لیست بازه خوانده می شود.اگر می خواهید فقط چند تا اندیس آخر داشته باشید از اندیس های منفی می توانید استفاده کنید. https://gist.github.com/alikarimi120/99a5f7b5a1c5a3dc5cebeae4d7578b27 از همین شیوه علاوه بر نمایش متغیرها برای جایگزینی مقادیر اندیس ها هم می تونید استفاده کنید. این کار صرفا برای خوندن نیست! می تونید همزمان مقادیر چند اندیس را تغییر بدهید. https://gist.github.com/alikarimi120/890d70cb4c76d4f018a55f9c4bcbce51 روی لیست می تونیم حلقه هم تعریف کنیم ، فرض کنید لیست زیر رو داریم ، می توانیم به راحتی با استفاده از دستور for و بدون تعیین اندازه لیست آن را در یک حلقه فراخوانی کنیم. https://gist.github.com/alikarimi120/93166175634c6a3bae17a45d18b12d3a اگه خواستید علاوه بر مقدار ، به اندیس مقداری که می خوانید دسترسی داشته باشید از تابع enumerate استفاده کنید تا علاوه بر مقدار اندیس، شماره اندیس رو هم داشته باشید. https://gist.github.com/alikarimi120/28b989fb6f290fb1252d0c161d43a0b4 علاوه بر for می تونید از تابع range هم استفاده کنید.با استفاده از این کار لزوما تمام خانه ها خوانده نمی شود و رنجی از اندیس ها خوانده میشه. می تونید تعیین کنید هر چند اندیس یکبار خوانده شود. به طور مثال در کد زیر هر 2 خانه یک بار خوانده می شود. https://gist.github.com/alikarimi120/4727708215ac7a39b73036d0334be97c بحث list comprehensions یکی از قابلیت های خیلی مفید در لیست های پایتون هست، این قابلیت کمک میکنه تغییرات رو خیلی سریع روی لیست انجام بدیم. وقتی احتیاج داریم یک لیست را به لیست دیگه تبدیل کنیم.به طور مثال در کد زیر لیست رو به توان 2 می رسونیم و لیست جدید به توان 2 رسونده میشه. https://gist.github.com/alikarimi120/516518c2c830499f9045990d3dd7ddd0 3 - دیکشنری:ساختار داده ای هست که اعضای آن یک زوج کلید و مقدار است. در کد زیر یک دیکشنری به اسم D تعریف شده است که اعضا با استفاده از &quot;,&quot; جدا شده و زوج ها با استفاده از &quot;:&quot; مشخص شده اند. https://gist.github.com/alikarimi120/578d4244cbc0c786cc36e19b92cdc145 می تونید از طریق کلید به اعضای یک دیکشنری دسترسی داشته باشید. https://gist.github.com/alikarimi120/731e1970cf9bc0c2958e9ee60196e050 می تونید بررسی کنید که آیا دیکشنری کلید مدنظر شما را دارد یا ندارد. اگر وجود داشته باشد مقدار True برگردانده می شود و در غیر این صورت مقدار False برگردانده می شود.برای دیکشنری هم comprehensions  داریم . به طور مثال می خواهیم یک دیکشنری بسازیم که کلیدها 1 تا 4 هستند و مقادیر به توان 2 رسیده این اعداد باشند. می توانیم از کد زیر استفاده کنیم: https://gist.github.com/alikarimi120/fb5549f81657296ae7e747fbd9e7e6d7 3 - زوج مرتب:زوج مرتب یا Tuples به شکل زیر تعریف می شود و از طریق اندیس قابل دسترسی است. https://gist.github.com/alikarimi120/bbd743afba1f8f36eb7f9a4490f24611 نکته مهم در زوج مرتب این هست که زوج مرتب ها غیرقابل تغییر هستند! وقتی یک زوج مرتب تعریف می کنید دیگه نمی تونید مقادیر اون رو تغییر بدید. https://gist.github.com/alikarimi120/37cef9b079154c5f53c90bf1f7611c33 اگه خواستیم زوج مرتبی با یک المان داشته باشیم پرانتز باز و بسته خالی فایده نداره!  شبیه کد زیر که int تشخیص داده شده، باید یک کاما قبل از 2 حتما بذارید! https://gist.github.com/alikarimi120/17db846539e74b2046fb3b9bc73c144d 4 - مجموعه :مجموعه ها در پایتون دقیقا همان تعریف ریاضی رو دارند، مجموعه ای از اعضا که هیچ ترتیبی هم بینشون وجود نداره، می تونید چک کنید fish یا cat داخل مجموعه وجود داره ولی اندیس خاصی ندارن! https://gist.github.com/alikarimi120/08a2cc8e2a55ea9b16a854500316c919 با توجه به حجم مطالب مورد نیاز نوشته به 3 قسمت تقسیم شده و لطفا برای مطالعه قسمت اول به این لینک و برای مطالعه قسمت سوم به این لینک مراجعه کنید.</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Tue, 01 Mar 2022 13:43:51 +0330</pubDate>
            </item>
                    <item>
                <title>پیش نیازهای یادگیری عمیق (قسمت اول)</title>
                <link>https://virgool.io/@alikarimi120/%D9%BE%DB%8C%D8%B4-%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7%DB%8C-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B9%D9%85%DB%8C%D9%82-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-jcm9jgfrsjox</link>
                <description>سلام، تو این نوشتار قصد دارم پیش نیازهایی از پایتون که برای بحث یادگیری عمیق مورد نیاز هست رو توضیح بدم، به طور کلی زبان برنامه نویسی پایتون یک زبان سطح بالا است که در زمینه و کاربردهای مختلفی مورد استفاده قرار می گیره، یکی از این زمینه ها بحث یادگیری ماشین و به طور خاص یادگیری عمیق است. این زبان سطح بالا نسبت به سایر زبان های برنامه نویسی به الگوریتم نزدیک تر است و برنامه نویسی راحت تری رو تجربه خواهید کرد. کدهای پایتون را می توانید در ترمینال پیاده سازی کنید یا می توانید در یک فایل با فرمت py بنویسید و اجرا کنید و یا از نوتبوک هایی نظیر ژوپیتر استفاده کنید.در حال حاضر پایتون 3 نسخه رایج پایتون هست و نسخه 2 تا حدی از دور خارج شده است.3 نوع داده پایه در زبان برنامه نویسی پایتون داریم:1 - اعداد2 - دودویی ها3 - رشته ها1 - اعداد:اعداد می توانند int یا float باشند، تعیین نوع در زبان برنامه نویسی پایتون به طور اتوماتیک انجام می شود و نوع متغیر به صورت اتوماتیک تعیین می شود. این بر خلاف زبان های برنامه نویسی نظیر C است که باید نوع متغیر را هم تعیین کنید.  https://gist.github.com/alikarimi120/3401ea24f07273a8a09eacfac019466c  https://gist.github.com/alikarimi120/33f77ae28291330505515983b4a57511 2 - دودویی ها :از کلمات کلیدی True و False استفاده می کنیم، همانطور که مشاهده می کنید هنگامی که تابع type را فراخوانی می کنیم مقدار آن bool هست. https://gist.github.com/alikarimi120/03739b1748fe7632b50f6b1b72a32b19 روی دودویی ها می تونید عملگرهای منطقی رو پیاده سازی کنید. https://gist.github.com/alikarimi120/f45b3e2cff9b5aa5364e9a87762af9f7 3 - رشته ها :در پایتون رشته ها رو می تونید هم با &quot; و هم با &#x27; تعریف کنید ، یکی از توابع پرکاربرد در رشته ها تابع len هست که طول رشته یا تعداد کاراکترهای یک رشته رو برمیگردونه. https://gist.github.com/alikarimi120/0b3c51ee7bea68cbceee222c16a804db همچنین شما می تونید رشته ها رو با عملگرد + به یکدیگر بچسبانید. https://gist.github.com/alikarimi120/e287f620f000170e0e01173c471236ff بحث Format string ها هم در رشته ها مطرح هست. می تونیم از s% و d% برای جایگزینی متغیرها استفاده کنیم. راه دیگر استفاده از کلمه کلیدی format است. مانند کد زیر بعد از کلمه کلیدی format متغیرها رو می نویسیم و داخل رشته از پرانتز استفاده می کنیم. https://gist.github.com/alikarimi120/16ef98ecab7100af0597a766913fefb4 تابع dir هنگامی که بر روی متغیری فراخوانی می شود بستگی به کلاسی که متغیری دارد، توابعی که برای آن متغیر می توانیم استفاده کنیم لیست می شود . مثلا برای متغیر String کد زیر تابع upper را داریم که کاراکترهای string ما را به حالت upper case در می آورد. https://gist.github.com/alikarimi120/e92e08bf1ec021cc6a677e6b0898accd وقتی می خواهیم تابع ها را بررسی کنیم و ورودی و خروجی های آن ها را متوجه بشویم از تابع help استفاده می کنیم. https://gist.github.com/alikarimi120/ee4d745aa2f769f1b89a8d4bee513849 با توجه به حجم مطالب مورد نیاز نوشته به 3 قسمت تقسیم شده و لطفا برای مطالعه قسمت دوم به این لینک و برای مطالعه قسمت سوم به این لینک مراجعه کنید.</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Tue, 01 Mar 2022 12:48:35 +0330</pubDate>
            </item>
                    <item>
                <title>کاهش فضای ویژگی</title>
                <link>https://dataio.ir/کاهش-فضای-ویژگی-jjdowmkralf6</link>
                <description>هدف در این نوشتار آموزش روش هایی است که به کمک آنها مولفه یا ویژگی های اصلی را در موضوع مورد نظر کشف کنیم و به جای اینکه تمام ویژگی ها یا مولفه های آن را مورد بررسی قرار بدهیم ، تنها ویژگی یا مولفه هایی را مورد بررسی قرار بدهیم که ارزش بیشتری نسبت به بقیه دارند. به طور مثال وقتی برای خرید خانه به یک آژانس املاک مراجعه می کنید ویژگی هایی مانند متراژ ، تعداد اتاق ، پارکینگ و ... ارزش بالایی دارند و در تعیین قیمت نهایی بسیار موثر هستند! اما مثلا اینکه آیا فروشنده برای شما در اتاق هایتان قبل از تحویل چراغ نصب می کند یا خیر ، موضوع اثرگذاری بر روی قیمت نهایی نیست یا حداقل تاثیر خیلی کمتری نسبت به موارد دیگر دارد.هدف در این بخش نیز کاهش ویژگی هاس به نحوی که ویژگی های بی ارزش حذف بشوند یا ویژگی هایی که از ویژگی های دیگر نیز می توانیم بدست بیاوریم نیز حذف بشود.در این راستا روش های مختلفی تاکنون ارائه شده است که در اینجا 3 روش را بررسی می کنیم. 1 - Auto-Encoder :این روش که مبتنی بر شبکه عصبی کار می کند ، به این شکل عمل می کند که ابتدا یک شبکه Auto-Encoder را با استفاده از مجموعه داده ای که می خواهیم روی آن کاهش دهیم آموزش می دهیم و سپس قسمت Encoder آن را جدا می کنیم و به عنوان یک شبکه کاهش دهنده ابعاد قبل از مدل اصلی استفاده می کنیم.معماری Auto-Encoder به این صورت است که تعداد نورون ورودی و خروجی آن برابر با تعداد ویژگی های تصویر یا داده ورودی است ، در لایه میانی Auto-Encoder لایه ای وجود دارد که قسمت Encoder و Decoder را متمایز می کند ، اگر تعداد ویژگی داده های ورودی را برابر با N در نظر بگیریم ، تعداد ویژگی داده های خروجی نیز برابر N می شود و اگر R تا از این ویژگی ها کاهش یابند ، تعداد نورون لایه میانی برابر با N - R خواهد بود!به طور کلی در بخش Encoder ابعاد کاهش و در بخش Decoder ابعاد افزایش پیدا می کند. برای آموزش شبکه به این صورت عمل می شود که داده ها به ورودی Auto-Encoder داده می شوند و انتظار می رود در خروجی Auto-Encoder همان داده ها دیده شود ، چندین Epoch این کار برای همه داده ها تکرار می شود تا زمانی که تا حد ممکن نتایج خروجی برابر با ورودی ها شود!Auto-Encoderدر نهایت پس از پایان آموزش Auto-Encoder ، قسمت Encoder جدا می شود و قبل از شبکه اصلی برای کاهش بعد داده های ورودی استفاده می شود! Encoderهمانطور که توضیح داده شد Auto-Encoder از دو بخش تشکیل شده است در قطعه کد زیر نیز به همین شکل طراحی را انجام دادیم ، نکته قابل ذکر این است که در اینجا از هیچ لایه ای بین داده های ورودی و لایه با کوچکترین ابعاد استفاده نشده است که این مسئله دقت شبکه را ممکن است کاهش بدهد ، شما می توانید تعداد لایه های بیشتری به Auto-Encoder اضافه کنید و همچنین تعداد Epoch ها را افزایش دهید تا شبکه بهتر اموزش ببیند.در نهایت قسمت Encoder را جدا کنید و قبل از مدل اصلی اجرا کنید(نمونه کد مدل اصلی در انتهای این نوشتار آمده است) https://gist.github.com/alikarimi120/08af1b2491b7ece3d76b42d624861b18 2 - PCAآنالیز مولفه اصلی (Principal Component Analysis) یا به اختصار PCA بر خلاف مدل Auto-Encoder پیاده سازی شده مبتنی بر شبکه عصبی نیست و از مفاهیم ریاضی استفاده می کند.تحلیل مؤلفه‌های اصلی در تعریف ریاضی یک تبدیل خطی متعامد است که داده را به دستگاه مختصات جدید می‌برد به‌طوری‌که بزرگترین واریانس داده بر روی اولین محور مختصات، دومین بزرگترین واریانس بر روی دومین محور مختصات قرار می‌گیرد و همین‌طور برای بقیه. تحلیل مؤلفه‌های اصلی می‌تواند برای کاهش ابعاد داده مورد استفاده قرار بگیرد، به این ترتیب مؤلفه‌هایی از مجموعه داده را که بیشترین تأثیر در واریانس را دارند حفظ می‌کند.PCAبرای استفاده از PCA می توانید به راحتی از کتابخانه Scikit-learn  مطابق کد زیر استفاده کنید و فقط کافی است تعداد ابعادی که می خواهید توسط این ماژول کاهش یابد را مشخص کنید ، دقت کنید بعد از کاهش ابعاد داده های آموزشی حتما داده های تست را نیز کاهش دهید! https://gist.github.com/alikarimi120/54460950485c64dfad99af42465a168b 3 - Cascaded RBMs :مانند Auto-Encoder ، در این روش نیز از شبکه عصبی برای کاهش بعد استفاده می شود ، RBM از دو لایه قابل مشاهده (Visible) و مخفی (hidden) تشکیل شده است. RBMاین شبکه تنها از یک لایه نورونی برای کاهش بعد استفاده می کند (مانند شکل بالا ) ، همانطور که می بینید در این شبکه تعداد نورون از x به a کاهش پیدا کرده است که به این معنی است که تعداد ابعاد ورودی از x به a کاهش پیدا می کندو شاهد x - a کاهش بعد هستیم ، در شکل بالا شبکه در حال انجام Encoding است ، اگر همین را برعکس طی کنیم دقیقا Decoding انجام می شود!حالا اگر تعدادی RBM را پشت سر هم قرار دهیم تا از تعداد زیادی از آنها برای کاهش بعد استفاده کنیم Cascaded RBMs ایجاد کردیم.  و در نهایت خروجی نهایی این Cascaded RBMs  مقادیر ابعاد جدید ما پس از کاهش ابعاد است.Cascaded RBMsحال برای پیاده سازی RBM می توانیم از ماژول BernoulliRBM از کتابخانه sklearn استفاده کنیم ، دقت کنید با توجه به اینکه می خواهیم Cascaded باشد باید از تعدادی RBM پشت سر هم استفاده کنیم!پس چند مرتبه باید کاهش ابعاد را در کد اعمال کنیم ، به طور مثال اگر از تصاویر MNIST استفاده می کنیم و ابعاد ما 784 هستند ، ابتدا آن را به 600 سپس 400 و سپس 200 و ....کاهش دهیم.در کد زیر نیز همین روش برای دو لایه پیش گرفته شده است. https://gist.github.com/alikarimi120/818187563b7814f4d765bf23c84a2991 تغییرات در مدل اصلی :تمام روش هایی که گفته شد به این صورت استفاده می شوند که داده های ورودی توسط آنها از M به N بعد ، کاهش بعد داده می شوند و سپس به شبکه ای با ورودی N بعدی داده می شود!دقت کنید به طور مثال اگر توسط یکی از روش های بالا داده های MNIST را از 784 بعد به 200 بعد کاهش بدهیم ، سایز ورودی شبکه عصبی (طبقه بند ما ) به 200 بعد کاهش پیدا می کند. و همچنین کد پیاده سازی قسمت های مربوط به شبکه عصبی نیازی به تغییر ندارند https://gist.github.com/alikarimi120/2c02bb37cf7b0572f19bd374a2a4f554 </description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Wed, 01 Apr 2020 06:20:43 +0430</pubDate>
            </item>
                    <item>
                <title>پیاده سازی اولین شبکه عصبی برای طبقه بندی تصاویر (قسمت دوم)</title>
                <link>https://dataio.ir/پیاده-سازی-اولین-شبکه-عصبی-برای-طبقه-بندی-تصاویر-قسمت-دوم-jzovmzv6z8la</link>
                <description>در قسمت اول این آموزش یک شبکه عصبی برای طبقه بندی تصاویر را به صورت کامل پیاده سازی کردیم ، همچنین در قسمت قبل برخی از توابع و پارامترها و دلیل استفاده آنها توضیح داده نشد که در این قسمت توضیح داده خواهند شد.1 - توابع فعالساز :حدود 6 تابع فعالساز خیلی معروف برای لایه ها داریم که در تصویر زیر هم مشخص شدن که در اینجا 3 لایه  رو به صورت مختصر بررسی می کنیم!1 - تابع فعالساز Sigmoid :نمودار تابع فعالساز Sigmoidهمانطور که در شکل بالا مشاهده میشود، این تابع غیرخطی، یکنواخت، پیوسته و مشتق پذیر است. این تابع خروجی آنالوگ تولید میکند و شیب نرمی دارد، از همین رو این تابع برای استفاده در مسائل طبقه بندی کاربرد دارد. این تابع به مقادیر بسیار کم یا بسیار زیادی ورودی واکنش درخوری نشان نمیدهد و شیب را از بین میبرد که به این مساله  vanishing gradientنیز گفته می شود. به همین دلیل این تابع همگرایی کندی دارد.2 - تابع فعالساز Tanh :نمودار تابع فعالساز Tanhاین تابع نیز مانند تایع  sigmoid با مسئله ی  vanishing gradientمواجه است اما این مسئله در tanh وضعیت بهتری دارد به دلیل شیب های تندتر مشتقات آن و همچنین خروجی های این تابع مرکزیت 0 دارند که باعث می شود برای مدل هایی که ورودیها مقادیر مثبت یا منفی شدیدی دارند، مناسب تر باشد.این تابع و مشتقاتش هردو یکنواخت هستند. تصمیم برای انتخاب بین  sigmoid و  tanh به میزان قوی بودن شیب در تابع بسته به مسئله ی پیش روی ما بستگی دارد. این تابع هم مانند  sigmoidدر طبقه بندی و لایه ی آخر کاربرد دارد.3 - تابع فعالساز ReLU :نمودار تابع فعالساز ReLUاین تابع همانطور که در تصویر بالا مشخص است ، برای داده های منفی ، عدد صفر رو به عنوان خروجی میده ( به عبارتی از نورون عبور نمی کنند) و برای داده های مثبت دقیقا خود عدد رو عبور میده!چند ویژگی مثبت نسبت به توابع قبلی :این تابع با مسئله ی  vanishing gradientبه خوبی مواجه میشود و آن را حل کرده است. همچنین  Reluهزینه ی محاسبات کمتری دارد زیرا از روابط ریاضی ساده تری نسبت به  sigmoidو tanh پیروی می کند.2 - نرخ یادگیری :برای  Learning Rate یا همان نرخ یادگیری مقدار به مسئله وابسته است ولی اگه مقدار آن را کم کنیم سرعت کاهش خطا کند می شود و همینطور امکان تصادفی بودن کمتر می شود و ممکن است در نقاط بهینه محلی گیر کنیم ولی با انتخاب مقادیر بالا نتایج نوسانی میشه و ممکنه از کنار جواب مناسب به خاطر گام های بلند بپریم! به طور کلی این مقدار نرخ یادگیری بسته به مسئله انتخاب می شود و می تواند تاثیرات متفاوتی بذاردنمونه ای از تاثیر نرخ های متفاوت یادگیری را در تصویر زیر مشاهده می کنید ، می بینید که با نرخ یادگیری کم ، پاسخ خیلی کند بهبود پیدا می کند، نرخ یادگیری خیلی بالا نیز بعد شروع خوب ، شدیدا افت می کند ، پس مقدار نرخ یادگیری ما باید نرخ معقولی باشد تا مسیر یادگیری شبکه به خوبی طی بشود.مقایسه نرخ های یادگیری 3 - تابع هزینه :خوب حالا راجع به تابع هزینه صحبت می کنیم ، خیلی خلاصه در مورد کاربرد تابع هزینه بخوام بگم ، تابع هزینه تفاوت نتیجه واقعی و نتیجه پیش بینی شده شما را مشخص می کند و با استفاده از این تابع هزینه مقادیر وزن های شما به روز رسانی می شود و شبکه را به سمت جواب های بهتر سوق می دهد.یکی از رایج ترین تابع های هزینه Cross Entropy هست که اینجا توضیح میدم :ما وقتی می خواهیم آنتروپی یک سری نمونه و بیت های متناظر آن را به حداکثر برسانیم ، احتمال آماری آن نماد را در لگاریتم ضرب می کنیم تا تعداد بیت های بهینه آن را بدست بیاریم ، حالا در این تابع به جای لگاریتم ، مقدار نتیجه گرفته شده از شبکه عصبی را در آن ضرب می کنیم ، اگر مقدار درستی نباشد باعث بالا رفتن مقدار  Cross Entropyمی شود و ما متوجه خطای شبکه می شویم ، همچنین هر چقدر این اختلاف بین مقدار ارائه شده توسط شبکه عصبی و مقدار واقعی بیشتر باشد ، شبکه به صورت لگاریتمی رشد می کند ، یعنی برای مقادیر کوچک ، کوچکتر و برای مقادیر بزرگ بزرگ تر می شود و خطا مشخص می شود.این تابع حتی در حالتی که مشتق گره ها نزدیک به صفر است نیز تاثیر خطا در وزن ها ایجاد می کند. به طور کلی این تابع مانند اسمش یعنی آنتروپی عمل می کند. این تابع برای ارزیابی شبکه هایی که گره های پایانی آن به مفهوم یا دسته خاصی اشاره دارند و فایر شدن یک گره به منزله احتمال صحت آن مفهوم یا دسته است ، می تواند انتخاب مناسبی باشد4 - بهینه سازها :خوب در ادامه آخرین آرگومانی که در تابع compile در قسمت اول استفاده کردیم و تاکنون توضیح داده نشده رو توضیح میدم : بهینه سازها !وقتی از توابع هزینه استفاده می کنیم و بعد میخوایم وزن های شبکه رو به روز کنیم این بهینه سازها نقش خودشون رو ایفا میکنن! حالا چرا بهینه سازها فرق میکنن؟ چرا چند تا بهینه ساز داریم؟ مگه همه با استفاده از تابع هزینه و یک Backpropagation به روز رسانی نمیشن؟خوب حقیقت اینه که اولین روش های به روز رسانی وزن ها مشکلات متعددی داشت ، از گیر کردن داخل نقاط بهینه محلی تا نقاط زین اسبی و ... ، برای همین روش های بهینه ساز متعددی در اصلاح روش های قبلی معرفی شد که اینجا چند تا از پایه ای ترین هاش رو معرفی می کنم :اولین بهینه سازی که معرفی میکنم بهینه ساز SGD یا همان Stochastic Gradient Descent هست که داخل قطعه کد قسمت اول هم در پیاده سازی مدل استفاده کردم ، این روش به این شکل کار می کند که در جهت شیب تندتر با گرادیان منفی حرکت میکند. این روش یکی از پرکاربردترین روشه ای بهینه سازی در یادگیری ماشین است. این روش از نظر هزینه محاسباتی جزو روشهای کم هزینه نسبت به سایر روشهای بهینه سازی است . بهترین استفاده این الگوریتم در مواردی است که پارامترها نمی توانند به صورت تحلیلی محاسبه شوند (به عنوان مثال با استفاده از جبر خطی) و باید توسط یک الگوریتم بهینه سازی جستجو شود ، خوب ولی 3 مشکل عمده داره :الف ) Learning Rate :یکی از دغدغه ها در این روش انتخاب میزان یادگیری مناسب است ! نرخ یادگیری اگر خیلی کوچک باشد همگرایی خیلی سریع رخ می دهد در حالی که برعکس آن اگر این مقدار بزرگ باشد همگرایی اتفاق نمی افتاد و موجب می شود تابع در اطراف حداقل نوسان کند و یا حتی تفاوت داشته باشد.همچنین نرخ یادگیری را ما برای این روش برای تمام پارامترهایمان یکسان مقداردهی می کنیم در حالی که ممکن است نخواهیم همه ی آنها را به یک اندازه و همزمان به روزرسانی کنیم!ب ) Saddle points :نقاط زین اسبی یا Saddle points  مشکل دیگر این روش هستند چون این روش جاهایی که گرادیان صفر می شود را مورد توجه قرار می دهند ، در این نقاط زین اسبی تابع هزینه در یک بعد کمترین مقدار شده ولی در یک بعد دیگر Maximum محلی شده است ، در این نقاط اگر تابع در جهتی که کمترین مقدار شده کمی صاف تر شود ، روش گرادیان کاهشی برای همیشه دچار نوسان می شود و نتیجه اشتباه بدست می آید !ج ) Local Minimum :به طور کلی شبکه های عصبی شامل توابع با پیچیدگی های مختلف هستند که شامل تعداد زیادی تبدیلات غیر خطی هستند. پس نباید انتظار عملکرد فوق العاده ای از تابع loss داشته باشد و به این صورت باشد که فقط یک نقطه Minimum وجود داشته باشد که به آن نزدیک بشیم. تابع  loss یک نوع منحی محدب است کهاین امکان را دارد که شامل چندین نقطه Min باشد. با این شرایط با توجه به وجود چندین نقطه Min که شیب آن ها صفر است ، اگر با استفاده از روش Gradient Decent  به یکی از این Minimum ها  رسیده باشیم امکان دارد در این نقطه به دام Local Minimum بیافتیم . روش گرادیان کاهشی با استفاده از صفر کردن گرادیان کار میکند و این مساله در مورد تمام نقاط Minimum برقرار است.SGDدر ادامه برای بهبود SGD از تکنیکی به اسم Momentum استفاده شد! این تکنیک به منظور کم کردن خطای روش  gradient descent مطرح شده است. در این روش به جای اینکه تنها از مقدار گرادیان در مرحله ی فعلی به منظور هدایت جستجو استفاده شود، momentum گرادیان مراحل گذشته را نیز محاسبه می کند و از آن برای تعیین جهت گرادیان استفاده می کند.Momentumدر ادامه بهینه سازهایی مثل RMSProp یا AdaGrad ارائه شد و در نهایت Adam ارائه شد که الان تقریبا در بیشتر مسائل نتایج مطلوب تری رو نسبت به سایر بهینه سازها برای ما به ارمغان میاره!  قانون به روز رسانی برای  Adam بر اساس برآورد لحظه اول (میانگین) و دومین لحظه خام از شیب های پیشین (در پنجره زمانی اخیر از طریق میانگین حرکت نمایی) تعیین می شود. همانطور که در شبکه کد زیر مشخص است تقریبا تمامی موارد بهینه سازهای دیگر در دل بهینه ساز Adam جای گرفتن!Adam5 - اندازه دسته ها :در مورد  Batch Size به طور کلی وقتی کل داده ها را در یک دسته بدهیم ، باعث می شود که مقدار تابع هزینه همه داده ها ناگهانی کاهش یابد و نتیجه همگرا شود ولی این مسئله باعث می شودکه ما احتمال تغییر تصادفی ای نداشته باشیم و در بهینه های محلی گیر کنیم. اما در روش ارسال مقادیر به صورت تک به تک امکان تصادفی بودن بالاتر است ، به همین دلیل روش دسته ای برای کوتاه مدت پاسخ بهتری ارائه می کند و ارسال به صورت تکی در بلند مدت با توجه به این موضوع می توان نتیجه گرفت ، انتخاب  Batch Sizeمصالحه ای بین مواردی است که ذکر شد ، یعنی تعداد دوره های اجرا ، بهینه های محلی و البته خواسته مسئله ، پس  Batch Size بزرگتر باعث همگرایی سریع تر می شود ولی امکان تصادفی بودن کار را پایین می آورد.6 - انواع داده ها :به طور کلی داده ها را به دسته آموزش ، ارزیابی و تست تقسیم می کنند ، داده های آموزش را برای آموزش دادن مدل شبکه عصبی استفاده می کنند ، از داده های ارزیابی برای بررسی میزان دقت و قدرت تعمیم پذیری در هر Epoch استفاده می کنند و از داده های تست برای بدست آوردن دقت نهایی بعد از پایان آموزش شبکه استفاده می کنند ، هیچکدام از داده های ارزیابی و تست را برای یادگیری از قبل به شبکه نمی دهند!تقسیم داده هااز  Validation Setکه یکی از سه دسته داده ما است برای ارزیابی مدل در هر لحظه استفاده می کنیم و تفاوت آن با  Testدر این است که  Testرا در آخر چک می کنیم ولی در اینجا مقدار Validationرا در هر  Epochارزیابی می کنیم و می توانیم آن را در حد شرط توقف نیز دخالت دهیم. با توجه به اینکه  Validationداده هایی هستند که در قسمت  Trainبه شبکه داده نشده اند ، در اینجا این مقادیر به نوعی قدرت تعمیم شبکه را نیز ارزیابی می کنند. در شکل زیر نمونه ای از شرط توقف به وسیله ارزیابی مقدار  Lossداده های  Validationمشاهده می نمائید.توقف زودهنگام به علت فرابرازش</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Wed, 01 Apr 2020 05:26:17 +0430</pubDate>
            </item>
                    <item>
                <title>پیاده سازی اولین شبکه عصبی برای طبقه بندی تصاویر (قسمت اول)</title>
                <link>https://dataio.ir/پیاده-سازی-اولین-شبکه-عصبی-برای-طبقه-بندی-تصاویر-قسمت-اول-pciqpvu7us7r</link>
                <description>تو این نوشتار هدف ما طراحی و پیاده سازی یک شبکه عصبی پرسپترونی با دو لایه مخفی برای طبقه بندی تصاویره! در نظر داشته باشید تو این تمرین برای اینکه کارمون راحت باشه از لایه های دیگه که داخل شبکه های عصبی استفاده میشه مانند کانولوشن ها صرف نظر کردیم و صرفا در قالب الگوریتم شبکه عصبی پرسپترونی عمل می کنیم و با لایه های Dense سر و کار داریم ، طبیعتا استفاده از سایر متدها و لایه ها میتونه نتیجه ای که ما در این نوشتار بدست میاریم رو بهبود بده ولی در اینجا هدف صرفا آموزش هر چه ساده تر پیاده سازی اولین شبکه عصبی برای فردی هست که قصد داره کار با شبکه های عصبی رو شروع کنه!شبکه عصبی خوب ابتدا توضیح میدم که قراره چه تصاویری رو دسته بندی کنیم ، مجموعه تصاویر مورد استفاده در اینجا مجموعه داده MNIST هست که این مجموعه داده یک مجموعه داده بسیار معروف جهت شناسایی و نمایش ارقام از 0 تا 9 است . در این مجموعه داده هر تصویر نشان دهنده یک عدد تک رقمی است که در کل در 10 دسته ( از صفر تا 9 ) طبقه بندی شده اند ، این مجموعه داده مجموعا از هفتاد هزار تصویر تشکیل شده است که 60 هزار تصویر آن در مجموعه آموزشی و 10 هزار تصویر تصویر در مجموعه تست قرار گرفته اند. نمونه ای از تصاویر موجود در دیتاست MNIST رو مشاهده می کنید :نمونه تصاویری از مجموعه داده mnistاگه می خواید اطلاعات بیشتری راجع به این مجموعه داده تصویری پیدا کنید می تونید به لینک زیر سر بزنید!http://yann.lecun.com/exdb/mnist/خوب حالا باید این مجموعه تصویر رو دانلود کنیم تا داخل کدمون ازش استفاده کنیم ، یه راه حل مراجعه به همین لینک بالا و دانلود این مجموعه هست ، اما خوب راه ساده تری هم  وجود داره و می تونیم به راحتی از کتابخانه ها برای دانلود Mnist استفاده کنیم ، با استفاده از قطعه کد زیر تصاویر در دو قسمت آموزشی و تست دانلود میشن : https://gist.github.com/alikarimi120/b88ce6443fa0349402ac06921cce9b2c حالا بعد از دانلود  تصاویر و قبل از پیاده سازی مدل شبکه عصبی لازم است ، داده های ما نرمال یا استاندارد بشوند، اما چرا لازمه این کار رو انجام بدیم؟وقتی داده های ما بدون پیش پردازش به عنوان ورودی به شبکه عصبی داده بشه ، الگوریتم شبکه عصبی با توجه به پراکندگی داده ها و تفاوت مقیاس داده ها دچار حساسیت میشه و باعث بالا رفتن مقادیر وزن های شبکه عصبی میشه که در نهایت باعث تولید نتیجه نامناسب میشهبرای نرمالسازی می تونیم  مقدار ماکزیمم و مینیمم هر ستون از داده ها رو محاسبه کنیم و  با استفاده از روش MinMax و فرمول زیر داده ها رو نرمالسازی کنیم! دقت کنید داده ها باید در یک محدوده مشخص نرمال بشن (اینجا بین صفر و یک)!نرمالسازی MinMaxخوب در روش نرمالسازی پراکندگی داده ها تغییر نمیکنه ولی در روش استانداردسازی مقادیر میانگین و انحراف معیار تغییر خواهند کرد ، مقدار میانگین صفرو انحراف معیار 1 خواهد شد. با تمام این تفاسیر با استفاده از فرمول زیر و محاسبه میانگین و انحراف معیار داده ها می تونیم داده ها رو استانداردسازی کنیم!استاندارد سازی یه راه ساده تر و سریع تر از دو روش بالا هم وجود داره که به نوعی نرمالسازی صورت می گیره با توجه به اینکه پیکسل داده های این شبکه عصبی از نوع Graylevel هستند و در بازه 0 تا 255 قرار دارند ، کافی است آنها را فقط تقسیم بر 255 بکنیم. سپس آنها را Reshape می کنیم تا بتوانیم از این داده ها در ورودی مدل شبکه عصبی استفاده کنیم.برای پیاده سازی نرمالسازی و استاندارد سازی می تونیم  از کتابخانه Scikit استفاده کنیم.نمونه کد برای نرمالسازی داده ها : https://gist.github.com/alikarimi120/d2a00b0c7a8eff0bab9a40934a4f86c1 نمونه کد برای استاندارد سازی داده ها : https://gist.github.com/alikarimi120/ff715d2b553da4bbe658e6b9fc36af22 خوب حالا بعد نرمالسازی یا استانداردسازی داده هامون باید اونها رو به ابعادی در بیاریم که بتونیم داخل شبکه عصبی استفاده کنیم ، تصاویر مجموعه Mnist در ابعاد 28 در 28 هستن و فقط کافیه اونها رو به یک بردار 784 بعدی تبدیل کنیم! این کار رو هم برای داده های آموزشی و هم داده های تست انجام میدیم.قطعه کد برای تغییر ابعاد : https://gist.github.com/alikarimi120/f25ca5d949c00dd27d7ec5e7a650119c حالا برای داده های هدف ، یعنی دسته های کلاسمون هم باید تغییر ابعاد انجام بدیم! به این صورت که شماره کلاس ها رو به روش One-hot کد گذاری کنیم یعنی مثلا به جای اینکه داده هدفمون وقتی عددمون تو دسته سوم هست 3 باشه ، بیایم از یک آرایه با ده خانه استفاده کنیم و تمام خونه های اون رو برابر صفر قرار بدیم و تنها خونه سوم رو برابر با یک قرار بدیم تا نشون بده این تصویر به دسته سوم تعلق داره!!این کار رو برای تمام داده های هدف انجام میدیم ، برای این کار میشه به راحتی از قطعه کد زیر داخل کتابخانه استفاده کرد : https://gist.github.com/alikarimi120/310169aff72395356321f0c998cc898d داده ها رو هم برای اینکه آموزش شبکه به درستی انجام بشه و تصاویر از دسته های مختلف برای آموزش انتخاب بشن با استفاده از قطعه کد زیر ، آنها را بُر می زنیم! https://gist.github.com/alikarimi120/79654013147194c5b14a4b0e1aa163d5 حالا لازم هست معماری شبکمون رو طراحی کنیم! همونطور که قبلا گفته شد قصد داریم یک شبکه با دو لایه مخفی طراحی کنیم ، حالا معماری کلی شبکمون رو می دونیم ولی باید تعداد نورون های مورد استفاده داخل این معماری رو بدست بیاریم!ابتدا در مورد نورون های ورودی باید دقت کنیم تعداد نورون های لایه ورودی ما برابر با ابعاد تصویر ورودی هست! و از اونجایی که در این مسئله تمام تصاویر ما 784 بعدی هستن! پس تعداد نورون های لایه ورودی هم 784 تا میشه!خوب حالا که تعداد نورون ورودی مشخص شد ، باید تعداد نورون های لایه خروجی رو مشخص کنیم! تعداد نورون های لایه خروجی در یک مسئله طبقه بندی برابر با تعداد طبقه های ما هست ، ما تو این مسئله ده طبقه (کلاس) داده داریم پس 10 نورون خروجی خواهیم داشت!حالا که تکلیف نورون های ورودی و خورجی مشخص شد ، میریم سراغ نورون های لایه مخفی ! خوب نمیشه قبل از آموزش شبکه و بارها تست گرفتن تعداد نسبتا دقیقی نورون براش قرار داد! کشف تعداد نورون لازم برای لایه های میانی یا همان لایه های مخفی در این مسئله نیازمند تعداد زیادی آزمایش هست تا با بررسی دقتشون به نتیجه مشخصی برسیم !اما میتوان یک تخمین نسبی برای تعداد نورون های لایه مخفی زد ، تعداد نورون ها نباید نسبت به ابعاد تصویر اولیه خیلی کمتر یا خیلی بیشتر باشند تا شبکه دچار Overfitting یا Underfitting نشه! فعلا تو این مسئله تعداد نورون های هر دو لایه مخفی رو برابر با 512 در نظر می گیریم و خودتون می تونید تغییر بدید!در نهایت ما چنین معماری ای برای شبکه عصبی طبقه بندمون خواهیم داشت:معماری شبکه عصبی مورد استفاده در این کدخوب حالا نوبت به پیاده سازی شبکه عصبی رسیده ! برای پیاده سازی شبکه عصبی همونطور که داخل قطعه کد زیر مشخص هست از تعدادی لایه Dense موجود در کتابخانه Keras استفاده می کنیم ، همونطور که مشخص هست اندازه تصویر ورودی 784 ، و تعداد نورون های دو لایه Dense اول برابر 512 و لایه آخر نیز برابر 10 در نظر گرفته شده است. کلیت ساختار پیاده سازی یک مدل شبکه عصبی به همین صورت هست ، حالا علاوه بر پارامتری مانند تعداد نورون ، پارامترها و توابع دیگه ای مثل تابع فعالساز ، نرخ یادگیری ، بهینه ساز و تابع هزینه هم در قطعه کد زیر مشخص هست که در قسمت دوم آموزش در مورد تاثیر و کاربرد هر کدومشون صحبت می کنیمخوب حالا نوبت به آموزش شبکه میرسه ، از قطعه کد زیر برای این کار استفاده می کنیم: https://gist.github.com/alikarimi120/988c19352d0751f3d53fb205187442e7 دو آرگومان اول شامل تصاویر و داده های هدف هستن ،  یک آرگومان برای تعداد Epoch داریم که تعداد دوره هایی رو مشخص میکنه که میخواهیم شبکه مورد آموزش قرار بگیره و آرگومان Validation_split  نیز نمایش دهنده درصد داده هایی هست که از داده های ورودی به عنوان داده های ارزیابی ( نه برای اموزش) قرار است در هر Epoch استفاده شود. همچنین مقدار آرگومان batch size اندازه دسته ها را مشخص می کند که در قسمت دوم آموزش در مورد تاثیر آن توضیح داده می شود.در نهایت از داده های تست نیز برای ارزیابی دقت شبکه استفاده می کنیم ، مطابق با قطعه کد زیر 10 هزار تصویر تست را به شبکه می دهیم و نتایج بدست آمده را با نتایج واقعی مقایسه می کنیم و مقدار دقت و خطا را بدست میاریم: https://gist.github.com/alikarimi120/dda7eba466b053307b5a5334a21cf593 نتیجه بدست آمده از داده های تست :Test - Loss: 0.06670001149177551 Test - Accuracy 0.9790999889373779کد رسم نمودار دقت و خطا : https://gist.github.com/alikarimi120/bf0a4ccb711fb38469446d0e59f73175 نمودار میزان دقت داده های آموزش و ارزیابی شبکه در 50 دورهنمودار میزان دقت داده های آموزشی و ارزیابینمودار میزان خطا داده های آموزش و ارزیابی شبکه در 50 دورهنمودار میزان خطا داده های آموزشی و ارزیابی تا اینجا توانستیم یک شبکه برای طبقه بندی تصاویر ایجاد کنیم ، توضیحات مربوط به توابع و پارامترهای مختلف در قسمت دوم آموزش داده شده است.</description>
                <category>alikarimi120</category>
                <author>alikarimi120</author>
                <pubDate>Wed, 01 Apr 2020 05:01:55 +0430</pubDate>
            </item>
            </channel>
</rss>