برنامه نویسی

PyTorch Day 02: PyTorch Tensor Basics

فهرست مطالب

  1. مقدمه
  2. درک تنسورها

  3. ایجاد و دستکاری تانسور

  4. تمرینات عملی

  5. راه حل ها و توضیحات

  6. خلاصه
  7. منابع اضافی

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: کاوش ویژگی های تانسور

وظیفه:

  1. یک تانسور سه بعدی با شکل ایجاد کنید (4, 3, 2).
  2. شکل، نوع داده و دستگاه آن را چاپ کنید.
  3. نوع داده را به تغییر دهید torch.float64 و آن را به GPU (در صورت وجود) منتقل کنید.
  4. با چاپ ویژگی های به روز شده، تغییرات را تأیید کنید.

4.2. تمرین 2: ایجاد تنسورهای مختلف

وظیفه:

  1. تانسورهای زیر را ایجاد کنید:
    • تانسور صفر با شکل (5, 5).
    • تانسور یکهایی با شکل (3, 4).
    • یک تانسور با مقادیر از 0 به 9 با استفاده از torch.arange.
    • یک تانسور با 50 نقاط با فاصله خطی بین 0 و 1 با استفاده از torch.linspace.
  2. چاپ هر تانسور و ویژگی های آن.

4.3. تمرین 3: عملیات دستکاری تانسور

وظیفه:

  1. دو تانسور دو بعدی ایجاد کنید:
    • tensor_a با شکل (2, 3) حاوی مقادیر تصادفی
    • tensor_b با شکل (2, 3) حاوی مقادیر تصادفی
  2. عملیات زیر را انجام دهید:
    • علاوه بر عنصر.
    • ضرب عنصری.
    • ضرب ماتریس (torch.matmul).
  3. برش tensor_a برای استخراج دو عنصر اول هر ردیف.
  4. تغییر شکل دهید tensor_b به (3, 2).
  5. الحاق tensor_a و tensor_b در امتداد بعد اول
  6. پشته tensor_a و tensor_b در امتداد یک بعد جدید
  7. تانسور انباشته را جابجا کنید.
  8. نتایج هر عملیات را چاپ کنید.

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
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح:

  1. ایجاد تانسور: یک تانسور سه بعدی با مقادیر و شکل تصادفی را راه اندازی می کند (4, 3, 2).
  2. چاپ صفت: شکل تانسور، نوع داده (torch.float32 به طور پیش فرض)، و دستگاه (cpu).
  3. نوع داده و تغییر دستگاه: استفاده می کند .to() روشی برای تغییر نوع داده به torch.float64 و تانسور را به GPU منتقل می کند (cuda) در صورت موجود بودن
  4. تایید: برای تأیید تغییرات، ویژگی های تانسور به روز شده را چاپ می کند.

خروجی نمونه:

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)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح:

  1. تانسور صفرها: الف را ایجاد می کند (5, 5) تانسور پر از صفر
  2. تانسور یکها: الف را ایجاد می کند (3, 4) تانسور پر از یکها
  3. تانسور با torch.arange: یک تانسور 1 بعدی با مقادیر از تولید می کند 0 به 9.
  4. تانسور با torch.linspace: یک تانسور 1 بعدی با 50 مقادیر مساوی بین 0 و 1.
  5. چاپ صفت: برای هر تانسور، شکل، نوع داده و دستگاه خود را برای تأیید ایجاد چاپ می‌کند.

خروجی نمونه:

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])
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح:

  1. ایجاد تانسور: دو تصادفی را مقدار دهی اولیه می کند (2, 3) تانسورها، tensor_a و tensor_b.
  2. عملیات حسابی:

    • اضافه عنصر: عناصر مربوطه را اضافه می کند tensor_a و tensor_b.
    • ضرب عنصری: عناصر متناظر را ضرب می کند tensor_a و tensor_b.
    • ضرب ماتریس: ضرب ماتریس بین را انجام می دهد tensor_a و جابجایی از tensor_b برای اطمینان از سازگاری ابعادی، در نتیجه الف (2, 2) تانسور
  3. برش دادن: دو عنصر اول را از هر ردیف استخراج می کند tensor_a، در نتیجه الف (2, 2) تانسور
  4. تغییر شکل: شکل را تغییر می دهد tensor_b از (2, 3) به (3, 2).
  5. الحاق و انباشته شدن:

    • الحاق: تلاش شد اما به دلیل عدم تطابق شکل ناسازگار یافت شد.
    • روی هم چیدن: در عوض، پشته tensor_a و tensor_b در امتداد یک بعد جدید، در نتیجه الف (2, 2, 3) تانسور
  6. جابجایی تانسور انباشته: بعد دوم و سوم تانسور انباشته را جابجا می کند و در نتیجه a (2, 3, 2) تانسور
  7. چاپ صفت: پس از هر عملیات، تانسور حاصل و شکل آن را برای تأیید چاپ می کند.

خروجی نمونه:

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 خواهید داشت و راه را برای تلاش‌های پیشرفته یادگیری عمیق هموار می‌کنید.


یادگیری و کدنویسی مبارک!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا