最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

pytorch入門首選,蘇黎世博士龍曲良老師手把手帶你敲代碼,全集150讓你掌握

2023-02-22 08:58 作者:下雨天叫獨立日啊喂  | 我要投稿

劃分成train和test測試集的意義是:學(xué)習(xí)的成果很好可能是對于這些圖片只是記憶,對于新的圖片識別可能效果并不是很好


首先清零梯度optimizer.zero_grad()

然后再計算梯度loss.backword()

然后再更新梯度optimizer.step()

衡量性能好不好并不是靠loss,而是看準(zhǔn)確度

python和pytorch的數(shù)據(jù)類型的不同

tensor的不同維度表示不同的數(shù)據(jù)類型。一個int在pytroch中是dim=0,而一個數(shù)組在pytorch中是dim=2

pytroch中如何表達string?


這幾類tensor類型用的多,bytetensor是用來比較兩個tensor的

tensor既可以放在cpu上也可以放在gpu上面

pytorch的數(shù)據(jù)放在不同位置類型可能不一樣


randn初始化一個隨機的正態(tài)分布

.type()可以返回其類型

參數(shù)合法化的檢驗用isinstance

數(shù)據(jù)放tensor和放cuda是兩種不同的類型,如下圖

標(biāo)量:

用troch.tensor()方法

主要用于計算loss時候,loss計算出來一般是標(biāo)量

shape和size的區(qū)別是,size是函數(shù),需要運用()來調(diào)用它,shpae是個成員,不需要()。

數(shù)學(xué)的向量在tensor里叫張量

torch.tensor()括號里面代[],生成dim為1的

張量,其張量的長度可以為1~n。

如果要給定dim=1,size=1直接用上圖的floattensor,()里2是表示dim=1,size=2

dim=1主要用于bias,linear input

dim是指維度,行列表2維,指的size長度

而size/shape表示整個形狀【2,2】,tensor的具體形狀

tensor指的是具體數(shù)據(jù)

dim為2

帶有batch的linear的輸入

dim=3

不再使用隨機的正太分布,而是隨機的均勻分布。

用list可以將shape直接轉(zhuǎn)換成list形式

三維適合RNN的編碼

dim=4

四維適合圖片

【b,c,h,w】batch,channle,height,weigth


想要得到具體的所占內(nèi)存的大小,用numel來表示,即number of element

A.dim()顯示a的維度


如何創(chuàng)建 一個tensor

1,運用np作為載體


2

小寫tensor接收現(xiàn)成的數(shù)據(jù),大寫Tensor接收shape,大寫也可以接收現(xiàn)成的數(shù)據(jù),數(shù)據(jù)必須要以一個list方式,第四不要用,容易混淆

使用empty函數(shù)會隨機初始化數(shù)據(jù),數(shù)據(jù)會很不規(guī)則。

以list給參數(shù)是直接喂參數(shù),不建議。


未初始化tensor的問題

如果出現(xiàn)了torch.nan,或則inf,可以去看看是不是tensor未初始化。

創(chuàng)建完后一定要寫入數(shù)據(jù)


沒有設(shè)置的話,使用tensor和Tensor都是使用內(nèi)置默認(rèn)的


使用隨機初始化

rand是指隨機在0~1之間產(chǎn)生數(shù)值,不包括1,rand_like()是直接接收tensor,然后根據(jù)給的tensor的shape來rand一個

randint(1,10)可以取1但取不到10

有三個參數(shù),第三個為shape


正態(tài)分布

randn均值為0方差為1

normal調(diào)節(jié)均值和方差需要將數(shù)值打平然后再reshape我們想要的形狀

如果想要使得內(nèi)部數(shù)據(jù)全為某個數(shù),使用full函數(shù)【】中啥也不寫則生成一個dim=0的標(biāo)量,【1】則是dim=1的size=1


設(shè)置一個等差數(shù)列的tensor

第三個參數(shù)為等差數(shù)列的階梯

range函數(shù)不建議使用

linspace的是包含右邊的(1,10)是0~10包含左右邊界,step是切割成幾分的等差數(shù)列

而logspace是以step為底數(shù)的冪函數(shù)

全一的參數(shù).ones

