وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

با PyTorch آرایه Numpy را به Tensor و Tensor را به Numpy Array تبدیل کنید

0 30
زمان لازم برای مطالعه: 4 دقیقه


تانسورها اشیاء چند بعدی و بلوک نمایش داده های ضروری چارچوب های یادگیری عمیق مانند 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید