تفاوت تنسورهای PyTorch با آرایه های NumPy
تنسورهای پایتورچ بسیار شبیه به آرایه های نامپای هستند. از آنها هم برای ذخیره و عملیات روی آرایه های عددی استفاده میشود. اما با این حال یک سری تفاوتهایی بین آرایه های نامپای و تنسورهای پایتورچ وجود دارد. در این پست شباهت ها و تفاوتهای بین آرایه های نامپای و تنسورهای پایتورچ را توضیح میدهیم.
کتابخانه نامپای (NumPy)
NumPy یک کتابخانه پایتون است که کاربرد اصلیاش در مقاصد علمی و برای کار با اعداد است. تقریبا در numpy یک شیء آرایهای چند بعدی (ndarray) ارائه میدهد که از آن برای ذخیره و عملیات روی آرایه های عددی استفاده میشود. قبلا در پست “ آشنایی با کتابخانه numpy” در مورد ویژگی های مربوط به آرایه های نامپای صحبت کرده ایم.
کتابخانه پایتورچ (PyTorch)
پایتورچ یک فریم ورک یادگیری ماشین متن باز است که مسیر تحقیقات تا رسیدن به محصول را تسریع میکند. PyTorch به دلیل انعطاف پذیری، سهولت استفاده و قابلیت های محاسباتی کارآمد شناخته شده است.
در پایتورچ تمامی عملیات برپایه عملیات روی تنسورها است. تنسورها یک ساختار داده تخصصی هستند که بسیار شبیه به ماتریس و آرایه ها هستند. میشه گفت که تنسورها قلب پایتورچ هستند. و ازآنها برای ذخیره ورودیها و خروجیهای مدل و همچنین پارامترهای مدل استفاده میشود.
یک تنسور پایتورچ همانند یک آرایه نامپای هست. خود تنسور چیزی در مورد یادگیری عمیق، گرافهای محاسباتی یا گرادیانها نمیدونه! فقط یک آرایه چندبعدی است که برای محاسباتی عددی دلخواه استفاده می شود. درست مثل آرایههای نامپای.
تنسورها هم ویژگی مهم آرایههای نامپای یعنی broadcasting را دارند.
تفاوت بین تنسورهای پایتورچ و آرایه های نامپای
تنسورهای پایتورچ بسیار شبیه به آرایه های نامپای هستند اما با دو تفاوت اصلی. که همین باعث قدرتمند شدن کتابخانه پایتورچ شده است. در ادامه این دو ویژگی مهم تنسورهای پایتورچ رو توضیح میدهیم.
تنسورها قابلیت اجرا روی GPU و CPU را دارند
مهمترین تفاوت بین یک آرایه نامپای و تنسور پایتورچ اینه که یک تنسور پایتورچ هم میتونه روی CPU و هم روی GPU یا سایر سخت افزارهای شتاب دهنده اجرا شود. این ویژگی باعث میشه سرعت محاسبات بسیار بالاتر باشه.
تنسورها برای مشتق گیری خودکار بهینه شده اند
فرق دوم تنسورهای پایتورچ و آرایههای نامپای اینه که عملیات روی تنسور میتونه track بشه و گرادیان خروجی آن با توجه به ورودی محاسبه شود. که این ویژگی طراحی و پیادهسازی شبکههای عصبی را بسیار ساده میکند.
اگر با آرایه های عددی نامپای آشنا باشید. به عبارتی با ndarray آشنا باشید کارتون خیلی ساده خواهد بود. چرا که اینجا هم همان کارها را انجام میدهیم. همه اون مواردی که در نامپای کار کردیم. منتهی برخی متدها، اسمشون یا نحوه فراخوانیشون کمی فرق میکند. ولی چارچوب یکی است.
نحوه تبدیل آرایه نامپای به تنسور پایتورچ
باید به این نکته توجه کنیم که نوع داده در تنسورهای پایتورچ float32 است، این درحالی هست که در آرایه های نامپای float64 هست. برای اینکه در پردازش ها و عملیات محاسباتی به مشکل نخوریم حتما باید بعد از تبدیل یک آرایه نامپای به تنسور پایتورچ، نوع آن را به float32 تغییر بدیم.
Python
tensor= torch.from_numpy(NumPy_arrary).type(torch.float32)
نحوه تبدیل تنسور پایتورچ به آرایه نامپای
قبل از تبدیل تنسور پایتورچ به آرایه نامپای، باید نوع آن را به float64 تبدیل کنیم.
Python
NumPy_arrary = tensor.type(torch.float64).numpy()
در مثال زیر یک آرایه نامپای ساختیم، سپس آنرا به یک تنسور پایتورچ تبدیل کردیم. در انتها هم مجدد به آرایه نامپای تبدیل کردیم.
Python
#%% import libraries import numpy as np import torch rng=np.random.default_rng(1)
#%% create a NumPy array arr= rng.random((2,3)) print(arr,arr.dtype) >>> [[0.51182162 0.9504637 0.14415961] [0.94864945 0.31183145 0.42332645]] float64
#%% convert a NumPy array to a PyTorch tensor t= torch.from_numpy(arr).type(torch.float32) print(t,t.dtype) >>> tensor([[0.5118, 0.9505, 0.1442], [0.9486, 0.3118, 0.4233]]) torch.float32
#%% convert a PyTorch tensor to a NumPy array arr_new= t.type(torch.float64).numpy() print(arr_new,arr_new.dtype) >>> [[0.51182163 0.95046371 0.14415962] [0.94864947 0.31183144 0.42332646]] float64
[…] و سپس شبکه های عصبی را روی آنها اعمال کنیم. در پست “تفاوت تنسورهای PyTorch با آرایه های NumPy” نحوه تبدیل آرایه های NumPy به تنسورهای PyTorch را توضیح […]