全零的參數(shù).zeros

產(chǎn)生對角線為1的.eye

這三個也有_like的用法,輸入一個現(xiàn)有的tensor,自動識別shape填充

randperm產(chǎn)生隨機打散的數(shù),

shuffle洗牌的意思


索引和切片

索引會從最左邊開始索引

scalar標(biāo)量的意思dim=1


-1:

正常排序有兩種,第一種為0,1,2第二種為-3,-2,-1,所以-1到末尾只有1個通道

兩個冒號表示隔行

2,用索引號進行采樣index_select()

第一個參數(shù)為維度,第二個參數(shù)為所選維度的想要數(shù)據(jù)的索引號

第二個中的[0,2]list不能直接給,而是要先轉(zhuǎn)化成tensor

...表示后面都取,可以省略很多的:和,

使用mask會使得數(shù)據(jù)被打平, 然后用masked_select()可以找到相應(yīng)的數(shù)據(jù),shape一下發(fā)現(xiàn)dim變了,變成1了

take函數(shù)也會把數(shù)據(jù)給打平,與index_select不同,index_select會先找維度,而take是打平再找


維度變換

reshape函數(shù)可以在保持tensor大小不變的情況下任意轉(zhuǎn)化成一個shape

view和reshape是可以通用的

view會把額外的信息給丟失掉,所以要額外存儲,不然還原的數(shù)據(jù)會被污染

view的size要和原來的一樣,不然也會報錯


unsqueeze如何將數(shù)據(jù)展開

unsqueeze最好不用-1來插入新維度,復(fù)數(shù)是之后插入,正數(shù)來表示已經(jīng)可以滿足需求了


維度變換需要變成一樣的,維度變換在實際例子中應(yīng)用的十分廣泛

squeeze

給定一個參數(shù),假如不給的話,會把能刪減的全刪掉。

只會刪減那維度為1,不為1也不會報錯,只會返回原來的那個

expend 不會增加數(shù)據(jù),而repeat會增加數(shù)據(jù)

更推薦expend,expend一般不會增加數(shù)據(jù)

能使用expend的前提是dim一致

擴展是僅限于原來的維度為1,若從3->n會報錯,若輸入的是-1,則是保持此維度不變

repeat

repeat的參數(shù)是指在維度上拷貝的次數(shù)

.t()矩陣轉(zhuǎn)置操作

轉(zhuǎn)置只能適用于dim=2的

transpose

數(shù)據(jù)的維度順序必須和存儲順序一致

因為轉(zhuǎn)置之后數(shù)據(jù)之間打亂了,為了使其一致,所以使用contiguous函數(shù),使數(shù)據(jù)重新變成連續(xù)

view會導(dǎo)致維度順序關(guān)系變模糊,所以需要人為跟蹤

permute

【b,h,w,c】為numpy存儲圖片的格式

permute只需要將原來的維度索引值輸入就行

permute也會打亂數(shù)據(jù),permute可以實現(xiàn)要多次tanspose的操作


broadcasting(自動擴張)

broadcasting的具體實施

1.如果沒有維度就會在前面插入新的維度

2.然后再將此維度擴展成相同大小,不需要手動調(diào)用

一般將后面理解成大維度

.expend_as(A)自動擴張成a的size

broadcast作用,可以完成自動擴張,又不需要手動操作的要求

即小維度指定,大維度隨意

broadcast的規(guī)則


拼接與拆分

split是在長度上的拆分,而chunk是以數(shù)量上的拆分

cat

第一個參數(shù)為指定兩個tensor合并,而第二個參數(shù)指定tensor在哪個維度上合并

stack

stack回創(chuàng)建一個新的維度

新添加了一個維度后面的維度保持一致

split and chunk

1.根據(jù)數(shù)量來拆分chunk

2.長度split

(以下為按長度拆分)split

第一個參數(shù)為每個單元的長度,第二個參數(shù)為操作的維度

若想差分為不同的dim,則用list將想要的維度抱起來比如【3,1,1】要保證里面數(shù)加起來與dim里的shape一致

(以下為按數(shù)量拆分)chunk

這個簡單


數(shù)學(xué)運算

矩陣的加減乘除

add/sub/mul/div

