突破Pytorch核心,Tensor ??!
今天會(huì)把Pytorch在張量這方面的內(nèi)容做一個(gè)記錄。
同時(shí)希望可以給大家提供一丟丟幫助!
因?yàn)榻駜悍窒淼膬?nèi)容,絕對(duì)是非常干貨的一些示例。
先簡(jiǎn)單介紹下,在PyTorch中,張量是核心數(shù)據(jù)結(jié)構(gòu),它是一個(gè)多維數(shù)組,類似于NumPy中的數(shù)組。張量不僅僅是存儲(chǔ)數(shù)據(jù)的容器,還是進(jìn)行各種數(shù)學(xué)運(yùn)算和深度學(xué)習(xí)操作的基礎(chǔ)。
下面從三方面做一個(gè)總結(jié):
- 張量的概念
- 張量的原理
- 張量的操作
圖片
張量的概念
1.張量的定義
張量是一種多維數(shù)組,它可以是標(biāo)量(零維數(shù)組)、向量(一維數(shù)組)、矩陣(二維數(shù)組)或具有更高維度的數(shù)組。
在PyTorch中,張量是torch.Tensor的實(shí)例,可以通過不同的方式創(chuàng)建,如直接從Python列表、NumPy數(shù)組或通過特定函數(shù)生成。
import torch
# 創(chuàng)建一個(gè)標(biāo)量
scalar_tensor = torch.tensor(3.14)
# 創(chuàng)建一個(gè)向量
vector_tensor = torch.tensor([1, 2, 3])
# 創(chuàng)建一個(gè)矩陣
matrix_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 創(chuàng)建一個(gè)3D張量
tensor_3d = torch.rand((2, 3, 4)) # 2行3列4深度
2.張量的屬性
每個(gè)張量都有一些重要的屬性,包括形狀(shape)、數(shù)據(jù)類型(dtype)和設(shè)備(device)。
# 獲取張量的形狀
shape = tensor_3d.shape
# 獲取張量的數(shù)據(jù)類型
dtype = tensor_3d.dtype
# 獲取張量所在的設(shè)備
device = tensor_3d.device
3.張量的形狀
張量的形狀定義了其維度和每個(gè)維度上的大小。例如,形狀為(2, 3, 4)的張量具有2行、3列和4個(gè)深度。形狀對(duì)于理解和操作張量非常重要。
# 獲取張量的形狀
shape = tensor_3d.shape
# 改變張量的形狀
reshaped_tensor = tensor_3d.view(3, 8) # 將原始形狀(2, 3, 4)變?yōu)?3, 8)
張量的原理
PyTorch中的張量是基于Tensor類實(shí)現(xiàn)的,它提供了對(duì)底層存儲(chǔ)的抽象。
張量包含三個(gè)主要組件:
- 存儲(chǔ)(storage)
- 形狀(shape)
- 步幅(stride)
1.存儲(chǔ)
(Storage)存儲(chǔ)是實(shí)際存儲(chǔ)數(shù)據(jù)的地方,它是一塊連續(xù)的內(nèi)存區(qū)域。多個(gè)張量可以共享相同的存儲(chǔ),從而減少內(nèi)存消耗。存儲(chǔ)中的數(shù)據(jù)按照張量的形狀進(jìn)行排列。
# 獲取張量的存儲(chǔ)
storage = tensor_3d.storage()
2.形狀(Shape)
張量的形狀定義了其維度和每個(gè)維度上的大小。形狀信息有助于解釋存儲(chǔ)中數(shù)據(jù)的組織方式。
# 獲取張量的形狀
shape = tensor_3d.shape
3.步幅(Stride)
步幅是指在存儲(chǔ)中移動(dòng)到下一個(gè)元素所需的步數(shù)。了解步幅有助于理解在張量中進(jìn)行索引和切片時(shí)的性能。
# 獲取張量的步幅
stride = tensor_3d.stride()
張量的操作
PyTorch提供了豐富的張量操作,包括數(shù)學(xué)運(yùn)算、邏輯運(yùn)算、索引和切片等。
這里列舉最最常見的集中操作:
1.數(shù)學(xué)運(yùn)算
# 加法
result_add = tensor_3d + 2
# 乘法
result_mul = tensor_3d * 3
# 矩陣乘法
matrix_a = torch.rand((2, 3))
matrix_b = torch.rand((3, 4))
result_matmul = torch.mm(matrix_a, matrix_b)
2. 邏輯運(yùn)算
# 大小比較
result_compare = tensor_3d > 0.5
# 邏輯運(yùn)算
result_logical = torch.logical_and(result_add, result_compare)
3. 索引和切片
# 索引
element = tensor_3d[0, 1, 2]
# 切片
sliced_tensor = tensor_3d[:, 1:3, :]
4. 形狀操作
# 改變形狀
reshaped_tensor = tensor_3d.view(3, 8)
# 轉(zhuǎn)置
transposed_tensor = tensor_3d.transpose(0, 2)
5.廣播
廣播是一種自動(dòng)擴(kuò)展張量的操作,使得形狀不同的張量可以進(jìn)行逐元素的數(shù)學(xué)運(yùn)算。
# 廣播
tensor_a = torch.rand((1, 3, 1))
tensor_b = torch.rand((2, 1, 4))
result_broadcast = tensor_a + tensor_b
最后
今兒介紹的是關(guān)于PyTorch中張量的基礎(chǔ)概念、原理以及常見操作。
張量作為深度學(xué)習(xí)中的基本數(shù)據(jù)結(jié)構(gòu),對(duì)于理解和實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)非常關(guān)鍵。