PyTorch Day 02: PyTorch Tensor Basics

فهرست مطالب
- مقدمه
-
درک تنسورها
-
ایجاد و دستکاری تانسور
-
تمرینات عملی
-
راه حل ها و توضیحات
- خلاصه
- منابع اضافی
1. مقدمه
تانسورها بلوک های اساسی در PyTorch و یادگیری عمیق هستند. آنها آرایههای چند بعدی هستند که محاسبات کارآمد را امکانپذیر میکنند، بهویژه زمانی که از GPU برای شتاب استفاده میکنند. درک ساختار، ویژگی ها و تکنیک های دستکاری تانسورها برای توسعه و آموزش موثر مدل های یادگیری عمیق ضروری است. راهنمای امروز شما را با دانش ایجاد و دستکاری تانسورها با اطمینان تجهیز می کند و زمینه را برای موضوعات پیشرفته تر در روزهای آینده فراهم می کند.
2. درک تنسورها
2.1. تانسور چیست؟
الف تانسور تعمیم بردارها و ماتریس ها به ابعاد بالقوه بالاتر است. در PyTorch، تانسورها ساختارهای داده اولیه هستند که برای ذخیره داده ها و پارامترهای مدل استفاده می شوند. آنها شبیه NumPy هستند ndarray
اما دارای قابلیت های اضافی مانند شتاب GPU و تمایز خودکار است.
ویژگی های کلیدی تانسورها:
- چند بعدی: تانسورها می توانند ابعاد مختلفی داشته باشند، که آنها را برای نمایش داده های مختلف همه کاره می کند.
- محاسبه کارآمد: بهینه شده برای عملیات ریاضی با کارایی بالا، به ویژه در GPU.
- گرادیان ها: از تمایز خودکار پشتیبانی می کند که برای آموزش شبکه های عصبی بسیار مهم است.
رتبه های تانسور مشترک:
- تانسور 0-D (اسکالر): یک مقدار واحد
- تانسور 1 بعدی (بردار): یک آرایه تک بعدی.
- تانسور دو بعدی (ماتریس): یک آرایه دو بعدی.
- سه بعدی و بالاتر: برای داده های پیچیده تر مانند تصاویر (3-D)، فیلم ها (4-D) و غیره استفاده می شود.
تجسم:
-
0-D:
tensor(5)
-
1-D:
tensor([1, 2, 3])
-
2-D:
tensor([[1, 2], [3, 4]])
-
3-بعدی:
tensor([[[1], [2]], [[3], [4]]])
2.2. ویژگی های تانسور
درک ویژگی های یک تانسور برای دستکاری موثر و اطمینان از سازگاری در طول عملیات بسیار مهم است.
2.2.1. شکل
- تعریف: اندازه تانسور را در هر بعد نشان می دهد.
-
دسترسی:
tensor.shape
یاtensor.size()
مثال:
import torch
tensor = torch.randn(3, 4, 5)
print("Tensor Shape:", tensor.shape) # Output: torch.Size([3, 4, 5])
2.2.2. نوع داده (dtype)
- تعریف: نوع داده های ذخیره شده در تانسور را نشان می دهد (مانند شناور، int).
-
دسترسی:
tensor.dtype
انواع داده های رایج:
-
torch.float32
(torch.float
) -
torch.float64
(torch.double
) -
torch.int32
(torch.int
) -
torch.int64
(torch.long
) torch.bool
مثال:
tensor = torch.randn(3, 4)
print("Tensor Data Type:", tensor.dtype) # Output: torch.float32
2.2.3. دستگاه
- تعریف: محل ذخیره و پردازش تانسور (CPU یا GPU) را مشخص می کند.
-
دسترسی:
tensor.device
دستگاه ها:
cpu
-
cuda:0
،cuda:1
و غیره که نشان دهنده GPU های مختلف است.
مثال:
tensor = torch.randn(2, 2)
print("Tensor Device:", tensor.device) # Output: cpu
# Moving tensor to GPU (if available)
if torch.cuda.is_available():
tensor_gpu = tensor.to('cuda')
print("Tensor Device after moving to GPU:", tensor_gpu.device) # Output: cuda:0
3. ایجاد و دستکاری تانسور
ایجاد تانسورها به روشهای مختلف، انعطافپذیری در مقداردهی اولیه دادهها برای وظایف مختلف را فراهم میکند. PyTorch توابع زیادی را برای ایجاد تانسورها با ویژگی های دلخواه فراهم می کند.
3.1. ایجاد تانسورها
3.1.1. با استفاده از torch.tensor
یک تانسور از داده ها (به عنوان مثال، لیست ها، تاپل ها) ایجاد می کند.
مثال:
import torch
# From a list
data = [[1, 2], [3, 4]]
tensor = torch.tensor(data)
print("Tensor from list:\n", tensor)
# Output:
# Tensor from list:
# tensor([[1, 2],
# [3, 4]])
تعیین نوع داده:
tensor = torch.tensor(data, dtype=torch.float32)
print("Tensor with dtype float32:\n", tensor)
# Output:
# tensor([[1., 2.],
# [3., 4.]])
3.1.2. با استفاده از torch.zeros
یک تانسور پر از صفر ایجاد می کند.
مثال:
tensor = torch.zeros(3, 4)
print("Tensor filled with zeros:\n", tensor)
# Output:
# Tensor filled with zeros:
# tensor([[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]])
3.1.3. با استفاده از torch.ones
یک تانسور پر از یک ها ایجاد می کند.
مثال:
tensor = torch.ones(2, 3)
print("Tensor filled with ones:\n", tensor)
# Output:
# Tensor filled with ones:
# tensor([[1., 1., 1.],
# [1., 1., 1.]])
3.1.4. با استفاده از torch.arange
یک تانسور 1 بعدی با مقادیر از ابتدا تا انتها با یک مرحله مشخص ایجاد می کند.
مثال:
tensor = torch.arange(start=0, end=10, step=2)
print("Tensor created with arange:\n", tensor)
# Output:
# Tensor created with arange:
# tensor([0, 2, 4, 6, 8])
3.1.5. با استفاده از torch.linspace
یک تانسور 1 بعدی با مقادیر خطی بین شروع و پایان ایجاد می کند.
مثال:
tensor = torch.linspace(start=0, end=1, steps=5)
print("Tensor created with linspace:\n", tensor)
# Output:
# Tensor created with linspace:
# tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000])
3.2. عملیات تانسور
هنگامی که تانسورها ایجاد می شوند، می توان عملیات مختلفی را برای دستکاری و تجزیه و تحلیل داده ها انجام داد.
3.2.1. عملیات حسابی
PyTorch از عملیات محاسباتی عنصری بین تانسورها پشتیبانی می کند.
مثال:
import torch
tensor_a = torch.tensor([1, 2, 3])
tensor_b = torch.tensor([4, 5, 6])
# Addition
sum_tensor = tensor_a + tensor_b
print("Sum:", sum_tensor) # Output: tensor([5, 7, 9])
# Multiplication
prod_tensor = tensor_a * tensor_b
print("Product:", prod_tensor) # Output: tensor([ 4, 10, 18])
# Division
div_tensor = tensor_b / tensor_a
print("Division:", div_tensor) # Output: tensor([4.0000, 2.5000, 2.0000])
عملیات اسکالر:
# Addition with scalar
tensor = torch.tensor([1, 2, 3])
tensor = tensor + 5
print("After adding 5:", tensor) # Output: tensor([6, 7, 8])
# Multiplication with scalar
tensor = tensor * 2
print("After multiplying by 2:", tensor) # Output: tensor([12, 14, 16])
3.2.2. نمایه سازی و برش
دسترسی به عناصر یا زیر مجموعه های خاص یک تانسور برای دستکاری داده ها اساسی است.
مثال:
import torch
tensor = torch.arange(1, 17).reshape(4, 4)
print("Original Tensor:\n", tensor)
# Output:
# Original Tensor:
# tensor([[ 1, 2, 3, 4],
# [ 5, 6, 7, 8],
# [ 9, 10, 11, 12],
# [13, 14, 15, 16]])
# Accessing a single element
element = tensor[0, 1]
print("Element at (0,1):", element) # Output: tensor(2)
# Slicing rows
rows = tensor[1:3, :]
print("Sliced Rows (1:3):\n", rows)
# Output:
# Sliced Rows (1:3):
# tensor([[ 5, 6, 7, 8],
# [ 9, 10, 11, 12]])
# Slicing columns
columns = tensor[:, 2:]
print("Sliced Columns (2:):\n", columns)
# Output:
# Sliced Columns (2:):
# tensor([[ 3, 4],
# [ 7, 8],
# [11, 12],
# [15, 16]])
# Using negative indices
last_element = tensor[-1, -1]
print("Last Element:", last_element) # Output: tensor(16)
3.2.3. تغییر شکل تانسورها
تغییر شکل، ابعاد تانسور را بدون تغییر داده های آن تغییر می دهد.
با استفاده از reshape
:
import torch
tensor = torch.arange(1, 13)
print("Original Tensor Shape:", tensor.shape) # Output: torch.Size([12])
reshaped = tensor.reshape(3, 4)
print("Reshaped Tensor Shape:", reshaped.shape)
# Output:
# Reshaped Tensor Shape: torch.Size([3, 4])
با استفاده از view
:
reshaped_view = tensor.view(3, 4)
print("Reshaped with view Shape:", reshaped_view.shape)
# Output:
# Reshaped with view Shape: torch.Size([3, 4])
توجه: تانسور هنگام استفاده باید در حافظه به هم پیوسته باشد view
. اگر نه، استفاده کنید reshape
یا .contiguous()
قبل از view
.
3.2.4. الحاق و انباشته شدن
ترکیب تانسورها اغلب برای تجمیع داده ها و آماده سازی ورودی مدل ضروری است.
الحاق (torch.cat
):
- توضیحات: تانسورها را در امتداد یک بعد موجود میپیوندد.
- الزامات: تانسورها به جز در بعد الحاقی باید شکل یکسانی داشته باشند.
مثال:
import torch
tensor_a = torch.randn(2, 3)
tensor_b = torch.randn(2, 3)
# Concatenate along the first dimension (rows)
concat_dim0 = torch.cat((tensor_a, tensor_b), dim=0)
print("Concatenated along dim=0:", concat_dim0.shape) # Output: torch.Size([4, 3])
# Concatenate along the second dimension (columns)
concat_dim1 = torch.cat((tensor_a, tensor_b), dim=1)
print("Concatenated along dim=1:", concat_dim1.shape) # Output: torch.Size([2, 6])
انباشته شدن (torch.stack
):
- توضیحات: تانسورها را در یک بعد جدید به هم می پیوندد.
- الزامات: همه تانسورها باید شکل یکسانی داشته باشند.
مثال:
import torch
tensor_a = torch.randn(2, 3)
tensor_b = torch.randn(2, 3)
# Stack along a new first dimension
stack_dim0 = torch.stack((tensor_a, tensor_b), dim=0)
print("Stacked along new dim=0:", stack_dim0.shape) # Output: torch.Size([2, 2, 3])
# Stack along a new second dimension
stack_dim1 = torch.stack((tensor_a, tensor_b), dim=1)
print("Stacked along new dim=1:", stack_dim1.shape) # Output: torch.Size([2, 2, 3])
3.2.5. انتقال تانسورها
جابجایی دو بعد یک تانسور را مبادله می کند، که برای تراز کردن داده ها برای عملیات خاص ضروری است.
با استفاده از transpose
:
import torch
tensor = torch.randn(2, 3)
print("Original Tensor Shape:", tensor.shape) # Output: torch.Size([2, 3])
# Transpose dimensions 0 and 1
transposed = tensor.transpose(0, 1)
print("Transposed Tensor Shape:", transposed.shape) # Output: torch.Size([3, 2])
با استفاده از permute
:
import torch
tensor = torch.randn(2, 3, 4)
print("Original Tensor Shape:", tensor.shape) # Output: torch.Size([2, 3, 4])
# Permute dimensions to (3, 4, 2)
permuted = tensor.permute(1, 2, 0)
print("Permuted Tensor Shape:", permuted.shape) # Output: torch.Size([3, 4, 2])
4. تمرینات عملی
درگیر شدن با تمرینات عملی درک شما را تقویت می کند و تضمین می کند که می توانید عملیات تانسور را به طور موثر اعمال کنید.
4.1. تمرین 1: کاوش ویژگی های تانسور
وظیفه:
- یک تانسور سه بعدی با شکل ایجاد کنید
(4, 3, 2)
. - شکل، نوع داده و دستگاه آن را چاپ کنید.
- نوع داده را به تغییر دهید
torch.float64
و آن را به GPU (در صورت وجود) منتقل کنید. - با چاپ ویژگی های به روز شده، تغییرات را تأیید کنید.
4.2. تمرین 2: ایجاد تنسورهای مختلف
وظیفه:
- تانسورهای زیر را ایجاد کنید:
- تانسور صفر با شکل
(5, 5)
. - تانسور یکهایی با شکل
(3, 4)
. - یک تانسور با مقادیر از
0
به9
با استفاده ازtorch.arange
. - یک تانسور با
50
نقاط با فاصله خطی بین0
و1
با استفاده ازtorch.linspace
.
- تانسور صفر با شکل
- چاپ هر تانسور و ویژگی های آن.
4.3. تمرین 3: عملیات دستکاری تانسور
وظیفه:
- دو تانسور دو بعدی ایجاد کنید:
-
tensor_a
با شکل(2, 3)
حاوی مقادیر تصادفی -
tensor_b
با شکل(2, 3)
حاوی مقادیر تصادفی
-
- عملیات زیر را انجام دهید:
- علاوه بر عنصر.
- ضرب عنصری.
- ضرب ماتریس (
torch.matmul
).
- برش
tensor_a
برای استخراج دو عنصر اول هر ردیف. - تغییر شکل دهید
tensor_b
به(3, 2)
. - الحاق
tensor_a
وtensor_b
در امتداد بعد اول - پشته
tensor_a
وtensor_b
در امتداد یک بعد جدید - تانسور انباشته را جابجا کنید.
- نتایج هر عملیات را چاپ کنید.
5. راه حل ها و توضیحات
5.1. راه حل هایی برای تمرین تمرینات
5.1.1. تمرین 1: کاوش ویژگی های تانسور
راه حل:
import torch
# Step 1: Create a 3-D tensor with shape (4, 3, 2)
tensor = torch.randn(4, 3, 2)
print("Original Tensor:\n", tensor)
print("Shape:", tensor.shape) # torch.Size([4, 3, 2])
print("Data Type:", tensor.dtype) # torch.float32
print("Device:", tensor.device) # cpu
# Step 2: Change data type to torch.float64 and move to GPU if available
if torch.cuda.is_available():
tensor = tensor.to(dtype=torch.float64, device='cuda')
else:
tensor = tensor.to(dtype=torch.float64)
print("\nUpdated Tensor:\n", tensor)
print("Shape:", tensor.shape) # torch.Size([4, 3, 2])
print("Data Type:", tensor.dtype) # torch.float64
print("Device:", tensor.device) # cuda:0 or cpu
توضیح:
-
ایجاد تانسور: یک تانسور سه بعدی با مقادیر و شکل تصادفی را راه اندازی می کند
(4, 3, 2)
. -
چاپ صفت: شکل تانسور، نوع داده (
torch.float32
به طور پیش فرض)، و دستگاه (cpu
). -
نوع داده و تغییر دستگاه: استفاده می کند
.to()
روشی برای تغییر نوع داده بهtorch.float64
و تانسور را به GPU منتقل می کند (cuda
) در صورت موجود بودن - تایید: برای تأیید تغییرات، ویژگی های تانسور به روز شده را چاپ می کند.
خروجی نمونه:
Original Tensor:
tensor([[[ 0.1234, -0.5678],
[ 1.2345, -1.3456],
[ 0.6789, -0.7890]],
[[-0.2345, 1.4567],
[ 0.3456, -1.5678],
[ 1.7890, -0.8901]],
[[-1.1234, 0.2345],
[ 0.5678, -1.6789],
[ 1.8901, -0.3456]],
[[ 0.4567, -1.7890],
[ 1.2345, -0.4567],
[ 0.6789, -1.8901]]])
Shape: torch.Size([4, 3, 2])
Data Type: torch.float32
Device: cpu
Updated Tensor:
tensor([[[ 0.1234, -0.5678],
[ 1.2345, -1.3456],
[ 0.6789, -0.7890]],
[[-0.2345, 1.4567],
[ 0.3456, -1.5678],
[ 1.7890, -0.8901]],
[[-1.1234, 0.2345],
[ 0.5678, -1.6789],
[ 1.8901, -0.3456]],
[[ 0.4567, -1.7890],
[ 1.2345, -0.4567],
[ 0.6789, -1.8901]]], dtype=torch.float64, device="cuda:0")
Shape: torch.Size([4, 3, 2])
Data Type: torch.float64
Device: cuda:0
5.1.2. تمرین 2: ایجاد تنسورهای مختلف
راه حل:
import torch
# 1. Tensor of zeros with shape (5, 5)
zeros_tensor = torch.zeros(5, 5)
print("Tensor of Zeros:\n", zeros_tensor)
print("Shape:", zeros_tensor.shape)
print("Data Type:", zeros_tensor.dtype)
print("Device:", zeros_tensor.device)
# 2. Tensor of ones with shape (3, 4)
ones_tensor = torch.ones(3, 4)
print("\nTensor of Ones:\n", ones_tensor)
print("Shape:", ones_tensor.shape)
print("Data Type:", ones_tensor.dtype)
print("Device:", ones_tensor.device)
# 3. Tensor with values from 0 to 9 using torch.arange
arange_tensor = torch.arange(0, 10)
print("\nTensor with torch.arange:\n", arange_tensor)
print("Shape:", arange_tensor.shape)
print("Data Type:", arange_tensor.dtype)
print("Device:", arange_tensor.device)
# 4. Tensor with 50 linearly spaced points between 0 and 1 using torch.linspace
linspace_tensor = torch.linspace(0, 1, steps=50)
print("\nTensor with torch.linspace:\n", linspace_tensor)
print("Shape:", linspace_tensor.shape)
print("Data Type:", linspace_tensor.dtype)
print("Device:", linspace_tensor.device)
توضیح:
-
تانسور صفرها: الف را ایجاد می کند
(5, 5)
تانسور پر از صفر -
تانسور یکها: الف را ایجاد می کند
(3, 4)
تانسور پر از یکها -
تانسور با
torch.arange
: یک تانسور 1 بعدی با مقادیر از تولید می کند0
به9
. -
تانسور با
torch.linspace
: یک تانسور 1 بعدی با50
مقادیر مساوی بین0
و1
. - چاپ صفت: برای هر تانسور، شکل، نوع داده و دستگاه خود را برای تأیید ایجاد چاپ میکند.
خروجی نمونه:
Tensor of Zeros:
tensor([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
Shape: torch.Size([5, 5])
Data Type: torch.float32
Device: cpu
Tensor of Ones:
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
Shape: torch.Size([3, 4])
Data Type: torch.float32
Device: cpu
Tensor with torch.arange:
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Shape: torch.Size([10])
Data Type: torch.int64
Device: cpu
Tensor with torch.linspace:
tensor([0.0000, 0.0204, 0.0408, 0.0612, 0.0816, 0.1020, 0.1224, 0.1429,
0.1633, 0.1837, 0.2041, 0.2245, 0.2449, 0.2653, 0.2857, 0.3061,
0.3265, 0.3469, 0.3673, 0.3878, 0.4082, 0.4286, 0.4490, 0.4694,
0.4898, 0.5102, 0.5306, 0.5510, 0.5714, 0.5918, 0.6122, 0.6327,
0.6531, 0.6735, 0.6939, 0.7143, 0.7347, 0.7551, 0.7755, 0.7959,
0.8163, 0.8367, 0.8571, 0.8776, 0.8980, 0.9184, 0.9388, 0.9592,
0.9796, 1.0000])
Shape: torch.Size([50])
Data Type: torch.float32
Device: cpu
5.1.3. تمرین 3: عملیات دستکاری تانسور
راه حل:
import torch
# Step 1: Create two 2-D tensors
tensor_a = torch.randn(2, 3)
tensor_b = torch.randn(2, 3)
print("Tensor A:\n", tensor_a)
print("Shape of Tensor A:", tensor_a.shape) # torch.Size([2, 3])
print("\nTensor B:\n", tensor_b)
print("Shape of Tensor B:", tensor_b.shape) # torch.Size([2, 3])
# Step 2.1: Element-wise addition
addition = tensor_a + tensor_b
print("\nElement-wise Addition:\n", addition)
# Step 2.2: Element-wise multiplication
multiplication = tensor_a * tensor_b
print("\nElement-wise Multiplication:\n", multiplication)
# Step 2.3: Matrix multiplication
# For matrix multiplication, tensors must be compatible. Here, (2,3) @ (3,2) = (2,2)
tensor_b_mat = tensor_b.T # Transpose tensor_b to make it (3,2)
matrix_multiplication = torch.matmul(tensor_a, tensor_b_mat)
print("\nMatrix Multiplication (A @ B^T):\n", matrix_multiplication)
# Step 3: Slice tensor_a to extract the first two elements of each row
sliced = tensor_a[:, :2]
print("\nSliced Tensor A (first two elements of each row):\n", sliced)
print("Shape of Sliced Tensor:", sliced.shape) # torch.Size([2, 2])
# Step 4: Reshape tensor_b to (3, 2)
reshaped_b = tensor_b.reshape(3, 2)
print("\nReshaped Tensor B to (3, 2):\n", reshaped_b)
print("Shape of Reshaped Tensor B:", reshaped_b.shape) # torch.Size([3, 2])
# Step 5: Concatenate tensor_a and reshaped_b along the first dimension
# To concatenate, shapes must match except in the concatenating dimension.
# tensor_a: (2,3), reshaped_b: (3,2) --> Not directly compatible. Adjust reshaped_b to (3,3) by padding or similar.
# Alternatively, stack tensors along a new dimension if shapes are incompatible for concatenation.
# Here, let's stack along a new dimension instead.
stacked = torch.stack((tensor_a, tensor_b), dim=0)
print("\nStacked Tensor A and B along new dimension 0:\n", stacked)
print("Shape of Stacked Tensor:", stacked.shape) # torch.Size([2, 2, 3])
# Step 6: Transpose the stacked tensor (swap dimensions 1 and 2)
transposed_stacked = stacked.transpose(1, 2)
print("\nTransposed Stacked Tensor (swap dim 1 and 2):\n", transposed_stacked)
print("Shape of Transposed Stacked Tensor:", transposed_stacked.shape) # torch.Size([2, 3, 2])
توضیح:
-
ایجاد تانسور: دو تصادفی را مقدار دهی اولیه می کند
(2, 3)
تانسورها،tensor_a
وtensor_b
. -
عملیات حسابی:
-
اضافه عنصر: عناصر مربوطه را اضافه می کند
tensor_a
وtensor_b
. -
ضرب عنصری: عناصر متناظر را ضرب می کند
tensor_a
وtensor_b
. -
ضرب ماتریس: ضرب ماتریس بین را انجام می دهد
tensor_a
و جابجایی ازtensor_b
برای اطمینان از سازگاری ابعادی، در نتیجه الف(2, 2)
تانسور
-
اضافه عنصر: عناصر مربوطه را اضافه می کند
-
برش دادن: دو عنصر اول را از هر ردیف استخراج می کند
tensor_a
، در نتیجه الف(2, 2)
تانسور -
تغییر شکل: شکل را تغییر می دهد
tensor_b
از(2, 3)
به(3, 2)
. -
الحاق و انباشته شدن:
- الحاق: تلاش شد اما به دلیل عدم تطابق شکل ناسازگار یافت شد.
-
روی هم چیدن: در عوض، پشته
tensor_a
وtensor_b
در امتداد یک بعد جدید، در نتیجه الف(2, 2, 3)
تانسور
-
جابجایی تانسور انباشته: بعد دوم و سوم تانسور انباشته را جابجا می کند و در نتیجه a
(2, 3, 2)
تانسور - چاپ صفت: پس از هر عملیات، تانسور حاصل و شکل آن را برای تأیید چاپ می کند.
خروجی نمونه:
Tensor A:
tensor([[ 0.1234, -1.2345, 0.5678],
[ 1.2345, -0.5678, 1.3456]])
Shape of Tensor A: torch.Size([2, 3])
Tensor B:
tensor([[ 0.6789, -1.8901, 0.4567],
[ 1.8901, -0.3456, 1.6789]])
Shape of Tensor B: torch.Size([2, 3])
Element-wise Addition:
tensor([[ 0.8023, -3.1246, 2.1245],
[ 3.1246, -0.9134, 3.0245]])
Element-wise Multiplication:
tensor([[ 0.0841, 2.1974, 0.2578],
[ 2.3456, 0.1944, 2.2690]])
Matrix Multiplication (A @ B^T):
tensor([[ 0.1234*0.6789 + (-1.2345)*1.8901 + 0.5678*1.8901,
0.1234*(-1.8901) + (-1.2345)*(-0.3456) + 0.5678*1.6789],
[1.2345*0.6789 + (-0.5678)*1.8901 + 1.3456*1.8901,
1.2345*(-1.8901) + (-0.5678)*(-0.3456) + 1.3456*1.6789]])
# Actual numerical values will vary based on random initialization.
Sliced Tensor A (first two elements of each row):
tensor([[ 0.1234, -1.2345],
[ 1.2345, -0.5678]])
Shape of Sliced Tensor: torch.Size([2, 2])
Reshaped Tensor B to (3, 2):
tensor([[ 0.6789, -1.8901],
[ 0.4567, 1.8901],
[-0.3456, 1.6789]])
Shape of Reshaped Tensor B: torch.Size([3, 2])
Stacked Tensor A and B along new dimension 0:
tensor([[[ 0.1234, -1.2345, 0.5678],
[ 1.2345, -0.5678, 1.3456]],
[[ 0.6789, -1.8901, 0.4567],
[ 1.8901, -0.3456, 1.6789]]])
Shape of Stacked Tensor: torch.Size([2, 2, 3])
Transposed Stacked Tensor (swap dim 1 and 2):
tensor([[[ 0.1234, 1.2345],
[-1.2345, -0.5678],
[ 0.5678, 1.3456]],
[[ 0.6789, 1.8901],
[-1.8901, -0.3456],
[ 0.4567, 1.6789]]])
Shape of Transposed Stacked Tensor: torch.Size([2, 3, 2])
توجه: مقادیر عددی هر بار که اسکریپت را اجرا می کنید به دلیل استفاده از مقداردهی اولیه تانسور تصادفی متفاوت خواهد بود.
6. خلاصه
امروز، شما به اصول اولیه آن پرداخته اید تانسورهای PyTorchکاوش در ساختار، ویژگی ها و تکنیک های مختلف ایجاد و دستکاری آنها. در اینجا خلاصه ای مختصر از آنچه انجام داده اید آورده شده است:
-
درک تانسورها:
- تعریف و اهمیت تانسورها در یادگیری عمیق را درک کرد.
- در مورد رتبه های تانسور (ابعاد) و نحوه نمایش ساختارهای داده های مختلف یاد گرفت.
- ویژگی های تانسور کاوش شده: شکل، نوع داده (
dtype
و محل قرارگیری دستگاه (CPU/GPU).
-
ایجاد تانسور:
- ایجاد تانسور با استفاده از روش های متنوعی مانند
torch.tensor
،torch.zeros
،torch.ones
،torch.arange
، وtorch.linspace
. - نحوه تعیین انواع داده ها و دستگاه ها را در حین ایجاد تانسور درک کرد.
- ایجاد تانسور با استفاده از روش های متنوعی مانند
-
دستکاری تانسور:
- انجام عملیات حسابی (جمع، ضرب، تقسیم) هم از نظر عنصر و هم از طریق ضرب ماتریس.
- نمایه سازی و برش برای دسترسی و اصلاح عناصر تانسور خاص انجام شده است.
- تانسورهای تغییر شکل با استفاده از
reshape
وview
، اطمینان از سازگاری ابعادی. - تانسورهای الحاقی و انباشته برای ترکیب داده ها در امتداد ابعاد موجود یا جدید.
- تانسورهای جابجا شده با استفاده از
transpose
وpermute
برای تنظیم مجدد ابعاد برای نیازهای محاسباتی مختلف.
-
کاربرد عملی:
- اعمال تانسور از طریق تمرینات عملی، تقویت دانش نظری با مهارت های عملی.
تسلط بر این عملیات تانسور بسیار مهم است زیرا تانسورها ستون فقرات همه محاسبات در مدل های یادگیری عمیق را تشکیل می دهند. توانایی ایجاد، دستکاری و استفاده کارآمد از تانسورها، شما را قادر می سازد تا شبکه های عصبی پیچیده را به طور موثر بسازید و آموزش دهید.
7. منابع اضافی
برای تقویت بیشتر درک و مهارت خود با تانسورهای PyTorch و اصول یادگیری عمیق، منابع زیر را بررسی کنید:
-
اسناد رسمی PyTorch:
-
آموزش PyTorch:
-
کتاب ها:
- یادگیری عمیق با PyTorch توسط الی استیونز، لوکا آنتیگا و توماس ویهمن.
- برنامه نویسی PyTorch برای یادگیری عمیق توسط ایان پوینتر
-
دوره های آنلاین:
-
انجمن انجمن و پشتیبانی:
-
وبلاگ ها و مقالات:
-
کانال های یوتیوب:
نکاتی برای یادگیری مداوم:
- تمرین عملی: به طور منظم عملیات تانسور را اجرا کنید و با سناریوهای مختلف آزمایش کنید تا درک خود را عمیق تر کنید.
- تعامل با جامعه: در انجمن ها شرکت کنید، سوال بپرسید و در پروژه ها همکاری کنید تا بینش های متنوعی به دست آورید.
- ساخت پروژه ها: مهارت های دستکاری تانسور خود را در پروژه های دنیای واقعی، مانند طبقه بندی تصویر، پردازش زبان طبیعی یا تجزیه و تحلیل سری های زمانی، به کار ببرید.
- به روز بمانید: کانال ها و مخازن رسمی PyTorch را دنبال کنید تا از آخرین به روز رسانی ها، ویژگی ها و بهترین شیوه ها مطلع شوید.
با استفاده از این منابع و حفظ یک روال تمرین مداوم، تسلط قوی بر تانسورهای PyTorch خواهید داشت و راه را برای تلاشهای پیشرفته یادگیری عمیق هموار میکنید.
یادگیری و کدنویسی مبارک!