all 是檢驗所有位置是否相等

矩陣相乘:matmul

@是numpy里面的matmul形式,用的少

多維的矩陣運算

假如是四維,會使得前面兩維不變,然后后面兩維度相乘。

假如前面維度有出入,會自動使用boradcast保持一致

若不一樣的地方?jīng)]1則會報錯。

sqrt為平方根

rsqrt為平方根的倒數(shù)

一般建議使用pow和**

exp函數(shù)是以e為底的函數(shù)

log默認(rèn)是以e為底的即ln,若要以2為底則用log2

近似值

floor為數(shù)取小值,即3.14取3

ceil取大

trunc裁剪,裁成整數(shù)部分

frac裁剪,裁成小數(shù)部分

round為四舍五入的方法

用的多的還是clamp

梯度裁剪:gradient clipping

如果網(wǎng)路中出現(xiàn)了不穩(wěn)定的時候,一定要看下梯度的模 w.grad.norm(2)一般在10左右正常

.grad(10)裁最小值,小于10的為10

或者給最大最小值,在之間不變,其余靠近變,為最大或者最小

for w in []

clamp (w.grad,10)

對w的grad進行限幅


統(tǒng)計屬性的方法

norm 范數(shù),用的最常見的

norm指的范數(shù)而不是normalize

batch_norm表示正則化

vector norm 和 matrix norm的區(qū)別


如果只設(shè)一個參數(shù),則按上上圖算,如果給定了維度,則在給定的維度上算,然后輸入一個list

對某個維度進行norm某個維度的數(shù)據(jù)就要消掉(有點繞,建議重新看視頻)

max最大,min最小,mean均值,prod累乘

sum求和

argmax是返回max的索引,argmin是。。。

min,max這些不給參數(shù),會將其打平再返回

也可以給個維度參數(shù)

dim 和keepdim再統(tǒng)計里面起的作用

在max 和min輸入?yún)?shù)為dim時候,回復(fù)返回兩個tensor,一個數(shù)據(jù)一個索引,因為輸入dim所在的維度時候,那個維度會消失,為了使得維度一致不丟失,則可使用keepdim參數(shù)

假如不keepdim則可以自己加個unsqueeze

top-k or k-th(kthvalue)

top-k比max能返回更多的數(shù)據(jù),假定輸入?yún)?shù)topk(2,dim=,largest=)則會返回概率最大的前二

假如想要最小,則將largest參數(shù)默認(rèn)改成false就行

kthvalue 默認(rèn)為最小的,而且只能設(shè)置為小,

會返回第k小的值和第k小的索引號


compare 比較運算的操作

對于pytorch沒有t or f的類型,也沒有string類型,只有0和1。

gt就是>的意思

a>0等價于torch.gt(a,0)

用eq函數(shù)進行比較會返回0和1

若用equal則會返回t or f


高階操作

where函數(shù)

第一個參數(shù)為condition,第二個第三個為來源

假如要賦值可能要兩個for語句,python語句用于cpu,很慢,所以用where語句能使得賦值語句高度并行化,快很多

gather

gather語句就是一個查表的過程

gather第一個參數(shù)是表,第二個參數(shù)是維度,在哪個維度上查表,第三個參數(shù)為需要查表的項的索引

使用gather能夠快速的將相對標(biāo)簽轉(zhuǎn)化成全局標(biāo)簽


什么是梯度

導(dǎo)數(shù)和偏微分都是標(biāo)量,方向指定,長度為大小

而梯度是個向量,將所有的偏微分看成一個向量來理解

梯度表示什么呢?

向量的方向代表著梯度的方向,向量的模代表著向量的長度,代表著在這個方向增長的速率。

鞍點,是一個深度學(xué)習(xí)時候很容易可能卡住的點

對于深度學(xué)習(xí)初始化是十分重要的

激活函數(shù)及其梯度

激活函數(shù)其目的是為了模擬神經(jīng)元的機制

使用sig'moid函數(shù)可能會導(dǎo)致梯度彌散

tanh(x)函數(shù)

relu函數(shù)

relu函數(shù)有著先天的優(yōu)勢,函數(shù)的梯度計算起來非常的簡單,而且梯度始終是一,沒有梯度彌散梯度爆炸的情況

