آموزش پایتورچ (PyTorch) کتابخانه پیشرفته یادگیری عمیق

آموزش پایتورچ (PyTorch) کتابخانه پیشرفته یادگیری عمیق

مدل‌سازی با استفاده از یادگیری عمیق، یک مهارت اساسی است که توسعه‌دهندگان امروزی باید آن را به خوبی فرا بگیرند.

پایتورچ (PyTorch)، اولین کتابخانه متن‌باز یادگیری عمیق است که توسط فیسبوک توسعه و پشتیبانی می‌شود.

پایتورچ در بستر خود، یک کتابخانه ریاضی محور است که به شما امکان می‌دهد به طور کارآمد محاسبات را روی مدل‌های مبتنی بر گراف انجام داده و به طور خودکار آن‌ها را تفکیک کنید. این هدف به طور مستقیم چالش‌برانگیز است، اما خوشبختانه رابط برنامه‌نویسی PyTorch، با ارائه کلاس‌ها و توابع مدرن، به شما امکان می‌دهد به راحتی مجموعه‌ای از مدل‌های یادگیری عمیق را آموزش دهید و از آنها در راستای هدف خود استفاده کنید.

در این مقاله، ما قصد داریم به شما راهنمایی گام به گام برای توسعه مدل‌های یادگیری عمیق با استفاده از پایتورچ ارائه دهیم.

بعد از اتمام این دوره، شما موارد زیر را یاد خواهید گرفت:

  • تفاوت بین Torch و PyTorch و روش نصب و استفاده از PyTorch.
  • چرخه عمر پنج مرحله‌ای مدل‌های PyTorch و نحوه تعریف، آموزش صحیح و ارزیابی آن‌ها.
  • چگونگی توسعه مدل‌های یادگیری عمیق PyTorch برای وظایف مدل‌سازی رگرسیون، طبقه‌بندی و پیش‌بینی.

با اتمام این دوره، شما مهارت‌های لازم برای استفاده از PyTorch را یاد خواهید گرفت.

پایتون مقدمه ای بر یادگیری عمیق

شما می‌توانید با استفاده از پایتون، یادگیری عمیق را آغاز کنید!

مهم نیست که در ابتدا همه چیز را به طور کامل درک کنید (حداقل در حال حاضر). هدف شما این است که این دوره آموزشی را به پایان برسانید و نتیجه بگیرید. در ابتدا، نیازی نیست که همه جزئیات را درک کنید. سوالات خود را مطرح کنید و برای آشنایی با تمام قابلیت‌هایی که استفاده می‌کنید، از مستندات رسمی پایتورچ استفاده کنید.

شما نیازی ندارید در ابتدا مفاهیم ریاضی را به طور کامل بدانید. ریاضیات یک روش فشرده برای توصیف عملکرد الگوریتم‌ها است، اما شما می‌توانید از ریاضیات و ابزارهای جبر خطی، احتمال و حساب دیفرانسیل و انتگرال برای یادگیری نحوه کار الگوریتم‌ها استفاده کنید. همچنین می‌توانید با استفاده از کد، رفتار الگوریتم را با ورودی‌ها و خروجی‌های مختلف بررسی کنید. دانستن ریاضیات به شما نمی‌گوید که کدام الگوریتم را انتخاب کنید یا چگونه آن را به بهترین شکل پیکربندی کنید. شما می‌توانید این را از طریق آزمایش‌های کنترل شده کشف کنید.

شما نیازی ندارید بدانید چگونه الگوریتم‌ها کار می‌کنند. مهم است که محدودیت‌ها و نحوه پیکربندی الگوریتم‌های یادگیری عمیق را بدانید. اما یادگیری درباره الگوریتم‌ها می‌تواند بعدا اتفاق بیفتد. شما باید این دانش را به آرامی در طول زمان کسب کنید.

شما نیازی ندارید برنامه‌نویس حرفه‌ای پایتون باشید. سینتکس زبان پایتون می‌تواند شهودی باشد اگر با آن آشنا باشید. فقط مفاهیم اولیه زبان پایتون را یاد بگیرید. این کار شما را در مسیر قرار خواهد داد. فقط شروع کنید و بعدا به جزئیات بپردازید.

شما نیازی ندارید متخصص یادگیری عمیق باشید. در ادامه، می‌توانید با مزایا و محدودیت‌های الگوریتم‌های مختلف آشنا شوید و برای آشنایی با مراحل یک پروژه یادگیری عمیق، می‌توانید آموزش‌های زیادی را مطالعه کنید.

چگونه پایتورچ را نصب کنیم؟

