動手學深度學習學習筆記(2)

2021-10-08 18:32:38 字數 3897 閱讀 9199

操作

算術操作

在pytorch中,同一種操作可能有很多種形式,下面用加法作為例子。

加法形式一

y = torch.rand(5,

3)print

(x + y)

加法形式二

print

(torch.add(x,y)

)

還可指定輸出:

result = torch.empty(5,

3)torch.add(x,y,out = result)

print

(result)

加法形式三 inplace

# add x to y

y.add_(x)

print

(y)

注:pytorch操作inplace版本都有字尾_ ,例如x.copy_(),x.t_()

輸出

tensor([[

-0.8725,-

0.4392,-

0.0549],

[-0.3315

,0.4233

,1.2609],

[2.2099,-

0.3888,-

1.2844],

[-0.9981

,0.1833

,2.5960],

[0.4943

,0.1106

,1.4736]]

)

索引

還可以使用類似numpy的索引操作來訪問tensor的一部分,需要注意的是,索引出來的結果與原資料共享記憶體,也即修改乙個,另乙個會跟著修改。

y = x[0,

:]y +=

1print

(y)print

(x[0,:

])

輸出

tensor([-

0.4106

,0.5202

,0.1482])

tensor([-

0.4106

,0.5202

,0.1482

])

pytorch還提供了一些高階的選擇函式

函式功能

index_select(input,dim,index)

在指定維度dim上選取,比如選取某些行,某些列

masked_select(input,mask)

a[a>0] ,使用bytetensor進行選取

nonzero(input)

非0元素的下標

gather(input,dim,index)

根據index,在dim維度上選取資料,輸出的size與index一樣

改變形狀

用view()來改變tensor的形狀:

y = x.view(15)

z = x.view(-1

,5)#-1代指的數可以根據其他維度的size推出來

print

(x.size(

),y.size(

),z.size(

))

輸出:

torch.size([5

,3]) torch.size([15

]) torch.size([3

,5])

注意view()返回的新tensor與源tensor雖然可能有不同的size,但是是共享data的,也即更改其中的乙個,另外乙個也會跟著改變。(所以,view只是改變了對這個張量的觀察角度,內部資料並為改變)

x +=

1print

(x)print

(y)#也加了1

輸出;

tensor([[

0.5894

,1.5202

,1.1482],

[-0.0560

,1.3848

,1.3631],

[2.5372

,0.1347,-

0.9772],

[-0.7165

,0.7215

,3.0197],

[1.2080

,0.6697

,2.0794]]

)tensor(

[0.5894

,1.5202

,1.1482,-

0.0560

,1.3848

,1.3631

,2.5372

,0.1347,-

0.9772,-

0.7165

,0.7215

,3.0197

,1.2080

,0.6697

,2.0794

])

所以當想返回乙個新的副本(也就是不共享data記憶體)

pytorch還提供了乙個reshape()可以改變形狀,但是此函式並不能保證返回的是其拷貝,所以不推薦使用。推薦使用clone創造乙個副本然後再使用view。

x_cp = x.clone(

).view(15)

x -=

1print

(x)print

(x_cp)

輸出

tensor([[

-0.4106

,0.5202

,0.1482],

[-1.0560

,0.3848

,0.3631],

[1.5372,-

0.8653,-

1.9772],

[-1.7165,-

0.2785

,2.0197],

[0.2080,-

0.3303

,1.0794]]

)tensor(

[0.5894

,1.5202

,1.1482,-

0.0560

,1.3848

,1.3631

,2.5372

,0.1347,-

0.9772,-

0.7165

,0.7215

,3.0197

,1.2080

,0.6697

,2.0794

])

使用clone還有乙個好處是會被記錄在計算圖中,即梯度回傳到副本時也會傳到源tensor。

另外乙個常用的函式就是item(),它可以將乙個標量tensor轉換成乙個python number:

x = torch.randn(1)

print

(x)print

(x.item(

))

輸出:

tensor([-

0.3040])

-0.3040177822113037

線型代數

pytorch還支援一些線型函式

函式功能

trace

對角線元素之和(矩陣的跡)

diag

對角線元素

triu/tril

矩陣的上三角或下三角,可指定偏移量

mm/bmm

矩陣乘法,batch的矩陣乘法

addmm/addbmm/addmv/addr/baddbmm

矩陣運算t轉置

dot/cross

內積/外積

inverse

求逆矩陣

svd奇異值分解

pytorch中的tensor支援超過一百種操作,包括轉置、索引、切片、數字運算、線性代數、隨機數等等。

動手學深度學習筆記2

part1 模型選擇1 誤差與資料集 訓練誤差 training error 模型在訓練集上表現出的誤差。泛化誤差 generalization error 在任意乙個測試資料樣本上表現出的誤差的期望。舉個栗子,訓練誤差就是做往屆試卷 訓練 的錯誤率,泛化誤差則可以通過真正參加考試 測試 時的答題錯...

筆記 動手學深度學習

在求數值解的優化演算法中,小批量隨機梯度下降 mini batch stochastic gradient descent 在深度學習中被廣泛使用。它的演算法很簡單 先選取一組模型引數的初始值,如隨機選取 接下來對引數進行多次迭代,使每次迭代都可能降低損失函式的值。在每次迭代中,先隨機均勻取樣乙個由...

深度學習 動手學深度學習筆記 12

g是乙個生成的網路,它接收乙個隨機的雜訊z,通過這個雜訊生成,記做g z d是乙個判別網路,判別一張是不是 真實的 它的輸入引數是x,x代表一張,輸出d x 代表x為真實的概率,如果為1,就代表100 是真實的,而輸出為0,就代表不可能是真實的。在訓練過程中,生成網路g的目標就是盡量生成真實的去欺騙...