一般都是使用relu函數(shù)


loss即其梯度

均方差:mean squared error

grad 函數(shù),第一個參數(shù)為y,第二個參數(shù)為【x1,x2,x3】等,看你想要求導(dǎo)的自變量個數(shù)

想要求導(dǎo),得先要更新求導(dǎo)得指示

還得更新一下動態(tài)圖,因為pytroch是計算一步算一步

或者使用backward函數(shù),backword函數(shù)會自動從后往前傳播,會計算需要計算得grad。

w.norm返回得是一個tensor得L2norm

w.gard.norm是返回w梯度的norm

返回的是這樣的一個list


softmax


滿足所有屬性屬于0-1,然后所有屬性概率和為1

適用于多分類的情況

會使得兩個數(shù)據(jù)之間的拉距拉大


使用一次backward時候要跟新一下,不然會報錯設(shè)置retain_graph=True

不管是用grad函數(shù)還是backward函數(shù),輸入第一個參數(shù)應(yīng)該dim=1長度為一,dim為0的scalar。輸入有三個量是錯的,所以是p[1]

也驗證了softmax的那個函數(shù),i=j是正的,其他是負(fù)的

單層感知機

上標(biāo)0表示輸入層,0-n表示0層有n+1個節(jié)點

w的上標(biāo)1表示第一層,橙色部分一起為第一層,下標(biāo)第一個為上一層的第i個節(jié)點,第二個參數(shù)為這一層的第幾號節(jié)點

又將求和設(shè)置成另外x,上標(biāo)表示第一層,下標(biāo)為第幾號節(jié)點,然后sigmoid函數(shù)設(shè)成O,上標(biāo)下標(biāo)設(shè)置與求和x的意思一致


多層感知機

只跟輸入節(jié)點j和輸出節(jié)點k有關(guān)

鏈?zhǔn)椒▌t

反向傳播方式



假如隱含層的話,其隱含層還包含了一個激活函數(shù),所以不是xIj而是OIj


公式前面部分只與Ok有關(guān),設(shè)為得而塔k

簡化得公式,得到了一個輸入與一個項的乘積

從以上推導(dǎo)可以知道,只要得到這一層的地而他信息,和上一層輸入信息Oi地信息,就可以得到梯度信息,一層知道了就可以推導(dǎo)下一次層,


2D函數(shù)的優(yōu)化實例

使用這個函數(shù)就是可以直接實現(xiàn)下面這個作用

只要調(diào)用一次這個step就可以更新一次

做的時候不要隨意初始化,初始化是十分重要的

畫圖可以用這個知識!


logistic regression

分類問題并不會直接優(yōu)化accuracy

為什么不能最大準(zhǔn)確率呢?

1.因為是非零即1的分類問題,當(dāng)w優(yōu)化使得概率朝著0.5前進時候,會使得梯度為零,0.4->0.45,其分類仍未0,所以有梯度為0得情況

2.假如概率從0.499->0.51,使得梯度突然改變,使得梯度函數(shù)不連續(xù)了,(或者為非常大得gradient)造成training不穩(wěn)定,所以一般不會使用accuracy進行training。

使用了softmax函數(shù)


cross entropy交叉熵

熵就是不確定性

也是算一種驚喜度,驚喜度越大,其熵越小。

熵比較大,驚喜度就很小。

entropy衡量的是一個分布的不穩(wěn)定度,而cross entropy衡量的是兩個分布的不穩(wěn)定度,


kl散度

假設(shè)兩個分布幾乎完全重合,其兩個kl散度接近于零

當(dāng)p=q時候,kl散度為0

當(dāng)用于分類問題時one-hot,H(p)=0

H(p,q)=kl散度,所以就是優(yōu)化pq就是優(yōu)化pq的kl散度

kl是衡量兩個分布的重疊情況

假如q(x,y)=0即下,y的kl散度為0,即xy分布很吻合,達到了優(yōu)化的目的


cross entropy 更適合分類問題, sigmoid+MSE容易梯度彌散,出現(xiàn)sigmoid出現(xiàn)飽和,收斂也慢,cross entropy的梯度信息更大,收斂的更快。

