清理庫存4~
PyTorch 中文手冊(pytorch handbook):
https://
pytorch-cn。readthedocs。io
/zh/latest/
(官方中文版)
英文版:
PyTorch是一個Python包,提供兩個高階功能:
具有強大的GPU加速的張量計算(如NumPy)
包含自動求導系統的的深度神經網路
基於Python的科學計算包,服務於以下兩種場景:
作為NumPy的替代品,可以使用GPU的強大計算能力
提供最大的靈活性和高速的深度學習研究平臺
Tensors(張量)
Tensors與Numpy中的 ndarrays類似
,但是在PyTorch中 Tensors 可以使用GPU進行計算。
PyTorch支援各種型別的張量。
根據現有的張量建立張量,使用size方法與Numpy的shape屬性返回的相同,張量也支援shape屬性.
【注意】
`torch。Size` 返回值是 tuple型別, 所以它支援tuple型別的所有操作。
【注意】:
torch。Tensor
預設的是torch.float資料型別
。
輸出的四種結果都一樣:
【重點理解】:Pytorch 張量維度
可參考:
函式dim()可以返回張量的維度,shape屬性與成員函式size()返回張量的具體維度分量。
dim=0的標量
維度為0的Tensor為標量,標量一般用在Loss這種地方。如下程式碼定義了一個標量:
定義標量的方式很簡單,只要在tensor函式中傳入一個標量初始化的值即可,注意是具體的資料。
dim=1的張量
dim=1的Tensor一般用在Bais這種地方,或者神經網路線性層的輸入Linear Input,例如MINST資料集的一張圖片用shape=[784]的Tensor來表示。
dim=1相當於只有一個維度,但是
這個維度上可以有多個分量(就像一維陣列一樣)
,一維的張量實現方法有很多,下面是三種實現:
注意:維度為1時,shape和size返回的是元素個數。
dim=2的張量
dim=2的張量一般用在帶有batch的Linear Input,例如MNIST資料集的k張圖片如果放再一個Tensor裡,那麼shape=[k,784]。
從上面可以看出,可以取到Tensor每一維度的分量 。
dim=3的張量
dim=3的張量很適合用於RNN和NLP,如20句話,每句話10個單詞,每個單詞用100個分量的向量表示,得到的Tensor就是shape=[20,10,100]。
注意:c=a[1]就會報錯,因為只有1個a[0]
dim=4的張量
dim=4的張量適合用於CNN表示影象,例如100張MNIST手寫資料集的灰度圖(通道數為1,如果是RGB影象通道數就是3),每張圖高=28畫素,寬=28畫素,所以這個Tensor的shape=[100,1,28,28],也就是一個batch的資料維度:[batch_size,channel,height,width] 。
注意:在維度上取值:
輸出:
注意:按行取值
總結:
在同構的意義下,第零階張量 (r = 0) 為標量 (Scalar),第一階張量 (r = 1) 為向量 (Vector), 第二階張量 (r = 2) 則成為矩陣 (Matrix),第三階以上的統稱為多維張量。
對於標量,我們可以直接使用 。item() 從中取出其對應的python物件的數值。
特別的:如果張量中只有一個元素的tensor也可以呼叫
tensor。item
方法。
基本型別
Tensor的基本資料型別有五種:
32位浮點型:torch。FloatTensor。 (預設)
64位整型:torch。LongTensor。
32位整型:torch。IntTensor。
16位整型:torch。ShortTensor。
64位浮點型:torch。DoubleTensor。
除以上數字型別外,還有 byte和chart型。
裝置間轉換
一般情況下可以使用。cuda方法將tensor移動到gpu,這步操作需要cuda裝置支援。
使用。cpu方法將tensor移動到cpu。
如果我們有多GPU的情況,可以使用to方法來確定使用那個裝置。
常用方法:
【PyTorch】Tensor和tensor的區別
可參考:
https://
blog。csdn。net/tfcy694/a
rticle/details/85338745
torch.Tensor()是python類,更明確地說,是預設張量型別torch.FloatTensor()的別名,
torch。Tensor([1,2])會呼叫Tensor類的建構函式__init__,生成單精度浮點型別的張量。
而torch。tensor()僅僅是python函式,函式原型是:
torch。tensor(data, dtype=None, device=None, requires_grad=False)
其中data可以是:list, tuple, NumPy ndarray, scalar和其他型別。
主要區別有以下兩點:
torch。tensor會從data中的資料部分做複製(而不是直接引用),根據原始資料型別生成相應的torch。LongTensor、torch。FloatTensor和torch。DoubleTensor。而torch。Tensor()只能指定資料型別為torch。float。
torch.tensor()引數接收的是具體的資料
,
而torch.Tensor()引數既可以接收資料也可以接收維度分量也就是shape。
Pytorch中tensor常用語法:
https://
blog。csdn。net/weixin_44
538273/article/details/88400805
torch.numel
返回input 張量中的元素個數。
torch。numel(input)->int
計算Tensor中元素的數目:
torch.sum(input, dim, keepdim=False, out=None)
→ Tensor
返回新的張量,其中包括輸入張量input中指定維度dim中每行的和。其中,sum預設為每列的和。torch。sum(input) : 返回所有元素的之和。
torch.linspace
torch。linspace(start, end, steps=100, out=
None
) → Tensor
返回一個1維張量,包含在區間
start
和
end
上均勻間隔的
steps
個點。 輸出1維張量的長度為
steps
。
引數:
start (float) – 序列的起始點
end (float) – 序列的最終值
steps (int) – 在
start
和
end
間生成的樣本數
out (Tensor, optional) – 結果張量
torch.logspace
torch。logspace(start, end, steps=100, out=
None
) → Tensor
返回一個1維張量,包含在區間 10start10start 和 10end10end上以對數刻度均勻間隔的
steps
個點。 輸出1維張量的長度為
steps
。
引數:
start (float) – 序列的起始點
end (float) – 序列的最終值
steps (int) – 在
start
和
end
間生成的樣本數
out (Tensor, optional) – 結果張量
torch.rand
torch。rand(*sizes, out=
None
) → Tensor
返回一個張量,
包含了從區間[0,1)的均勻分佈中抽取的一組隨機數,
形狀由可變引數
sizes
定義。
torch.randn
torch。randn(*sizes, out=
None
) → Tensor
返回一個張量,
包含了從標準正態分佈(均值為0,方差為 1,即高斯白噪聲)中抽取一組隨機數
,形狀由可變引數
sizes
定義。
torch.randperm
torch。randperm(n, out=
None
) → LongTensor
給定引數
n
,返回一個從
0
到
n -1
的隨機整數排列。
torch.arange
torch。arange(start, end, step=1, out=
None
) → Tensor
返回一個1維張量,長度為 floor((end−start)/step)floor((end−start)/step)。包含從
start
到
end
,以
step
為步長的一組序列值(預設步長為1)。
torch.range
torch。range(start, end, step=1, out=
None
) → Tensor
返回一個1維張量,有 floor((end−start)/step)+1floor((end−start)/step)+1 個元素。包含在半開區間
[start, end)
從
start
開始,以
step
為步長的一組值。
step
是兩個值之間的間隔,即
警告
:建議使用函式
torch。arange()
索引,切片,連線,換位Indexing, Slicing, Joining, Mutating Ops
torch。cat
torch。cat(inputs, dimension=0) → Tensor
在給定維度上對輸入的張量序列
seq
進行連線操作。
torch。cat()
可以看做
torch。split()
和
torch。chunk()
的反操作。
cat()
函式可以透過下面例子更好的理解。
引數:
inputs (
sequence of Tensors
) – 可以是任意相同Tensor 型別的python 序列
dimension (
int
,
optional
) – 沿著此維連線張量序列。
注意:具體是行還是列的索引要看前面dim 的指定。指定dim=1,也就是橫向,那麼索引就是列號。簡記:dim=0為橫向排放,dim=1為豎直排放。
torch。chunk
torch。chunk(tensor, chunks, dim=0)
在給定維度(軸)上將輸入張量進行分塊兒。
引數:
tensor (Tensor) – 待分塊的輸入張量
chunks (int) – 分塊的個數
dim (int) – 沿著此維度進行分塊
torch。gather(注意:維度的取值?????理解的不到位)
torch。gather(input, dim, index, out=
None
) → Tensor
沿給定軸
dim
,將輸入索引張量
index
指定位置的值進行聚合。
注意:該函式不太容易理解。
torch。index_select(簡言之,dim=0按行取值,dim=1按列取值)
torch。index_select(input, dim, index, out=
None
) → Tensor
沿著指定維度對輸入進行切片,取
index
中指定的相應項(
index
為一個LongTensor),然後返回到一個新的張量, 返回的張量與原始張量_Tensor_有相同的維度(在指定軸上)。
注意: 返回的張量不與原始張量共享記憶體空間。
引數:
input (Tensor) – 輸入張量
dim (int) – 索引的軸
index (LongTensor) – 包含索引下標的一維張量
out (Tensor, optional) – 目標張量
從行取值、從列取值
torch。masked_select
torch。masked_select(input, mask, out=
None
) → Tensor
根據掩碼張量
mask
中的二元值,取輸入張量中的指定項(
mask
為一個
ByteTensor
),將取值返回到一個新的1D張量,
張量
mask
須跟
input
張量有相同數量的元素數目,但形狀或維度不需要相同。 注意: 返回的張量不與原始張量共享記憶體空間。
引數:
input (Tensor) – 輸入張量
mask (ByteTensor) – 掩碼張量,包含了二元索引值
out (Tensor, optional) – 目標張量
torch。nonzero
torch。nonzero(input, out=
None
) → LongTensor
返回一個包含輸入
input
中非零元素索引的張量。輸出張量中的每行包含輸入中非零元素的索引。
如果輸入
input
有
n
維,則輸出的索引張量
output
的形狀為 z x n, 這裡 z 是輸入張量
input
中所有非零元素的個數。
引數:
input (Tensor) – 源張量
out (LongTensor, optional) – 包含索引值的結果張量
torch。nn
網路教程程式碼解析可參考:
影片教程可參考:
https://
blog。csdn。net/fendouain
i/article/details/89944199
自動微分
在pytorch中,神經網路的核心是自動微分,在本節中我們會初探這個部分,也會訓練一個小型的神經網路。自動微分包會提供自動微分的操作,它是一個取決於每一輪的執行的庫,你的下一次的結果會和你上一輪執行的程式碼有關,因此,每一輪的結果,有可能都不一樣。接下來,讓我們來看一些例子。
PyTorch常用函式摘抄:
可以使用與NumPy索引方式相同的操作來進行對張量的操作:
torch。view
: 可以改變張量的維度和大小。
torch.view 與Numpy的reshape類似。
如果你有隻有一個元素的張量,使用
。item()
來得到Python資料型別的數值:
多維的張量:
NumPy 轉換
將一個Torch Tensor轉換為NumPy陣列是一件輕鬆的事,反之亦然。
Torch Tensor與NumPy陣列共享底層記憶體地址,修改一個會導致另一個的變化。
將一個Torch Tensor轉換為NumPy陣列:
NumPy Array 轉化成 Torch Tensor:使用from_numpy自動轉化。
【注意】CharTensor 型別不支援到 NumPy 的轉換。
CUDA 張量
所有的 Tensor 型別預設都是基於CPU,使用
。to
方法 可以將Tensor移動到任何裝置中。
is_available 函式判斷是否有cuda可以使用。
`torch.device`將張量移動到指定的裝置中。
Autograd: 自動求導機制
PyTorch 中所有神經網路的核心是
autograd
包。 我們先簡單介紹一下這個包,然後訓練第一個簡單的神經網路。
autograd包為張量上的所有操作提供了自動求導
。
它是一個在執行時定義的框架,這意味著反向傳播是根據你的程式碼來確定如何執行,並且每次迭代可以是不同的。
torch。Tensor
是這個包的核心類。
如果設定.requires_grad為True,那麼將會追蹤所有對於該張量的操作。
當完成計算後透過呼叫
。backward()
,自動計算所有的梯度, 這個張量的所有梯度將會自動積累到
。grad
屬性。
要阻止張量跟蹤歷史記錄,可以呼叫
。detach()
方法將其與計算歷史記錄分離,並禁止跟蹤它將來的計算記錄。
為了防止跟蹤歷史記錄(和使用記憶體),可以將程式碼塊包裝在
with torch。no_grad():
中。 在評估模型時特別有用,因為模型可能具有
requires_grad = True
的可訓練引數,但是我們不需要梯度計算。
在自動梯度計算中還有另外一個重要的類
Function
。
Tensor
和
Function
互相連線並生成一個非迴圈圖,它表示和儲存了完整的計算歷史。 每個張量都有一個
。grad_fn
屬性,這個屬性引用了一個建立了
Tensor
的
Function
(除非這個張量是使用者手動建立的,即,這個張量的
grad_fn
是
None
)。
如果需要計算導數,你可以在
Tensor
上呼叫
。backward()
。 如果
Tensor
是一個標量(即它包含一個元素資料)則不需要為
backward()
指定任何引數, 但是如果它有更多的元素,你需要指定一個
gradient
引數來匹配張量的形狀。
譯者注:在其他的文章中你可能會看到說將Tensor包裹到Variable中提供自動梯度計算,Variable 這個在0.41版中已經被標註為過期了,現在可以直接使用Tensor。
梯度
反向傳播 因為
out
是一個純量(scalar),
out。backward()
等於
out。backward(torch。tensor(1))
。