در این قسمت به شما می‌گوییم که PyTorch چیست، چطور آن را نصب کنید و چگونه مطمئن شوید که به درستی نصب شده است.

تفاوت Torch و PyTorch چیست؟

PyTorch یک نسخه پیشرفته‌تر از Torch است که در زبان برنامه‌نویسی پایتون پیاده‌سازی شده است و رویکردی کاربرپسندتر و انعطاف‌پذیرتر را برای یادگیری عمیق ارائه می‌دهد. به دلیل سادگی، قابلیت تغییرپذیری و حمایت قوی از جامعه، این گزینه برای بسیاری از محققان و متخصصان تبدیل به انتخاب اول شده است.

Keras یا PyTorch کدام یک بهتر است؟

PyTorch به دلیل نمودار محاسباتی پویا نسبت به Keras، اغلب ترجیح داده می‌شود. این ویژگی به انعطاف‌پذیری بیشتر و راحتی بیشتر در اشکال‌زدایی در طول توسعه مدل کمک می‌کند. قابلیت تعریف و تغییر گراف محاسباتی به‌طور همزمان در PyTorch، به محققان و متخصصان امکان می‌دهد به راحتی و به صورت کارآمدتر آزمایش کنند، به‌ویژه در مواردی که معماری مدل نیاز به تغییرات پویا دارد. همچنین، PyTorch پشتیبانی عالی از شتاب‌دهی GPU را فراهم می‌کند و با داشتن یک جامعه قوی و فعال در توسعه، به یک انتخاب قدرتمند و محبوب برای وظایف یادگیری عمیق تبدیل شده است.

آموزش نصب پایتورچ بر روی سیستم

قبل از نصب پایتون، از نصب پایتون مانند پایتون ۳.۶ یا بالاتر اطمینان حاصل کنید.

اگر پایتون را نصب نکرده اید، می توانید با استفاده از Anaconda آن را نصب کنید.

راه های زیادی برای نصب پایتورچ وجود دارد.

رایج ترین و شاید ساده ترین راه برای نصب پایتورچ روی سیستم کاری خود، استفاده از PIP است.

برای مثال در خط فرمان می توانید کد زیر را تایپ کنید:

				
					# for Linux
sudo pip install torch

# for windows
pip install torch
				
			

یکی از پرکاربردترین دلایل استفاده از پایتورچ توانایی مدل سازی داده های بصری می باشد. برای این منظور باید بسته مربوطه را “torchvision” نیز نصب کرد.

نصب این پکیج توصیه می شود.

				
					# for Linux
sudo pip install torchvision

# for windows
pip install torchvision
				
			

در حال حاضر نیازی به راه اندازی تنظیمات GPU نیست.

تمام مثال های این برنامه آموزشی به خوبی روی یک CPU مدرن کار خواهند کرد. اگر می خواهید پایتورچ را برای GPU خود پیکربندی کنید، می توانید پس از تکمیل این آموزش این کار را انجام دهید.

 

چگونه از نصب صحیح پایتورچ مطمئن شویم؟

پس از نصب پایتورچ، لازم است تایید کنید که کتابخانه با موفقیت نصب شده است و می توانید استفاده از آن را آغاز کنید.

از این مرحله صرف نظر نکنید.

اگر پایتورچ به درستی نصب نشده باشد یا خطایی در این مرحله ایجاد کند، قادر به اجرای نمونه های بعدی نخواهید بود.

یک فایل جدید به نام versions.py ایجاد کرده و کد زیر را در فایل کپی و پیست کنید.

				
					# check pytorch version
import torch
print(torch.__version__)
				
			

فایل را ذخیره کنید، سپس خط فرمان (CMD) خود را باز کنید و دایرکتوری را به جایی که فایل را ذخیره کرده اید تغییر دهید.

سپس تایپ کنید:

				
					python versions.py
				
			

سپس خروجی باید شامل اعدادی هماندد زیر باشد:

				
					1.3.1
				
			

این موضوع تایید می کند که پایتورچ به درستی نصب شده است و همه ما از یک نسخه استفاده می کنیم.

این کار همچنین به شما نشان می دهد که چگونه یک اسکریپت پایتون را از خط فرمان اجرا کنید.

 

ساختار و نحوه عملکرد کتابخانه یادگیری عمیق پایتورچ

در این بخش، چرخه حیات یک مدل یادگیری عمیق با پایتورچ را یاد خواهیم گرفت. آموزش ساختار این کتابخانه باعث آشنایی بیشتر با طراحی و توسعه مدل های مختلف یادگیری عمیق خواهد شد.

5 گام اساسی در توسعه مدل

  1. آماده سازی داده ها
  2. تعریف مدل 
  3. آموزش مدل
  4. ارزیابی مدل 
  5. پیش بینی

