windows安裝miniconda比較簡單不再贅述。
下載win版安裝即可。
打開cmd命令行執(zhí)行如下命令:
conda create --name d2l python=3.9 -y
激活 d2l
環(huán)境:
安裝pytorch,之前在公眾號有發(fā)過深度學(xué)習(xí)環(huán)境的搭建教程,這里直接根據(jù)自己的cuda版本執(zhí)行命令即可
pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113
jupyter 算是python學(xué)習(xí)很不錯的一款工具,這里不再贅述
在啟動jupyter notebook時,有報錯信息,如下:
ModuleNotFoundError: No module named jupyter_nbextensions_configurator
解決報錯:
python -m pip install --user jupyter_nbextensions_configurator
首先我們介紹n維數(shù)組,也稱為張量(tensor).在pytorch中的張量與Numpy的ndarray類似。但深度學(xué)習(xí)的框架比Numpy中的ndarray多一些重要的功能:首先GPU很好地支持加速計算,其次,張量類支持自動微分。這些功能使得張量類更適合深度學(xué)習(xí)。
首先,我們導(dǎo)入torch
張量表示一個由數(shù)值組成的數(shù)組,這個數(shù)組可能有多個維度。具有一個軸的張量對應(yīng)數(shù)學(xué)上的向量(vector);具有兩個軸的張量對應(yīng)數(shù)學(xué)上的矩陣(matrix);具有兩個軸以上的張量沒有特殊的數(shù)學(xué)名稱。
首先,我們使用arange創(chuàng)建一個行向量x。這個行向量包含以0開始的前12個整數(shù),它們默認(rèn)創(chuàng)建為整數(shù)。也可以指定創(chuàng)建類型為浮點數(shù)。張量中的每個值都稱為張量的元素(element)。除非額外指定,新的張量將存儲在內(nèi)存中,并采用CPU計算。
x = torch.arange(12)
x
tensor([0,1,2,3,4,5,6,7,8,9,10,11])
可以通過張量的shape屬性類訪問張量的形狀。
張量的形狀指的是每個(Dimension)軸由多少個元素組成的信息。
torch.Size([12])
#張量中元素的總數(shù)
x.numel()
#要想改變一個張量的形狀而不改變元素數(shù)量和元素值,可以調(diào)用reshape函數(shù)。例如,可以把張量x從形狀為(12,)的行向量轉(zhuǎn)換為形狀為(3,4)的矩陣。
#注意,通過改變張量的形狀,張量的大小不會改變。
X = x.reshape(3,4)
X
#生成全0的張量
torch.zeros((2,3,4))
#生成全1的張量
torch.ones((2,3,4))
#生成隨機值,且每個元素都從均值為0、標(biāo)準(zhǔn)差為1的標(biāo)準(zhǔn)高斯分布(正態(tài)分布)中隨機采樣。
torch.randn((2,3))
# 通過python列表為張量賦值 ,在這里,最外層的列表對應(yīng)于軸0,內(nèi)層的列表對應(yīng)于軸1。
torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
對于任意具有相同形狀的張量, 常見的標(biāo)準(zhǔn)算術(shù)運算符(+
、-
、*
、/
和**
)都可以被升級為按元素運算。我們可以在同一形狀的任意兩個張量上調(diào)用按元素操作。
#運算符
x = torch.tensor([1.0,2,4,8])
y = torch.tensor([2,2,2,2])
x + y,x - y,x * y,x / y,x ** y
#求冪運算
torch.exp(x)
#多個張量連結(jié)(concatenate)
X = torch.arange(12,dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])
torch.cat((X,Y),dim=0),torch.cat((X,Y),dim=1) #按行連結(jié),按列連結(jié)
#通過邏輯運算符構(gòu)建二元張量
X == Y
#對張量中的所有元素求和會產(chǎn)生一個單元素張量
X.sum()
#在某些情況下,即使張量形狀不同,我們也可以通過調(diào)用廣播機制來執(zhí)行按元素操作
#這種機制的工作方式如下:
#通過適當(dāng)復(fù)制元素來擴展一個或兩個數(shù)組,以便在轉(zhuǎn)換之后,兩個張量具有相同的形狀;
#對生成的數(shù)組執(zhí)行按元素操作。
#在大多數(shù)情況下,我們將沿著數(shù)組中長度為1的軸進(jìn)行廣播,如下例子:
a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))
a,b,torch.arange(2)
#由于a和b分別是矩陣,如果讓它們相加,它們的形狀不匹配。我們將兩個矩陣廣播為一個更大的矩陣,
#如下所示:矩陣a將復(fù)制列, 矩陣b將復(fù)制行,然后再按元素相加。
a + b
就像在任何其他Python數(shù)組中一樣,張量中的元素可以通過索引訪問。與任何Python數(shù)組一樣:第一個元素的索引是0,最后一個元素索引是-1;可以指定范圍以包含第一個元素和最后一個之前的元素。
如下所示,我們可以用[-1]
選擇最后一個元素,可以用[1:3]
選擇第二個和第三個元素:
X[-1],X[1:3]
#指定元素寫入矩陣
X[1,2] = 9
X
#多個元素賦相同值 [0:2, :]訪問第1行和第2行,其中“:”代表沿軸1(列)的所有元素
X[0:2,:] = 12
X
運行一些操作可能會導(dǎo)致為新結(jié)果分配內(nèi)存。例如,如果我們用Y = X + Y
,我們將取消引用Y
指向的張量,而是指向新分配的內(nèi)存處的張量。
# id()函數(shù)提供了內(nèi)存中引用對象的確切地址
#運行Y = Y + X后,我們會發(fā)現(xiàn)id(Y)指向另一個位置。這是因為Python首先計算Y + X,為結(jié)果分配新的內(nèi)存,然后使Y指向內(nèi)存中的這個新位置。
before = id(Y)
Y = Y + X
id(Y) == before
before,id(Y)
#這可能是不可取的,原因有兩個:
#首先,我們不想總是不必要地分配內(nèi)存。在機器學(xué)習(xí)中,我們可能有數(shù)百兆的參數(shù),并且在一秒內(nèi)多次更新所有參數(shù)。
#通常情況下,我們希望原地執(zhí)行這些更新;如果我們不原地更新,其他引用仍然會指向舊的內(nèi)存位置,這樣我們的某些代碼可能會無意中引用舊的參數(shù)。
#我們可以使用切片表示法將操作的結(jié)果分配給先前分配的數(shù)組,例如Y[:] = <expression>
Z = torch.zeros_like(Y)
print('id(Z):',id(Z))
Z[:] = X + Y
print('id(Z):',id(Z))
#如果在后續(xù)計算中沒有重復(fù)使用X, 我們也可以使用X[:] = X + Y或X += Y來減少操作的內(nèi)存開銷。
before = id(X)
X += Y
id(X) == before
#將深度學(xué)習(xí)框架定義的張量轉(zhuǎn)換為NumPy張量(ndarray)很容易,反之也同樣容易。
#torch張量和numpy數(shù)組將共享它們的底層內(nèi)存,就地操作更改一個張量也會同時更改另一個張量。
A = X.numpy()
B = torch.tensor(A)
type(A),type(B)
#要將大小為1的張量轉(zhuǎn)換為Python標(biāo)量,我們可以調(diào)用item函數(shù)或Python的內(nèi)置函數(shù)。
a = torch.tensor([3.5])
a,a.item(),float(a),int(a)
#深度學(xué)習(xí)存儲和操作數(shù)據(jù)的主要接口是張量(維數(shù)組)。它提供了各種功能,包括基本數(shù)學(xué)運算、廣播、索引、切片、內(nèi)存節(jié)省和轉(zhuǎn)換其他Python對象。
ok第一期學(xué)習(xí)筆記就到這了,希望在看的小伙伴點個在看,支持我繼續(xù)寫下去。
聯(lián)系客服