کد تمیز در PyTorch

هر از گاهی گوگل برام مطالبی که زیاد دنبال کردم رو نوتیفی میده که بخونم. یه مقاله بود که به نظرم ممکنه برای خیلی از ما مفید باشه . اون همین پستیه که امروز میذارم. امیدوارم برای شما هم مفید باشه. مقاله اصلی رو می‌تونید اینجا بخونید.این عکس با اسفاده از Bing ساخته شده است. مقدمهدر زمینه علم داده و به طور کلی برنامه نویسی، نوشتن کدهایی که خواندن و نگهداری آنها آسان باشد بسیار مهم است. مطمئناً شما نیز تجربه نوشتن کدی را داشته‌اید که به نظر می‌رسد خوب کار می‌کند و کاملاً واضح است، اما یک روز یا یک هفته بعد دوباره آن را خوانده‌اید و نامفهوم به نظر می‌رسد. زمانی که باید کدهای نوشته شده توسط افراد دیگر را مرور کنید، این مشکل آشکارتر است.در هوش مصنوعی، نوشتن کد واضح و قابل فهم بسیار مهم است، زیرا ما اغلب باید چندین آزمایش را تنظیم کنیم، و سپس چندین مدل، چندین داده و هزاران هایپرپارامتر را امتحان کنیم.در این مقاله نکاتی را که در برنامه نویسی با PyTorch به کار می برم با شما به اشتراک می گذارم که می توانید فوراً از آنها استفاده کنید و امیدوارم به شما کمک کند در کار خود به عنوان یک دانشمند داده کمی کارآمدتر شوید.یک کلاس DataModule برای مدیریت داده های خود ایجاد کنیددر این مثال، من با مجموعه داده معروف MNIST کار خواهم کرد. اگرچه شیوه‌هایی که من استفاده می‌کنم ممکن است در این مورد غیر ضروری به نظر برسند، زیرا کتابخانه‌های مختلف استفاده از مجموعه‌های داده ساده را تسهیل می‌کنند، آنها همیشه می‌توانند هنگام کار با مجموعه داده‌های پیچیده‌تر مفید باشند.بسیاری از اوقات هنگام کار با مجموعه داده های غیراستاندارد، ما باید مراحل مختلفی را طی کنیم، مانند دانلود داده ها، ساختار پوشه ها و زیرپوشه ها برای تقسیم داده ها، ایجاد یک کلاس Dataset سفارشی و موارد دیگر. بنابراین مفید خواهد بود که یک کلاس DataModule ایجاد کنیم که از هر کاری که لازم است در آن انجام شود و دو تابع را ارائه می دهد که مستقیماً بارگذارهای داده را که برای آموزش استفاده خواهیم کرد، برمی گرداند.داشتن چنین کلاسی به ما این امکان را می دهد که گردش کار تمیزتر و امکان گسترش کار را ساده‌تر داشته باشیم. بیایید به یک مثال ساده نگاه کنیم.در این حالت، کلاس DataModule با استفاده از دو تابع، کار ایجاد مجموعه داده‌ها و نمونه‌سازی داده‌های بارگزار انجام میدهد. به این ترتیب در تابع main به سادگی می توانم توابع ()train_dataloader و ()val_dataloader را برای دسترسی به داده های خود فراخوانی کنم. به طور کلی، اگر برخی از وظایف بازیابی داده‌ها را دارید که باید برای جمع‌آوری مجموعه داده‌های خود انجام دهید، تمرین خوبی است که آنها را به کلاس DataModule اضافه کنید، که سپس می‌توان از آن برای نمونه‌سازی داده‌بار استفاده کرد. به این ترتیب می توانید به روشی ساده به داده ها دسترسی داشته باشید.بیایید روش TensorFlow را بازتولید کنیممن از طرفداران TensorFlow نیستم، در واقع، مگر اینکه لازم باشد. من تقریبا همیشه با PyTorch کار می کنم. اگرچه، من متوجه شدم که روش fit() TensorFlow بسیار مفید است. در واقع، پس از ایجاد یک مدل، فقط باید model.fit(data) را فراخوانی کنید تا آن را آموزش دهید، تا حدودی مانند مدل هایی که در scikit-learn انجام می دهید.پس چرا چیزی مشابه را در PyTorch نیز بازسازی نکنید؟کاری که در مثال بعدی انجام خواهیم داد این است که یک تابع مناسب را تعریف کنیم که شبکه را روی داده های MNIST با در نظر گرفتن DataModule ایجاد شده قبلی به عنوان ورودی آموزش می دهد. پس از آن، این تابع را به روشی از کلاس خود تبدیل می کنیم که مدل را تعریف می کند.به این ترتیب هر زمان که بخواهیم یک مدل متفاوت ایجاد کنیم، همیشه می‌توانیم آن را با تابع ()fit مرتبط کنیم که بدون تغییر باقی می‌ماند.اکنون می توانیم از model.fit (datamodule = datamodule, epochs = 3) برای اجرای آموزش خود استفاده کنیم.Progress Barدر طول آموزش مدل، نداشتن نکاتی در مورد اینکه چقدر طول می کشد تا تمام شود، واقعا آزاردهنده است. اما خوشبختانه، پیاده سازی نوار پیشرفت در PyTorch به روشی واقعا ساده امکان پذیر است.فقط از تابع tqdm استفاده کنید و دیتالودر را ایجاد کنید و طول کل دیتالودر را با len(dataloader) مشخص کنید.به این ترتیب، یک نوار پیشرفت ظاهر می شود که گویی به صورت جادویی، خروجی را از نظر بصری بسیار جذابتر می کند.معیارهای ارزیابینمی‌دانم چرا، اما وقتی کدهای نوشته شده در PyTorch را می‌خوانم، اغلب می‌بینم که افرادی معیارهای رایج مانند دقت، یادآوری، دقت… را به صورت دستی پیاده‌سازی می‌کنند.با این حال، زمانی که آنها با کتابخانه های دیگری مانند scikit-learn کار می کنند، اینطور نیست. پیاده‌سازی این معیارها در تابع آموزشی می‌تواند خواندن تابع را دشوار کند و شاید باگ‌ها حتی راحت‌تر وارد شوند.پیشنهاد من این است که هنگام کار از معیارهایی که قبلاً در کتابخانه‌هایی مانند scikit-learn یافت شده است استفاده کنید. این به ما امکان می دهد از کدهایی استفاده کنیم که احتمالا قوی تر هستند اما مهمتر از آن در زمان ما صرفه جویی می کنند!البته اگر نیاز به پیاده‌سازی معیارهای سفارشی باشد، بحث متفاوت است، بنابراین اگر مثلاً روی روش‌های جدید ارزیابی مدل تحقیق می‌کنید.به خصوص زمانی که شروع به توسعه یک پروژه می کنیم و می خواهیم از معیارهای استاندارد استفاده کنیم تا ببینیم آیا در مسیر درستی هستیم یا خیر، استفاده از تابع classification_report در scikit-learn مفید است. بیایید به یک مثال نگاه کنیم.امیدوارم که این مقاله برای شما هم مفید بوده باشه. خوشحال میشم نظرتون درمورد این پست و پست‌های قبلم بگید :))