رگرسیون خطی یکی از روشهای آماری بسیار رایج است که به ما امکان میدهد رابطه بین دو متغیر پیوسته را تعیین کرده و مطالعه کنیم. خصوصیات مختلف رگرسیون خطی و پیادهسازی آن در پایتون پیشتر در این مقاله پوشش داده شده است. حال، ما میخواهیم ببینیم چگونه میتوانیم این کار را در PyTorch، کتابخانهای بسیار محبوب در زمینه یادگیری عمیق که توسط فیسبوک توسعه یافته است، پیادهسازی کنیم.
اولاً، شما باید PyTorch را در محیط پایتون خود نصب کنید. آسانترین راه برای انجام این کار استفاده از ابزار pip یا conda است. به وبسایت pytorch.org مراجعه کنید و نسخهای از Python interpreter و package manager که میخواهید استفاده کنید را نصب نمایید.
# We can run this Python code on a Jupyter notebook # to automatically install the correct version of # PyTorch. # http://pytorch.org / from os import path from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag platform = '{}{}-{}'.format(get_abbr_impl(), get_impl_ver(), get_abi_tag()) accelerator = 'cu80' if path.exists('/opt / bin / nvidia-smi') else 'cpu' ! pip install -q http://download.pytorch.org / whl/{accelerator}/torch-1.3.1.post4-{platform}-linux_x86_64.whl torchvision
با نصب PyTorch، حالا بیایید به کد نگاهی بیندازیم.
دو خط زیر را بنویسید تا توابع و اشیاء ضروری کتابخانه را وارد کنید.
import torch from torch.autograd import Variable
همچنین ما برخی دادهها را تعریف میکنیم و آنها را به متغیرهای x_data و y_data طبق کد زیر اختصاص میدهیم:
x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]])) y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]]))
در اینجا، x_data متغیر مستقل ما و y_data متغیر وابسته ما است. اینها برای حال حاضر مجموعه دادههای ما خواهند بود. بعد، ما باید مدل خود را تعریف کنیم. دو مرحله اصلی با تعریف مدل ما مرتبط هستند. آنها عبارتند از:
۱. مقداردهی اولیه مدل ما.
۲. اعلام مرحله رو به جلو (forward pass).
ما از کلاس زیر استفاده میکنیم:
class LinearRegressionModel(torch.nn.Module): def __init__(self): super(LinearRegressionModel, self).__init__() self.linear = torch.nn.Linear(1, 1) # One in and one out def forward(self, x): y_pred = self.linear(x) return y_pred
مطابق آنچه مشاهده میکنید، کلاس مدل ما زیرمجموعهای از torch.nn.module است. چون در این مورد تنها یک ورودی و خروجی داریم، از مدل خطی با اندازه ورودی و خروجی ۱ استفاده میکنیم. بعد، یک نمونه از این مدل را ایجاد خواهیم کرد.
# our model our_model = LinearRegressionModel()
پس از این، ما به انتخاب بهینهساز و معیار ضرر (loss) میپردازیم. در اینجا، ما از خطای مربع میانگین (MSE) به عنوان تابع ضرر خود و گرادیان کاهشی تصادفی (SGD) به عنوان بهینهسازمان استفاده میکنیم. همچنین، به صورت اختیاری نرخ یادگیری را ۰.۰۱ تنظیم میکنیم.
criterion = torch.nn.MSELoss(size_average = False) optimizer = torch.optim.SGD(our_model.parameters(), lr = 0.01)
حالا به قسمت آموزش رسیدهایم. در این مرحله، این کارها را ۵۰۰ بار تکرار میکنیم:
۱. یک مرحله forward pass انجام میدهیم، دادهها را عبور میدهیم و مقدار پیشبینی شده برای y را مییابیم.
۲. ضرر را با استفاده از MSE محاسبه میکنیم.
۳. تمام گرادیانها را به صفر ریست میکنیم، یک عقبگرد انجام میدهیم و بعد وزنها را بهروز میکنیم.
for epoch in range(500): # Forward pass: Compute predicted y by passing # x to the model pred_y = our_model(x_data) # Compute and print loss loss = criterion(pred_y, y_data) # Zero gradients, perform a backward pass, # and update the weights. optimizer.zero_grad() loss.backward() optimizer.step() print('epoch {}, loss {}'.format(epoch, loss.item()))
پس از اتمام دوره آموزش، مدل تعریف شده خود را با یک مقدار ناشناخته از x_data آزمایش میکنیم تا ببینیم نتایج درستی به دست میآید یا خیر. در این مورد، x_data را ۴.۰ در نظر میگیریم.
new_var = Variable(torch.Tensor([[4.0]])) pred_y = our_model(new_var) print("predict (after training)", 4, our_model(new_var).item())
اگر تمام مراحل را درست انجام داده باشید، خواهید دید که برای ورودی ۴.۰، یک مقدار نزدیک به ۸.۰ دریافت میکنید، مثل این:
پیشبینی (بعد از آموزش) ۴: ۷.۹۶۶۴۳۸۲۹۳۴۵۷۰۳۱
برای راهنمایی، کد کامل این مقاله را میتوانید در پایین پیدا کنید:
import torch from torch.autograd import Variable x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]])) y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]])) class LinearRegressionModel(torch.nn.Module): def __init__(self): super(LinearRegressionModel, self).__init__() self.linear = torch.nn.Linear(1, 1) # One in and one out def forward(self, x): y_pred = self.linear(x) return y_pred # our model our_model = LinearRegressionModel() criterion = torch.nn.MSELoss(size_average = False) optimizer = torch.optim.SGD(our_model.parameters(), lr = 0.01) for epoch in range(500): # Forward pass: Compute predicted y by passing # x to the model pred_y = our_model(x_data) # Compute and print loss loss = criterion(pred_y, y_data) # Zero gradients, perform a backward pass, # and update the weights. optimizer.zero_grad() loss.backward() optimizer.step() print('epoch {}, loss {}'.format(epoch, loss.item())) new_var = Variable(torch.Tensor([[4.0]])) pred_y = our_model(new_var) print("predict (after training)", 4, our_model(new_var).item())
منابع