Pytorch學(xué)習(xí)
model.train() model.eval()
模型設(shè)置為訓(xùn)練模式和預(yù)測(cè)模式。
訓(xùn)練完train_datasets之后,model要來測(cè)試樣本了。在model(test_datasets)之前,需要加上model.eval(). 否則的話,有輸入數(shù)據(jù),即使不訓(xùn)練,它也會(huì)改變權(quán)值。這是model中含有batch normalization層所帶來的的性質(zhì)。
eval()時(shí),pytorch會(huì)自動(dòng)把BN和DropOut固定住,不會(huì)取平均,而是用訓(xùn)練好的值。不然的話,一旦test的batch_size過小,很容易就會(huì)被BN層導(dǎo)致生成圖片顏色失真極大。eval()在非訓(xùn)練的時(shí)候是需要加的,沒有這句代碼,一些網(wǎng)絡(luò)層的值會(huì)發(fā)生變動(dòng),不會(huì)固定,你神經(jīng)網(wǎng)絡(luò)每一次生成的結(jié)果也是不固定的,生成質(zhì)量可能好也可能不好。
Tensor數(shù)據(jù)類型

標(biāo)量,張量
a = torch.tensor(1)
a是tenor(1),標(biāo)量,維度為0。像loss就是標(biāo)量
維度>0是張量,a = torch.randn(2,3),2行3列,a.shape 和 a.size()一樣,輸出tensor.size([2,3]),a.dim()是2,2維。
numpy to tensor




維度變換
view,reshape一樣,后面建議用更新的reshape,不改變?cè)瓉淼膖ensor。
resize也會(huì)改變維度,不過是在本身tensor改變。


expand擴(kuò)充數(shù)據(jù),不增加實(shí)際內(nèi)存

repeat增加實(shí)際內(nèi)存


transpose:兩個(gè)維度交換,比較麻煩。permute比較簡(jiǎn)單,指定維度。


張量的簡(jiǎn)化相加,可以省事,不用把維度調(diào)成一致,節(jié)約存儲(chǔ)空間。
合并與分割
concat

stack堆疊,把兩個(gè)堆疊在一起,會(huì)多出一個(gè)維度,用于選擇哪一個(gè)

split拆分

chunk是分成幾塊,直接輸幾


tensor裁剪,clamp把張量的值限定在區(qū)間內(nèi)。
矩陣范數(shù)
norm()

范數(shù)越大,矩陣中元素的值就越大。而且兩個(gè)矩陣的范數(shù)相近,說明兩個(gè)矩陣聯(lián)系相近,反之越大。
max(),min(),argmax(),argmin(),mean,topk(),


w創(chuàng)建的時(shí)候需要配置梯度,那么反向傳播的時(shí)候能自動(dòng)算梯度,并保存在屬性里。
為啥用交叉熵,不用sigmoid
sigmoid在接近0或接近1的時(shí)候,容易梯度彌散,需要x移動(dòng)很多,值才能移動(dòng)一點(diǎn)。交叉熵會(huì)好一點(diǎn)。
訓(xùn)練集,驗(yàn)證集,測(cè)試集

訓(xùn)練集用來訓(xùn)練,驗(yàn)證集用來判斷訓(xùn)練是否OK,防止過擬合。測(cè)試集看最后效果,測(cè)試集的數(shù)據(jù)之前不能讓模型看過。
visdom可視化工具
訓(xùn)練時(shí)可以直接輸出訓(xùn)練曲線
K折交叉驗(yàn)證,測(cè)試集不能動(dòng)放一邊。驗(yàn)證集在每個(gè)epoch中輪,這樣可以讓所有都能反向傳播一次。
防止過擬合
增大數(shù)據(jù)集,限制模型復(fù)雜度,dropout,數(shù)據(jù)增強(qiáng),早停,正則項(xiàng)。

正則化,限制W的大小,使模型沒有那么強(qiáng)的表達(dá)能力。

weight_decay就是2范數(shù)的系數(shù)。
動(dòng)態(tài)減小learning rate



inplace=True可以節(jié)省內(nèi)存空間,不額外開辟relu的內(nèi)存空間

BN層這個(gè)參數(shù)輸入和通道數(shù)匹配上