雖然mes并不適合分類問題,但求其梯度很簡單,在一些前沿的算法,可能有些很好的效果。

一個 crosss_entropy = softmax + log+null_loss

假如使用cross entropy 的話,第一個參數(shù)要用logits,不要用pred,因為cross entropy里含打包了sofemax和log環(huán)節(jié),再用pred會使得數(shù)據(jù)太小


多分類問題

對于linear在pytorch中 第一個參數(shù)為 ch-out

第二個參數(shù)為ch-in,w,b都是需要梯度信息的,所以后面一定要加requires_grad=True

logits一般是沒有經(jīng)過激活函數(shù)的

nn.CrossEntropyLoss()和F.CrossEntropy功能效果一樣。

初始化真的很重要,凱明的初始化不錯,對你的算法影響很大,有些算法不是你的方法不好,可能是你的初始化不行,導(dǎo)致結(jié)果不太理想

torch.nn.init.kaiming_normal_()

激活函數(shù)與gpu加速

Tanh是sigmoid的放縮與平移得到的,一般用于rnn循環(huán)神經(jīng)網(wǎng)絡(luò)里面的

relu函數(shù)一般不會出現(xiàn)啥梯度彌散的情況,但還是也會有,比如x<0的時候

所以出現(xiàn)了新的函數(shù)leaky relu


使用就在relu上加個leaky就行了,默認(rèn)的參數(shù)阿拉法就是0.02的樣子

由于relu在0點處的地方梯度不連續(xù),然后工程上搞了個selu函數(shù),是兩個函數(shù)的合并

一個relu函數(shù)和一個部分指數(shù)函數(shù)的合并,

softplus也是一個對relu函數(shù)的優(yōu)化,使得在0

附件有個平滑的處理

用.to方法更好,不要用.cuda方法

對模塊進行搬運,模塊也會原地更新,對tensor進行搬運,返還值會不一樣,比如data2=data.to()其data2和data不一樣

產(chǎn)生兩個tensor,一個gpu一個cpu


測試

當(dāng)train的過多,dl會只記住淺層的東西,就會導(dǎo)致其泛化能力很弱

并不是訓(xùn)練時間越長越好、gpu越強越好。

數(shù)據(jù)量和架構(gòu)是核心問題。

argmax是返回的最大值的索引號

如何進行test?

train一個batch做一次test或則train一個epoch做一個test


過擬合and欠擬合

Underfitting,train和test效果都不好,所以可以嘗試增加trainning的層數(shù),模型的復(fù)雜度可能不夠

overfitting,層數(shù)過多,模型的復(fù)雜程度過高,導(dǎo)致train 的時候會過分?jǐn)M合穿過每個點,會導(dǎo)致train的性能很好但在test時候會很不好

具體的圖像大概如下

現(xiàn)實中主要是overfitting!

數(shù)據(jù)集有限就會overfittting

怎么檢測overfitting?

將一個數(shù)據(jù)集劃分成兩個dataset

如果我們發(fā)現(xiàn)在train set 上表現(xiàn)很好,但在test set 上表現(xiàn)很差就說明是overfitting了

test主要是為了選取合適的參數(shù),提前終止trainning,防止過擬合

一般最簡單的行為是選取這個testaccrancy最高的點停止掉,選取最高點的狀態(tài)

觀察到訓(xùn)練最好的check point 保存下來,等你train發(fā)現(xiàn)已經(jīng)overfitting了,然后即用最好的作為參數(shù)去預(yù)測

更常用的是劃分成三部分,trian set、 val set、test set,這是test不是用來做模型參數(shù)的挑選了,而現(xiàn)在那部分功能交給了val set部分,而test set是交給客戶驗收時候用,防止你作弊

做research的時候會拿到一個完完整整的數(shù)據(jù)集,而做產(chǎn)品的時候或比賽會有一部分set不會給你


如何防止、減輕overfitting。regularization(正則化)

occam’s razor 歐卡姆的剃刀原理

如果不是必要的東西就不要使用,選最小的最可能的參數(shù)量

以上為減輕過擬合的方法


后面一項為范數(shù)