برای درک صحیح نیاز است که هر مرحله را به صورت جداگانه بررسی کنیم.

 

گام اول: آماده سازی داده

اولین قدم این است که داده های خود را بارگذاری و آماده کنید.

شبکه های عصبی نیاز به داده های ورودی و خروجی عددی دارد. یعنی باید قبل از آموزش مدل داده ها باید به حالت عددی تبدیل شوند.

می توانید از کتابخانه های استاندارد پایتون برای دریافت و آماده سازی داده های جدولی مانند فایل های CSV استفاده کنید. به عنوان مثال، کتابخانه Pandas گزینه مناسبی برای بارگیری فایل CSV و کتابخانه scikit-learn کتابخانه مناسبی برای پیش پردازش و مدل های یادگیری ماشین است.

کتابخانه پایتورچ دارای یک کلاس به اسم Dataset می باشد که می توانید آن را گسترش داده و سفارشی سازی کنید تا به کمک آن داده های خود را بر روی محیط کدزنی یا همان IDE بارگذاری کنید.

هنگامیکه داده های خود را روی محیط کدزنی بارگذاری کردین در این مرحله میتوانید داده های خود را پاکسازی و پردازش کنید.

در قسمت زیر ما کلاس Dataset پایتورچ را سفارشی سازی می کنیم. البته نیازی به این کار نیست، بلکه با این روش میتوانید قابلیت های بیشتری به این کلاس بدهید.

				
					# dataset definition
class CSVDataset(Dataset):
    # load the dataset
    def __init__(self, path):
        # store the inputs and outputs
        self.X = ...
        self.y = ...

    # number of rows in the dataset
    def __len__(self):
        return len(self.X)

    # get a row at an index
    def __getitem__(self, idx):
        return [self.X[idx], self.y[idx]]
				
			

پس از بارگذاری دیتاست،پایتورچ از کلاس DataLoader برای پیمایش دیتاست بارگذاری شده در طول آموزش و ارزیابی مدل شما فراهم می کند.

از کلاس DataLoader می توان برای مجموعه داده آموزشی، آزمایشی و حتی داده های اعتبار سنجی نیز استفاده کرد.

از تابع random_split می توان برای تقسیم یک مجموعه داده به مجموعه های آموزش و تست استفاده کرد.

پس از تقسیم، داده ها را میتوان با تعداد مشخصی batch size به DataLoader داد. همچنین میتوانید از تابع shuffle برای درهم سازی رکوردها نیز استفاده کرد.

در نمونه کد زیر DataLoader و مقادیر دریافتی آن را مشاهده می کنیم.

				
					...
# create the dataset
dataset = CSVDataset(...)
# select rows from the dataset
train, test = random_split(dataset, [[...], [...]])
# create a data loader for train and test sets
train_dl = DataLoader(train, batch_size=32, shuffle=True)
test_dl = DataLoader(test, batch_size=1024, shuffle=False)
				
			

پس از تعریف کد بالا، می توان DataLoader را شمارش کرد، که در هر تکرار یک مقداری داده جدید براساس میزان batch size به ما ارائه می دهد.

				
					...
# train the model
for i, (inputs, targets) in enumerate(train_dl):
	...
				
			

گام دوم: تعریف مدل

بعد از اینکه داده ها آماده شد، مرحله بعدی تعریف مدل است.

اصطلاح تعریف مدل در پایتورچ شامل تعریف کلاسی است که کلاس Module را گسترش می دهد.

کلاس ایجاد شده با بازنویسی (override) تابع forward لایه های ورودی و انتشار مدل را ایجاد می کند.

در میان لایه های موجود، Linear برای لایه های کاملا متصل، Conv2d برای لایه های کانولوشن و MaxPool2d برای لایه های ادغام مورد استفاده قرار می گیرد.

همانند لایه ها، توابع فعال سازی را نیز می توان تعریف کرد. از توابع فعالساز معروف می توان ReLU، Softmax و Sigmoid را معرفی کرد.

در زیر نمونه ای از یک مدل ساده MLP با یک لایه توسعه داده شده است.

				
					# model definition
class MLP(Module):
    # define model elements
    def __init__(self, n_inputs):
        super(MLP, self).__init__()
        self.layer = Linear(n_inputs, 1)
        self.activation = Sigmoid()

    # forward propagate input
    def forward(self, X):
        X = self.layer(X)
        X = self.activation(X)
        return X
				
			

گام سوم: آموزش مدل

در کتابخانه پایتورچ برای اینکه بتوانیم مدل را آموزش دهیم، نیاز است که از تابع ضرر (loss function) و تابع بهینه سازی (optimization algorithm) استفاه کنیم.

