清理庫存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支援各種型別的張量。

pytorch知識點總結

根據現有的張量建立張量,使用size方法與Numpy的shape屬性返回的相同,張量也支援shape屬性.

pytorch知識點總結

【注意】

`torch。Size` 返回值是 tuple型別, 所以它支援tuple型別的所有操作。

pytorch知識點總結

pytorch知識點總結

【注意】:

torch。Tensor

預設的是torch.float資料型別

pytorch知識點總結

輸出的四種結果都一樣:

pytorch知識點總結

【重點理解】:Pytorch 張量維度

可參考:

函式dim()可以返回張量的維度,shape屬性與成員函式size()返回張量的具體維度分量。

pytorch知識點總結

dim=0的標量

維度為0的Tensor為標量,標量一般用在Loss這種地方。如下程式碼定義了一個標量:

pytorch知識點總結

定義標量的方式很簡單,只要在tensor函式中傳入一個標量初始化的值即可,注意是具體的資料。

dim=1的張量

dim=1的Tensor一般用在Bais這種地方,或者神經網路線性層的輸入Linear Input,例如MINST資料集的一張圖片用shape=[784]的Tensor來表示。

dim=1相當於只有一個維度,但是

這個維度上可以有多個分量(就像一維陣列一樣)

,一維的張量實現方法有很多,下面是三種實現:

注意:維度為1時,shape和size返回的是元素個數。

pytorch知識點總結

dim=2的張量

dim=2的張量一般用在帶有batch的Linear Input,例如MNIST資料集的k張圖片如果放再一個Tensor裡,那麼shape=[k,784]。

pytorch知識點總結

從上面可以看出,可以取到Tensor每一維度的分量 。

dim=3的張量

dim=3的張量很適合用於RNN和NLP,如20句話,每句話10個單詞,每個單詞用100個分量的向量表示,得到的Tensor就是shape=[20,10,100]。

pytorch知識點總結

注意: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] 。

pytorch知識點總結

注意:在維度上取值:

pytorch知識點總結

輸出:

pytorch知識點總結

注意:按行取值

總結:

在同構的意義下,第零階張量 (r = 0) 為標量 (Scalar),第一階張量 (r = 1) 為向量 (Vector), 第二階張量 (r = 2) 則成為矩陣 (Matrix),第三階以上的統稱為多維張量。

對於標量,我們可以直接使用 。item() 從中取出其對應的python物件的數值。

特別的:如果張量中只有一個元素的tensor也可以呼叫

tensor。item

方法。

pytorch知識點總結

基本型別

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。

pytorch知識點總結

如果我們有多GPU的情況,可以使用to方法來確定使用那個裝置。

pytorch知識點總結

常用方法:

pytorch知識點總結

pytorch知識點總結

【PyTorch】Tensor和tensor的區別

可參考:

https://

blog。csdn。net/tfcy694/a

rticle/details/85338745

pytorch知識點總結

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中元素的數目:

pytorch知識點總結

torch.sum(input, dim, keepdim=False, out=None)

→ Tensor

返回新的張量,其中包括輸入張量input中指定維度dim中每行的和。其中,sum預設為每列的和。torch。sum(input) : 返回所有元素的之和。

pytorch知識點總結

pytorch知識點總結

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) – 結果張量

pytorch知識點總結

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) – 結果張量

pytorch知識點總結

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

的隨機整數排列。

pytorch知識點總結

torch.arange

torch。arange(start, end, step=1, out=

None

) → Tensor

返回一個1維張量,長度為 floor((end−start)/step)floor((end−start)/step)。包含從

start

end

,以

step

為步長的一組序列值(預設步長為1)。

pytorch知識點總結

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

是兩個值之間的間隔,即

x_{i+1}=x_{i}+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

) – 沿著此維連線張量序列。

pytorch知識點總結

注意:具體是行還是列的索引要看前面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) – 目標張量

pytorch知識點總結

從行取值、從列取值

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索引方式相同的操作來進行對張量的操作:

pytorch知識點總結

torch。view

: 可以改變張量的維度和大小。

torch.view 與Numpy的reshape類似。

pytorch知識點總結

如果你有隻有一個元素的張量,使用

。item()

來得到Python資料型別的數值:

pytorch知識點總結

多維的張量:

NumPy 轉換

將一個Torch Tensor轉換為NumPy陣列是一件輕鬆的事,反之亦然。

Torch Tensor與NumPy陣列共享底層記憶體地址,修改一個會導致另一個的變化。

將一個Torch Tensor轉換為NumPy陣列:

pytorch知識點總結

NumPy Array 轉化成 Torch Tensor:使用from_numpy自動轉化。

pytorch知識點總結

【注意】CharTensor 型別不支援到 NumPy 的轉換。

CUDA 張量

所有的 Tensor 型別預設都是基於CPU,使用

。to

方法 可以將Tensor移動到任何裝置中。

is_available 函式判斷是否有cuda可以使用。

`torch.device`將張量移動到指定的裝置中。

pytorch知識點總結

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。

pytorch知識點總結

梯度

反向傳播 因為

out

是一個純量(scalar),

out。backward()

等於

out。backward(torch。tensor(1))