為了能夠體現(xiàn)performence,使得低維的參數(shù)能比較模擬數(shù)據(jù)分布,高維的參數(shù)很小很小,使得本來有個7次方的,經(jīng)過regularization以后迫使高維的參數(shù)接近0,使得高維退化成低維,使得得到更低復(fù)雜程度的曲線,在其他里面也叫weight decay 迫使w,b參數(shù)接近于零


最常用的是l2 regularuzation

lambda是個超參數(shù),需要人為的調(diào)整

只需要設(shè)置weight_decay參數(shù) 這個參數(shù)即是lambda參數(shù)。(l2)

注意:設(shè)置這個參數(shù)會使網(wǎng)絡(luò)的復(fù)雜程度降低很多,所以要在overfitting再用,沒有overfitting就用,會使得性能急劇下降。

l1現(xiàn)在pytorch沒有很好的方法


卷積

線性層就是全連接層的線性部分~

linear是沒有包含激活函數(shù)得到部分

第一層叫輸入層,是不計算在層數(shù)內(nèi)的,而輸出層是包含在內(nèi)的

卷積可以大大減少參數(shù)的數(shù)量,運用的原理主要是人類的視覺處理效果(參數(shù)共享)

相乘再累加的操作就叫卷積

卷積的定義如圖上

這是個連續(xù)的,而計算機是離散的,所以計算機的卷積即積分,就是一個相乘累加

使用的卷積核不同,得到的圖像也不一樣

卷積核理解為一個觀察的視角(人)

假如你想看人臉,就會包含人臉的數(shù)據(jù),其他數(shù)據(jù)會模糊隱去,換個視角又會不一樣,形成新的feature map

paddding不需要太多,生成的feature map最多和原來大小一樣就行

kernel的通道的數(shù)量是指的卷積核的數(shù)量,即視角的個數(shù)

kernel的數(shù)必須和input-channel對應(yīng)起來

而這個對應(yīng)起來的不叫3個kernel 是叫一個channnel 即這個channel中kernel和 input的通道數(shù)一一對應(yīng)

如上圖的multi-k中的16 ,是指有十六個kernel通道,3是指每個kernel通道有3個核和input的三個通道一一對應(yīng)

每個kernel都帶有一個偏置,所以bias=16

一般kernel的維度主要指在第一個參數(shù)那個,指的多少個視角

卷積核有幾種叫法

1。filter

2.kernel

3.weight


如果不是很明確需要干什么,不推薦直接調(diào)用forward函數(shù)。

用.forward會使用不了一些pytroch自帶的功能。


池化pooling

pooling:下采樣,會把feature map變小的操作,與縮小操作不太一樣

upsample:上采樣,與放大操作很像

relu

maxpooling:在一個卷積核里中取最大值

avg ppooling:求和然后取平均值

uosample:簡單復(fù)制最近元素的數(shù)值

函數(shù)為F.interpolate

一般不再使用F.upsample了

第二個參數(shù)scale_factor 為放大的倍數(shù),第三個參數(shù)為模式,具體看一下api文檔

channel

卷積神經(jīng)網(wǎng)絡(luò)最基本的單元為:

conv2d----batch normalization-----maxpooling----relu

后面三個的順序可以變換,顛倒也是沒有關(guān)系,看你自己了

如果將inplace設(shè)置成ture的話,就會將x‘的內(nèi)存空間用x的,將會節(jié)省很多內(nèi)存。


batch normlazation

在sigmoid函數(shù)的輸入范圍不在-4~4之內(nèi)的話,會使得梯度十分十分小,很長時間參數(shù)得不到更新,出現(xiàn)梯度彌散的情況

所以就想找有沒有一個方式使得輸入的參數(shù)在0附近,而且不大,這就是batch normlaztion的作用。

就如上圖,如果w1,w2比較相近,就可以在初始化時候,能夠平均的更快捷穩(wěn)定的到達極值

image normalization

對于彩色圖片,對于rgb的通道進行normalization,將其均值為0,先是統(tǒng)計rgb的平均,在將其均值弄成0,具體操作如下

主要有四種,看你在哪個維度操作了


經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò)

AlexNet

2012的圖像識別的冠軍, AlexNet引進了max pooling,還引進了relu這個激活函數(shù),引用了dropout