از توابع ضرر مهم، میتوان به موارد زیر اشاره کرد.

BCELoss: Binary cross-entropy loss for binary classification.

CrossEntropyLoss: Categorical cross-entropy loss for multi-class classification.

MSELoss: Mean squared loss for regression

 

از معروف ترین الگوریتم های بهینه سازی نزول گرادیان کاهش (Stochastic gradient descent) می باشد. همچنین الگوریتم Adam نیز بسیار پرکاربرد است.

				
					# define the optimization
criterion = MSELoss()
optimizer = SGD(model.parameters(), lr=0.01, momentum=0.9)
				
			

در این مرحله تمامی تنظیمات مبتدی و لازم را انجام دادیم و نیاز است که داده ها با به مدل بدهیم.

ابتدا با استفاده از DataLoader داده های آموزشی را به مدل تعریف شده میدهیم.

در نمونه کدل زیر حلقه بیرونی برای مشخص کردن Epoch و  حلقه درونی برای گرفتن داده های هر Batch تعریف شده است.

				
					...
# enumerate epochs
for epoch in range(100):
    # enumerate mini batches
    for i, (inputs, targets) in enumerate(train_dl):
    	...
				
			

برای اینکه مدل درستی داشته باشیم لازم است در هر Epoch یا هر بار آموزش کامل مدل نیاز است تغییراتی را در مدل لحاظ کنیم.

  1. پاک کردن آخرین گرادیان خطا.
  2. انتشار رو به جلو ورودی در طول مدل.
  3. محاسبه ضرر برای خروجی مدل.
  4. پس انتشار (back propagation) خطا در طول مدل.
  5. بروزرسانی مدل برای کاهش ضرر.

برای فهم بهتر کد زیر را باهم مشاهده کنیم.

				
					...
# clear the gradients
optimizer.zero_grad()
# compute the model output
yhat = model(inputs)
# calculate loss
loss = criterion(yhat, targets)
# credit assignment
loss.backward()
# update model weights
optimizer.step()
				
			

گام چهارم: ارزیابی مدل

در این مرحله ما یک مدل آموزش یافته داریم. برای اینکه ما مدل را روی داده های جدید تست و ارزیابی کنیم نیاز است که مدل آموزش دیده را یا داده های تست که ابتدای کار از داده های آموزش جدا کرده بودیم، ارزیابی کنیم.

برای این منظور دوباره از DataLoader مربوط به داده های تست استفاه میکنیم و داده ها را به ترتیب از آن دریافت می کنیم.

				
					...
for i, (inputs, targets) in enumerate(test_dl):
    # evaluate the model on the test set
    yhat = model(inputs)
    ...
				
			

گام پنجم: پیش بینی کردن

در این مرحله مدل را با استفاده از داده های آموزشی ساختیم و سپس آن را با استفاده از داده های تست ارزیابی کردیم. در این مرحله نیاز است که بتوانیم با مدل توسعه یافته پیش بینی خود را انجام دهیم.

به عنوان مثال تصمیم براین است که با استفاده از  مجموعه ای داده خام یک پیش بینی را انجام دهیم. برای این کار نیاز است که آن داده را به تنسور (Tensor) تبدیل کنیم.

تنسور همان نامپای (Numpy) است که برای پایتورچ طراحی شده است. به همین خاطر نیاز است که در کار با کتابخانه های یادگیری عمیق همانند پایتورچ به این اصل مهم توجه داشته باشیم. بنابراین ورودی و خروجی مدل های پایتورچ تنسور است، اما به راحتی میتوانیم آن را به فرمت های دیگری تبدیل کنیم.

 

				
					...
# convert row to data
row = Variable(Tensor([row]).float())
# make prediction
yhat = model(row)
# retrieve numpy array
yhat = yhat.detach().numpy()
				
			

شما اگر تا اینجای کار با من پیش آمده باشید به یقینا دید مناسبی از نحوه کارکرد درست پایتورچ پیدا کرده اید.

ولی توجه داشته باشید که تنها با یک بار مطالعه کردن این مقاله یا مقالات خوب دیگر شما نمیتوانید به پایتورچ مسلط شوید، بهتر است دست های خود را کثیف کنید. یعنی برید پایتورچ را نصب کنید و با دقت این پروسه را نیز یکبار خودتان پیش برید.

 

منبع:

https://machinelearningmastery.com/pytorch-tutorial-develop-deep-learning-models/

یک پاسخ بنویسید

نشانی ایمیل شما منتشر نخواهد شد.فیلد های مورد نیاز علامت گذاری شده اند *