از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
با PyTorch آرایه Numpy را به Tensor و Tensor را به Numpy Array تبدیل کنید
سرفصلهای مطلب
تانسورها اشیاء چند بعدی و بلوک نمایش داده های ضروری چارچوب های یادگیری عمیق مانند TensorFlow و PyTorch هستند.
آ اسکالر دارای ابعاد صفر است، a بردار یک بعد دارد، الف ماتریس دارای دو بعد و تانسورها سه یا بیشتر داشته باشند. در عمل، ما اغلب به اسکالرها و بردارها و ماتریس ها مانند تانسورها و همچنین برای راحتی.
توجه داشته باشید: آ تانسور همچنین می تواند هر آرایه n بعدی، درست مانند یک آرایه Numpy. بسیاری از فریم ورک ها برای کار با آرایه های Numpy پشتیبانی می کنند و بسیاری از آنها ساخته شده اند روی بالای Numpy بنابراین ادغام هم طبیعی و هم کارآمد است.
با این حال، الف torch.Tensor
قابلیتهای داخلی بیشتری نسبت به آرایههای Numpy دارد و این قابلیتها برای برنامههای Deep Learning (مانند شتاب GPU) تنظیم شدهاند، بنابراین ترجیح دادن آن منطقی است. torch.Tensor
نمونه هایی روی آرایه های Numpy معمولی هنگام کار با PyTorch. علاوه بر این، torch.Tensor
دارای یک API بسیار شبیه NumPy است که آن را برای اکثر افراد با تجربه قبلی بصری می کند!
در این راهنما، روش تبدیل بین Numpy Array و PyTorch Tensor را یاد بگیرید.
تبدیل Numpy Array به PyTorch Tensor
برای تبدیل یک آرایه Numpy به یک تانسور PyTorch – ما دو رویکرد متمایز داریم که میتوانیم استفاده کنیم: استفاده از from_numpy()
تابع، یا به سادگی با ارائه آرایه Numpy به torch.Tensor()
سازنده یا با استفاده از tensor()
تابع:
import torch
import numpy as np
np_array = np.array((5, 7, 1, 2, 4, 4))
tensor_a = torch.from_numpy(np_array)
tensor_b = torch.Tensor(np_array)
tensor_c = torch.tensor(np_array)
بنابراین، چه تفاوتی دارد؟ را from_numpy()
و tensor()
توابع هستند dtype
-آگاه! از آنجایی که ما یک آرایه Numpy از اعداد صحیح ایجاد کرده ایم، dtype
از عناصر زیربنایی به طور طبیعی خواهد بود int32
:
print(np_array.dtype)
اگر قرار بود print دو تانسور ما را بیرون بیاوریم:
print(f'tensor_a: {tensor_a}\ntensor_b: {tensor_b}\ntensor_c: {tensor_c}')
tensor_a
و tensor_c
نوع داده استفاده شده در آن را حفظ کنید np_array
، در گونه PyTorch (torch.int32
)، در حالی که tensor_b
به طور خودکار مقادیر را به شناور است:
tensor_a: tensor((5, 7, 1, 2, 4, 4), dtype=torch.int32)
tensor_b: tensor((5., 7., 1., 2., 4., 4.))
tensor_c: tensor((5, 7, 1, 2, 4, 4), dtype=torch.int32)
این را می توان از طریق بررسی آنها نیز مشاهده کرد dtype
زمینه های:
print(tensor_a.dtype)
print(tensor_b.dtype)
print(tensor_c.dtype)
Numpy Array به PyTorch Tensor با dtype
این رویکردها همچنین در این که آیا می توانید به صراحت مورد نظر را تنظیم کنید متفاوت هستند dtype
چه زمانی پدید آوردن تانسور from_numpy()
و Tensor()
الف را قبول نکن dtype
استدلال، در حالی که tensor()
میکند:
tensor_a = torch.from_numpy(np_array)
tensor_b = torch.Tensor(np_array)
tensor_c = torch.tensor(np_array, dtype=torch.int32)
print(tensor_a.dtype)
print(tensor_b.dtype)
print(tensor_c.dtype)
به طور طبیعی، شما می توانید هر یک از آنها را به راحتی با استفاده از همان نحو ارسال کنید و به شما امکان می دهد dtype
بعد از خلقت نیز پس پذیرش الف dtype
استدلال یک محدودیت نیست، بلکه بیشتر یک راحتی است:
tensor_a = tensor_a.float()
tensor_b = tensor_b.float()
tensor_c = tensor_c.float()
print(tensor_a.dtype)
print(tensor_b.dtype)
print(tensor_c.dtype)
تانسور PyTorch را به Numpy Array تبدیل کنید
تبدیل یک تانسور PyTorch به یک آرایه Numpy ساده است، زیرا تانسورها در نهایت ساخته می شوند. روی بالای آرایههای Numpy، و تنها کاری که باید انجام دهیم این است که ساختار دادههای زیرین را «در معرض دید» قرار دهیم.
از آنجایی که PyTorch می تواند محاسبات انجام شده را بهینه کند روی مبتنی بر داده ها روی سخت افزار شما، هر چند چند نکته وجود دارد:
tensor = torch.tensor((1, 2, 3, 4, 5))
np_a = tensor.numpy()
np_b = tensor.detach().numpy()
np_c = tensor.detach().cpu().numpy()
بنابراین، چرا استفاده کنید
detach()
وcpu()
قبل از افشای ساختار داده زیربنایی باnumpy()
، و چه زمانی باید جداش کنی و به سی پی یو انتقال بدی؟
CPU PyTorch Tensor -> CPU Numpy Array
اگر تانسور شما است روی CPU، جایی که آرایه Numpy جدید نیز در آن قرار خواهد گرفت – خوب است فقط ساختار داده را در معرض دید قرار دهید:
np_a = tensor.numpy()
این خیلی خوب کار می کند و شما یک آرایه Numpy تمیز دارید.
CPU PyTorch Tensor با گرادیان -> CPU Numpy Array
با این حال، اگر تانسور شما نیاز دارد شما برای آن نیز گرادیان ها را محاسبه کنید (یعنی requires_grad
آرگومان تنظیم شده است True
)، این رویکرد دیگر کار نخواهد کرد. تو مجبوری جدا کردن آرایه زیرین از تانسور و از طریق جدا کردن، شما شیب ها را حذف خواهید کرد:
tensor = torch.tensor((1, 2, 3, 4, 5), dtype=torch.float32, requires_grad=True)
np_a = tensor.numpy()
np_b = tensor.detach().numpy()
GPU PyTorch Tensor -> CPU Numpy Array
در نهایت – اگر تانسور خود را ایجاد کرده اید روی GPU، شایان ذکر است که آرایه های Numpy معمولی از شتاب GPU پشتیبانی نمی کنند. ساکن هستند روی CPU! تو مجبوری انتقال تانسور به یک CPU، و سپس جدا کردن / افشای ساختار داده
توجه داشته باشید: این کار را می توان از طریق to('cpu')
یا cpu()
توابع – آنها از نظر عملکردی معادل هستند.
این باید به صراحت انجام شود، زیرا اگر انجام می شد بطور خودکار – تبدیل بین CPU و CUDA Tensors به آرایه ها در زیر کاپوت متفاوت خواهد بود ، که می تواند منجر به اشکالات غیر منتظره در خط شود.
PyTorch کاملاً واضح است، بنابراین از این نوع تبدیل خودکار به طور هدفمند اجتناب شد:
tensor = torch.tensor((1, 2, 3, 4, 5), dtype=torch.float32, requires_grad=True).cuda()
np_b = tensor.detach().numpy()
np_c = tensor.detach().cpu().numpy()
توجه داشته باشید: بسیار توصیه می شود تماس بگیرید detach()
قبل از cpu()
، برای هرس کردن گرادیان ها قبل از انتقال آنها به CPU. شیب ها به هر حال بعد از آن مهم نخواهند بود detach()
تماس بگیرید – بنابراین کپی کردن آنها در هر نقطه کاملا زائد و ناکارآمد است. بهتر است هر چه زودتر «وزن مرده» را کاهش دهید.
به طور کلی – این روش ایمن ترین است، زیرا مهم نیست که از چه نوع تانسوری کار می کنید – شکست نمی خورد. اگر یک تانسور CPU دارید و سعی می کنید آن را به CPU بفرستید – هیچ اتفاقی نمی افتد. اگر یک تانسور بدون گرادیان دارید و سعی کنید آن را جدا کنید – هیچ اتفاقی نمی افتد. در انتهای دیگر چوب – استثناها پرتاب می شوند.
نتیجه
در این راهنما – قبل از بررسی روش تبدیل یک آرایه Numpy به یک تانسور PyTorch، نگاهی به تانسورهای PyTorch انداختهایم. در نهایت، ما بررسی کردهایم که چگونه تانسورهای PyTorch میتوانند آرایه Numpy زیربنایی را نشان دهند، و در چه مواردی باید انتقالها و هرسهای اضافی را انجام دهید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-07 03:25:03