VGG

vgg有6個版本,包含vgg11,16,19等等

1×1的convolution實現(xiàn)了維度的改變

GoogLe net

2014 年 22層,有多個kernel,每個kernel代表的視野不同

并不能簡單堆疊更多的層,層越多,training的難度變大。網(wǎng)絡(luò)變深結(jié)構(gòu)變復(fù)雜


深度殘差網(wǎng)絡(luò)Resnet


一般網(wǎng)絡(luò)結(jié)構(gòu)堆疊增加的時候,網(wǎng)絡(luò)性能并未提升,而training、test性能會降低,

由于網(wǎng)絡(luò)的特性是一層一層傳遞的嘛,其導(dǎo)致誤差積累,導(dǎo)致梯度彌散和爆炸,一般是梯度彌散,導(dǎo)致后面的梯度接近于0,導(dǎo)致train半天還沒啥效果

增加了一個shortcut的連接,短路連接,是隔幾個加一個shortcut,分成很多個小單元

以前是不停的堆疊這個網(wǎng)絡(luò)來形成更深層的網(wǎng)絡(luò)

resnet多用上述單元

即網(wǎng)絡(luò)有一個選擇權(quán),可以選擇退化成更簡單的層,在其他層訓(xùn)練完了,會考慮將shortcut那部分加入進去,看能不能訓(xùn)練的更好

加了shortcut會使得損失函數(shù)曲面更光滑使得train的更好更快

vgg的計算量很大

densenet

后面的每一層都有機會和前面一層的接觸

而densenet并不是簡單的相加,而是concat,會使得channel不斷地加大,所以要設(shè)計的十分巧妙,以至于不會使得最后cahnel過多


nn.Module

所有網(wǎng)絡(luò)層的父類,要去繼承

第一層關(guān)系的才是children,其他統(tǒng)稱modules(包括children)

to(device)

net的值返回與不返回都是一致的。而不像一個tensor那樣,一個在cpu一個在gpu


save and load

返回狀態(tài)然后保存至ckpt.mdl文件夾

開始train時候要檢查有沒有ckpoint,這樣就可以不用從頭開始train了

train/test 方便的切換狀態(tài)

對于dropout、batchnormlization 來說,其train和test的方式不一樣、

需要對nn的狀態(tài)進行切換,假如每個類都是繼承nn的話,用下面操作可以直接轉(zhuǎn)入

test沒有test方法,只有eval方法

nn.sequential里面只能放類,不能放函數(shù)

所以要自己定義一些類 reshape,flatten

那個flatten可以直接抄上面的,這樣就可以寫在一個seq里面 不用分兩個了

按道理要寫requ的,初始化定義torch tenseor 是不會加到nn.parameter。如果不自動加,調(diào)用nn.parameter函數(shù)就不能得到那個參數(shù)的了,會使得優(yōu)化不方便

nn自帶了一個nn.Parameter函數(shù)可以封裝數(shù)據(jù),包裝tensor自動的加入到nn.parameter上去,自動的被SGD優(yōu)化。

上面沒寫requ是因為nn.Parameter能夠自動的將梯度信息設(shè)置為ture

假如此處只用了torch.randn(),其w。b參數(shù)不會傳入nn.parameter里面去,就不能將數(shù)據(jù)傳入optimizer

注意parameter的大小寫

此處的mylinear類和liner類功能一模一樣,實現(xiàn)了自己的底層 操作


數(shù)據(jù)增強

big data

可以很好的預(yù)防過擬合

數(shù)據(jù)增強:即對數(shù)據(jù)進行多樣化處理,然后得到更多的數(shù)據(jù)

數(shù)據(jù)少的時候要減輕網(wǎng)絡(luò)的參數(shù)量(capacity)

regularization:正則化,迫使網(wǎng)絡(luò)一些高階參數(shù)接近于0

data argumentation:意思是對于原來的一些數(shù)據(jù)進行增強,對照片進行變換,比如旋轉(zhuǎn)、裁剪、調(diào)色、加噪聲。效果比真實的同數(shù)量的差很多,但是一般比原來沒有變換的情況好很多

四種比較常用的方法

