เทนเซอร์ PyTorch: การสร้าง การดำเนินการ และการถ่ายโอนไปยัง GPU
ผู้เรียนจะสร้างเทนเซอร์จากรายการ Python และอาร์เรย์ NumPy ดำเนินการแบบสมาชิกต่อสมาชิกและการดำเนินการเมทริกซ์ และย้ายเทนเซอร์ไปยัง GPU ด้วย .to('cuda')
เทนเซอร์ PyTorch: การสร้าง การดำเนินการ และการถ่ายโอนไปยัง GPU เป็นบทเรียน Machine Learning Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Machine Learning Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
เทนเซอร์ของ PyTorch คืออะไร
เทนเซอร์คือโครงสร้างข้อมูลพื้นฐานใน PyTorch ซึ่งโดยสาระแล้วคืออาร์เรย์หลายมิติที่คล้ายกับอาร์เรย์ของ NumPy แต่มีการรองรับ GPU และการหาอนุพันธ์อัตโนมัติในตัว เทนเซอร์อาจเป็นสเกลาร์ (0 มิติ), เวกเตอร์ (1 มิติ), เมทริกซ์ (2 มิติ) หรือโครงสร้างที่มีมิติสูงกว่า เทนเซอร์ของ PyTorchจะติดตามประวัติการคำนวณ ทำให้สามารถคำนวณเกรเดียนต์โดยอัตโนมัติสำหรับการฝึกสอนโครงข่ายประสาทเทียม
import torch
# Scalar (0-dimensional tensor)
scalar = torch.tensor(3.14)
print(scalar.shape) # torch.Size([])
# Vector (1D)
vector = torch.tensor([1.0, 2.0, 3.0])
print(vector.shape) # torch.Size([3])
# Matrix (2D)
matrix = torch.tensor([[1, 2], [3, 4]])
print(matrix.shape) # torch.Size([2, 2])การสร้างเทนเซอร์: วิธีการทั่วไป
PyTorch มีฟังก์ชันสร้างเทนเซอร์จากโรงงานมากมายสำหรับสร้างเทนเซอร์ที่มีค่าและรูปร่างเฉพาะ torch.zeros และ torch.ones เติมค่าคงที่ลงในเทนเซอร์, torch.rand สุ่มตัวอย่างจากการกระจายแบบสม่ำเสมอ และ torch.randn สุ่มตัวอย่างจากการกระจายปกติมาตรฐาน สิ่งเหล่านี้เป็นองค์ประกอบพื้นฐานสำหรับการเริ่มต้นค่าน้ำหนักและการสร้างข้อมูลสังเคราะห์
import torch
zeros = torch.zeros(3, 4) # 3x4 matrix of zeros
ones = torch.ones(2, 3) # 2x3 matrix of ones
rand_uniform = torch.rand(3, 3) # uniform in [0, 1)
rand_normal = torch.randn(3, 3) # standard normal N(0,1)
arange = torch.arange(0, 10, 2) # [0, 2, 4, 6, 8]
print(zeros.dtype) # torch.float32 (default)
print(arange) # tensor([0, 2, 4, 6, 8])การสร้างเทนเซอร์จากอาร์เรย์ NumPy
โดยบ่อยครั้งคุณจะเริ่มจากอาร์เรย์ NumPy (จาก Pandas, scikit-learn และอื่น ๆ) แล้วต้องแปลงเป็นเทนเซอร์ของ PyTorch torch.from_numpy ใช้หน่วยความจำร่วมกับอาร์เรย์ NumPy ดังนั้นการแก้ไขอย่างใดอย่างหนึ่งจะทำให้อีกอย่างเปลี่ยนแปลงไปด้วย ในทางกลับกัน torch.tensor จะสร้างสำเนา การรู้ว่าควรใช้แบบใดช่วยป้องกันข้อผิดพลาดที่ไม่คาดคิดในกระบวนการข้อมูล
import torch
import numpy as np
arr = np.array([1.0, 2.0, 3.0])
# Shares memory with arr
t_shared = torch.from_numpy(arr)
# Makes an independent copy
t_copy = torch.tensor(arr)
arr[0] = 99.0
print(t_shared) # tensor([99., 2., 3.]) <- changed
print(t_copy) # tensor([1., 2., 3.]) <- unchangedชนิดข้อมูลของเทนเซอร์ (dtypes)
เทนเซอร์มี dtype ซึ่งควบคุมความแม่นยำเชิงตัวเลขและการใช้หน่วยความจำ ค่าเริ่มต้นคือ torch.float32 ซึ่งเป็นมาตรฐานสำหรับน้ำหนักของโครงข่ายประสาทเทียม torch.float64 ให้ความแม่นยำสูงกว่าแต่ใช้หน่วยความจำเพิ่มเป็นสองเท่า ส่วน torch.int64 ใช้สำหรับป้ายกำกับจำนวนเต็ม ชนิดข้อมูลที่ไม่ตรงกันจะทำให้เกิดข้อผิดพลาดขณะทำงาน ดังนั้นควรตรวจสอบและแปลงชนิดอย่างชัดเจนด้วย .float() หรือ .to(dtype) เสมอ
import torch
f32 = torch.tensor([1.0, 2.0]) # float32 by default
f64 = torch.tensor([1.0, 2.0], dtype=torch.float64)
i64 = torch.tensor([1, 2, 3]) # int64 by default
print(f32.dtype) # torch.float32
print(i64.dtype) # torch.int64
# Cast to float32
labels = i64.float()
print(labels.dtype) # torch.float32การดำเนินการเลขคณิตแบบสมาชิกต่อสมาชิก
PyTorch ทำให้ตัวดำเนินการเลขคณิตมาตรฐานของ Python ทำงานกับเทนเซอร์ที่มีรูปร่างเดียวกันแบบสมาชิกต่อสมาชิกได้ ทั้งการบวก, การลบ, การคูณ และการหารล้วนทำงานแบบสมาชิกต่อสมาชิก การดำเนินการเหล่านี้ได้รับการปรับให้เหมาะสมอย่างมาก และจะทำงานบน GPU เมื่อเทนเซอร์อยู่บนอุปกรณ์ CUDA การดำเนินการแบบแก้ไขในตำแหน่งเดิม (เช่น add_) จะแก้ไขเทนเซอร์โดยตรงโดยไม่จัดสรรหน่วยความจำใหม่
import torch
a = torch.tensor([1.0, 2.0, 3.0])
b = torch.tensor([4.0, 5.0, 6.0])
print(a + b) # tensor([5., 7., 9.])
print(a * b) # tensor([ 4., 10., 18.])
print(b / a) # tensor([4., 2.5, 2.])
print(a ** 2) # tensor([1., 4., 9.])
# In-place add
a.add_(1.0)
print(a) # tensor([2., 3., 4.])การคูณเมทริกซ์ด้วย torch.matmul
การคูณเมทริกซ์เป็นการดำเนินการหลักภายในเลเยอร์ของโครงข่ายประสาทเทียมทุกเลเยอร์ torch.matmul (หรือโอเปอเรเตอร์ @) ใช้คูณเมทริกซ์ และจัดการกลุ่มเมทริกซ์โดยอัตโนมัติด้วยการกระจายรูปร่าง สำหรับข้อมูลนำเข้า 2 มิติ จะคำนวณผลคูณเมทริกซ์มาตรฐาน ส่วนข้อมูลนำเข้า 3 มิติขึ้นไป จะคำนวณการคูณเมทริกซ์เป็นกลุ่ม นี่คือวิธีที่เลเยอร์เชิงเส้นคำนวณ output = input @ weight.T + bias
import torch
A = torch.randn(3, 4) # 3x4
B = torch.randn(4, 5) # 4x5
C = torch.matmul(A, B) # 3x5
print(C.shape) # torch.Size([3, 5])
# Equivalent using @ operator
C2 = A @ B
print(torch.allclose(C, C2)) # True
# Batched matmul
batch_A = torch.randn(8, 3, 4) # batch of 8 matrices
batch_B = torch.randn(8, 4, 5)
result = batch_A @ batch_B # torch.Size([8, 3, 5])การปรับรูปร่างเทนเซอร์: view และ reshape
การเปลี่ยนรูปร่างของเทนเซอร์โดยไม่เปลี่ยนข้อมูลเป็นการดำเนินการที่พบบ่อยที่สุดอย่างหนึ่งในดีปเลิร์นนิง view กำหนดให้เทนเซอร์ต้องอยู่ติดกันในหน่วยความจำ และส่งคืนมุมมองที่ใช้ข้อมูลร่วมกัน ส่วน reshape ทำงานกับเทนเซอร์ที่ไม่อยู่ติดกันได้ โดยจะคัดลอกข้อมูลหากจำเป็น ใช้ -1 เป็นมิติแทนค่า แล้ว PyTorch จะอนุมานขนาดที่ถูกต้องให้ การทำให้แผนผังคุณลักษณะ 2 มิติแบนราบเป็นเวกเตอร์ 1 มิติก่อนส่งเข้าเลเยอร์เชิงเส้นเป็นกรณีการใช้งานทั่วไป
import torch
t = torch.arange(12).float() # tensor of 12 elements
print(t.shape) # torch.Size([12])
m = t.view(3, 4) # reshape to 3x4
print(m.shape) # torch.Size([3, 4])
m2 = t.view(2, -1) # PyTorch infers 6 columns
print(m2.shape) # torch.Size([2, 6])
# Flatten to 1D
flat = m.reshape(-1)
print(flat.shape) # torch.Size([12])การกระจายรูปร่าง: การทำงานกับรูปร่างที่แตกต่างกัน
การกระจายรูปร่างช่วยให้ PyTorch ดำเนินการกับเทนเซอร์ที่มีรูปร่างแตกต่างกันได้ โดยขยายมิติโดยนัย กฎนี้นำมาจาก NumPy: มิติจะถูกจัดให้ตรงกันจากด้านขวา และมิติที่มีขนาด 1 สามารถยืดให้ตรงกับเทนเซอร์อีกตัวได้ การกระจายรูปร่างช่วยหลีกเลี่ยงการทำสำเนาข้อมูลแบบแบ่งซ้ำอย่างชัดเจน จึงประหยัดหน่วยความจำ และถูกใช้อย่างต่อเนื่องในเลเยอร์โครงข่ายประสาทเทียมเพื่อบวกเวกเตอร์ไบแอสเข้ากับเมทริกซ์ผลลัพธ์แบบกลุ่ม
import torch
# Matrix (3x4) + vector (4,) -- vector broadcast over rows
matrix = torch.ones(3, 4)
bias = torch.tensor([1.0, 2.0, 3.0, 4.0]) # shape (4,)
result = matrix + bias
print(result.shape) # torch.Size([3, 4])
print(result[0]) # tensor([2., 3., 4., 5.])
# Column vector (3,1) * row vector (1,4) -> (3,4)
col = torch.arange(1, 4).float().unsqueeze(1) # (3,1)
row = torch.arange(1, 5).float().unsqueeze(0) # (1,4)
print((col * row).shape) # torch.Size([3, 4])การตรวจสอบอุปกรณ์: CPU กับ CUDA
เทนเซอร์แต่ละตัวอยู่บนอุปกรณ์หนึ่งชนิด ได้แก่ cpu หรือ GPU ของ CUDA เช่น cuda:0 การตรวจสอบว่าอุปกรณ์พร้อมใช้งานหรือไม่ด้วย torch.cuda.is_available() ช่วยให้คุณเขียนโค้ดที่ไม่ผูกกับอุปกรณ์ได้ เทนเซอร์ทั้งหมดที่เกี่ยวข้องกับการคำนวณต้องอยู่บนอุปกรณ์เดียวกัน การพยายามบวกเทนเซอร์บน CPU กับเทนเซอร์บน GPU จะทำให้เกิดข้อผิดพลาดขณะทำงาน รูปแบบมาตรฐานคือสร้างตัวแปร device แล้วย้ายทุกอย่างไปยังอุปกรณ์นั้น
import torch
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)
# Create tensor directly on the chosen device
t = torch.randn(3, 3, device=device)
print(t.device)
# Move an existing CPU tensor to the device
cpu_tensor = torch.tensor([1.0, 2.0, 3.0])
gpu_tensor = cpu_tensor.to(device)
print(gpu_tensor.device)การย้ายเทนเซอร์ไปยัง GPU ด้วย .to('cuda')
การฝึกสอนโครงข่ายประสาทเทียมบน GPU อาจเร็วกว่า CPU 10–100 เท่าสำหรับโมเดลขนาดใหญ่ หลังยืนยันว่า CUDA พร้อมใช้งานแล้ว ให้ย้ายเทนเซอร์ไปยัง GPU ด้วย .to('cuda') หรือ .cuda() ย้ายเทนเซอร์กลับไปยัง CPU เพื่อแปลงเป็น NumPy ด้วย .cpu() (NumPy ไม่สามารถเข้าถึงหน่วยความจำ GPU ได้โดยตรง) การเรียกใช้ .detach() จะนำเทนเซอร์ออกจากกราฟการคำนวณก่อนแปลงเป็น NumPy
import torch
# Simulate GPU workflow (falls back to CPU gracefully)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Move model weights and data to GPU
weights = torch.randn(256, 128).to(device)
inputs = torch.randn(32, 128).to(device) # batch of 32
outputs = inputs @ weights.T # matmul on device
print(outputs.shape) # torch.Size([32, 256])
# Convert back to NumPy for visualization
np_out = outputs.detach().cpu().numpy()
print(type(np_out)) # <class 'numpy.ndarray'>แอตทริบิวต์และเครื่องมืออรรถประโยชน์ของเทนเซอร์ที่มีประโยชน์
แอตทริบิวต์ของเทนเซอร์และฟังก์ชันอรรถประโยชน์หลายรายการมีความสำคัญต่อการแก้ไขข้อบกพร่องและการปรับรูปร่างข้อมูล .shape แสดงมิติ, .numel() ส่งคืนจำนวนสมาชิกทั้งหมด, .dtype แสดงชนิดข้อมูล และ .requires_grad ระบุว่าจะติดตามเกรเดียนต์หรือไม่ ฟังก์ชันอย่าง torch.cat, torch.stack และ torch.squeeze ถูกใช้เป็นประจำเพื่อรวมกลุ่มข้อมูลและนำมิติที่มีขนาด 1 ออก
import torch
t = torch.randn(4, 3, 2)
print(t.shape) # torch.Size([4, 3, 2])
print(t.numel()) # 24
print(t.dtype) # torch.float32
# Concatenate along dim 0
a = torch.ones(2, 3)
b = torch.zeros(3, 3)
cat = torch.cat([a, b], dim=0) # shape (5, 3)
print(cat.shape)
# Remove size-1 dimensions
x = torch.randn(1, 5, 1)
print(x.squeeze().shape) # torch.Size([5])ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับแนวคิดแมชชีนเลิร์นนิงด้วย Python จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า: เทนเซอร์เป็นโครงสร้างข้อมูลหลักของ PyTorch ซึ่งรองรับอาร์เรย์หลายมิติบน CPU หรือ GPU, ฟังก์ชันสร้างอย่าง torch.zeros, torch.randn และ torch.from_numpy ช่วยให้เริ่มต้นข้อมูลได้อย่างยืดหยุ่น และการย้ายเทนเซอร์ไปยัง GPUด้วย .to(device) เป็นขั้นตอนสำคัญในการเร่งการฝึกสอนดีปเลิร์นนิง บทถัดไปเราจะสำรวจการหาอนุพันธ์อัตโนมัติด้วย Autograd
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “เทนเซอร์ PyTorch: การสร้าง การดำเนินการ และการถ่ายโอนไปยัง GPU” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เทนเซอร์ PyTorch: การสร้าง การดำเนินการ และการถ่ายโอนไปยัง GPU” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Machine Learning Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เทนเซอร์ PyTorch: การสร้าง การดำเนินการ และการถ่ายโอนไปยัง GPU”
ผู้เรียนจะสร้างเทนเซอร์จากรายการ Python และอาร์เรย์ NumPy ดำเนินการแบบสมาชิกต่อสมาชิกและการดำเนินการเมทริกซ์ และย้ายเทนเซอร์ไปยัง GPU ด้วย .to('cuda') คุณปฏิบัติ Machine Learning Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Machine Learning Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Machine Learning Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เทนเซอร์ PyTorch: การสร้าง การดำเนินการ และการถ่ายโอนไปยัง GPU” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Machine Learning Academy นี้ได้ไหม
ได้ บทเรียน Machine Learning Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เทนเซอร์ PyTorch: การสร้าง การดำเนินการ และการถ่ายโอนไปยัง GPU
- Autograd: การหาอนุพันธ์อัตโนมัติสำหรับการแพร่ย้อนกลับ
- การสร้างเครือข่ายแบบป้อนไปข้างหน้าด้วย nn.Module
- วงรอบการฝึก: ค่าความสูญเสีย ตัวปรับปรุง และยุคการฝึก