flip:翻轉(zhuǎn)的意思

具體操作如上。random是隨機的一i是,即這一步有可能做有可能不做

rotate:旋轉(zhuǎn)操作

主要有兩個方式,第一個為給定最大的旋轉(zhuǎn)角度,(15)即旋轉(zhuǎn)的角度為-15---15,或者如第二種,給定幾個固定的旋轉(zhuǎn)角度【0,90,180,270】

scale:縮放

縮放是從中心點往外縮放,

使用resize函數(shù)


里面參數(shù)為【32,32】是一個參數(shù)

crop part

隨機裁剪的操作

noise:用的比較小,加入些高斯白噪聲啥的

使用數(shù)據(jù)增強技術(shù)可能會使得樣本數(shù)量趨于很大,但是對于訓(xùn)練來說幫助有,但沒想的那么多,variance太小。


神經(jīng)網(wǎng)絡(luò)實戰(zhàn)

與sigmoid函數(shù)之前的叫l(wèi)ogits

CELoss包含了softmax和loss的計算

用于告訴torch需要backprop,不會打亂計算圖

stride 對于圖片維度的降低有著很好的效果

設(shè)計時候,一般取得hw越來越小,ch越來越大效果會比較好


embedding:嵌入


時間序列表示方法


one-hot 是非常稀疏的,占用了大量的空間

特性是:稀疏的,高緯度的,語義相似性

導(dǎo)致其用的很少


rnn原理

使用weight sharing的方式來實現(xiàn)上下語境的共享

類似kernel

使用一個新的存儲單元consistent memory,用來連接前后語境


rnn和cnn的區(qū)別就是cnn只會一股腦往前傳,而rnn的話會有一個核心變量ht,一個類似于語境信息,會自我跟新

ht(memery)

RNN主要用的激活函數(shù)為tanh

rnn中使用了權(quán)值共享,所以rnn的參數(shù)量并不大

rnn layer

不僅實現(xiàn)了權(quán)值的共享,還實現(xiàn)了語境的貫穿,考慮了上一步的輸入。

有個h的單元,類似于記憶,會把語句的信息存儲下來

rnn 的layer使用


h是最后一個時間的所有memery的狀態(tài)

out是指所有時間點上最后一個memery的狀態(tài)


84 時間序列預(yù)測實戰(zhàn)


為什么會出現(xiàn)梯度彌散和梯度爆炸的現(xiàn)象呢?、


原因是求梯度時候有個whh的k次方,當(dāng)層數(shù)變高時候,就會出現(xiàn)此現(xiàn)象。

梯度爆炸:loss突然上升。

解決方法:做梯度的clipping(不是weight的)

梯度彌散:lstm方法

long short—trem memory 長短時記憶

short-term memory 是指rnn的h只是短時的語境記憶,現(xiàn)在加個long,加長記憶

rnn的模式

lstm的模式


lstm為什么能有效的解決梯度彌散的問題,主要是由rnn的連乘,換成了四項的加法,對于rnn出現(xiàn)的很多的很大很小梯度的現(xiàn)象有著制約的能力

有效避免了wr的k次方,還有個類似于retnet的shortcut的通道,也是一種解釋。

數(shù)據(jù)預(yù)處理的基本流程

106 遷移學(xué)習(xí)

簡單來說就是用以前學(xué)習(xí)的知識來弄現(xiàn)在的模型~不是從一個隨機初始化的角度開始的,從良好的性能開始









pytorch入門首選,蘇黎世博士龍曲良老師手把手帶你敲代碼,全集150讓你掌握的評論 (共 條)

分享到微博請遵守國家法律
金沙县| 富源县| 志丹县| 巫溪县| 江门市| 寻甸| 林周县| 大余县| 剑川县| 谷城县| 电白县| 金堂县| 阜阳市| 浮梁县| 南召县| 五华县| 海南省| 贵港市| 潮安县| 益阳市| 濮阳市| 阜阳市| 大邑县| 辉南县| 达孜县| 镇巴县| 博乐市| 宁阳县| 高淳县| 景谷| 民县| 大丰市| 股票| 金溪县| 博野县| 内黄县| 张北县| 宁国市| 马边| 临西县| 建水县|