一宣吱、卷積&池化
卷積
- 卷積能抽取特征
- 多層卷積能抽取復(fù)雜特征
- 卷積神經(jīng)網(wǎng)絡(luò)每層的卷積核權(quán)重是由數(shù)據(jù)驅(qū)動(dòng)學(xué)習(xí)得來,不是人工設(shè)計(jì)的,人工只能勝任簡單卷積核的設(shè)計(jì)吮旅,像邊緣,但在邊緣響應(yīng)圖之上設(shè)計(jì)出能描述復(fù)雜模式的卷積核則十分困難味咳。
- 數(shù)據(jù)驅(qū)動(dòng)卷積神經(jīng)網(wǎng)絡(luò)逐層學(xué)到由簡單到復(fù)雜的特征(模式)庇勃,復(fù)雜模式是由簡單模式組合而成,比如Layer4的狗臉是由Layer3的幾何圖形組合而成槽驶,Layer3的幾何圖形是由Layer2的紋理組合而成责嚷,Layer2的紋理是由Layer1的邊緣組合而成,從特征圖上看的話掂铐,Layer4特征圖上一個(gè)點(diǎn)代表Layer3某種幾何圖形或表面的組合罕拂,Layer3特征圖上一個(gè)點(diǎn)代表Layer2某種紋理的組合,Layer2特征圖上一個(gè)點(diǎn)代表Layer1某種邊緣的組合全陨。
- 這種組合是一種相對靈活的方式在進(jìn)行爆班,不同的邊緣→不同紋理→不同幾何圖形和表面→不同的狗臉、不同的物體……辱姨,前面層模式的組合可以多種多樣蛋济,使后面層可以描述的模式也可以多種多樣,所以具有很強(qiáng)的表達(dá)能力炮叶,不是“死板”的模板碗旅,而是“靈活”的模板,泛化能力更強(qiáng)镜悉。
- 卷積神經(jīng)網(wǎng)絡(luò)真正使用時(shí)祟辟,還需要配合池化、激活函數(shù)等侣肄,以獲得更強(qiáng)的表達(dá)能力旧困,但模式蘊(yùn)含在卷積核中,如果沒有非線性激活函數(shù),網(wǎng)絡(luò)仍能學(xué)到模式吼具,但表達(dá)能力會(huì)下降僚纷,由論文《Systematic evaluation of CNN advances on the ImageNet》,在ImageNet上拗盒,使用調(diào)整后的caffenet怖竭,不使用非線性激活函數(shù)相比使用ReLU的性能會(huì)下降約8個(gè)百分點(diǎn),如下圖所示陡蝇。通過池化和激活函數(shù)的配合痊臭,可以看到復(fù)現(xiàn)出的每層學(xué)到的特征是非常單純的,狗登夫、人广匙、物體是清晰的,少有其他其他元素的干擾恼策,可見網(wǎng)絡(luò)學(xué)到了待檢測對象區(qū)別于其他對象的模式鸦致。
卷積后大小
池化(下采樣)
?在每一次卷積的時(shí)候, 神經(jīng)層可能會(huì)無意地丟失一些信息. 這時(shí), 池化 (pooling) 就可以很好地解決這一問題. 也就是說在卷集的時(shí)候, 我們不壓縮長寬, 盡量地保留更多信息, 壓縮的工作就交給池化了,這樣的一項(xiàng)附加工作能夠很有效的提高準(zhǔn)確性.
? 池化(Pooling)是卷積神經(jīng)網(wǎng)絡(luò)中另一個(gè)重要的概念,它實(shí)際上是一種形式的降采樣涣楷。有多種不同形式的非線性池化函數(shù)蹋凝,而其中“最大池化(Max pooling)”是最為常見的。它是將輸入的圖像劃分為若干個(gè)矩形區(qū)域总棵,對每個(gè)子區(qū)域輸出最大值鳍寂。直覺上,這種機(jī)制能夠有效地原因在于情龄,在發(fā)現(xiàn)一個(gè)特征之后迄汛,它的精確位置遠(yuǎn)不及它和其他特征的相對位置的關(guān)系重要。池化層會(huì)不斷地減小數(shù)據(jù)的空間大小骤视,因此參數(shù)的數(shù)量和計(jì)算量也會(huì)下降鞍爱,這在一定程度上也控制了過擬合。通常來說专酗,CNN的卷積層之間都會(huì)周期性地插入池化層睹逃。
?池化層通常會(huì)分別作用于每個(gè)輸入的特征并減小其大小。當(dāng)前最常用形式的池化層是每隔2個(gè)元素從圖像劃分出2*2的區(qū)塊祷肯,然后對每個(gè)區(qū)塊中的4個(gè)數(shù)取最大值沉填。這將會(huì)減少75%的數(shù)據(jù)量。
二佑笋、卷積神經(jīng)網(wǎng)絡(luò) Convolutional Neural Networks(CNN)
?卷積也就是說神經(jīng)網(wǎng)絡(luò)不再是對每個(gè)像素的輸入信息做處理了,而是圖片上每一小塊像素區(qū)域進(jìn)行處理, 這種做法加強(qiáng)了圖片信息的連續(xù)性. 使得神經(jīng)網(wǎng)絡(luò)能看到圖形, 而非一個(gè)點(diǎn). 這種做法同時(shí)也加深了神經(jīng)網(wǎng)絡(luò)對圖片的理解. 具體來說, 卷積神經(jīng)網(wǎng)絡(luò)有一個(gè)批量過濾器, 持續(xù)不斷的在圖片上滾動(dòng)收集圖片里的信息,每一次收集的時(shí)候都只是收集一小塊像素區(qū)域, 然后把收集來的信息進(jìn)行整理, 這時(shí)候整理出來的信息有了一些實(shí)際上的呈現(xiàn), 比如這時(shí)的神經(jīng)網(wǎng)絡(luò)能看到一些邊緣的圖片信息, 然后在以同樣的步驟, 用類似的批量過濾器掃過產(chǎn)生的這些邊緣信息, 神經(jīng)網(wǎng)絡(luò)從這些邊緣信息里面總結(jié)出更高層的信息結(jié)構(gòu),比如說總結(jié)的邊緣能夠畫出眼睛,鼻子等等. 再經(jīng)過一次過濾, 臉部的信息也從這些眼睛鼻子的信息中被總結(jié)出來. 最后我們再把這些信息套入幾層普通的全連接神經(jīng)層進(jìn)行分類, 這樣就能得到輸入的圖片能被分為哪一類的結(jié)果了.
?一張圖片,有長, 寬, 高 三個(gè)參數(shù). 這里的高指的是計(jì)算機(jī)用于產(chǎn)生顏色使用的信息. 如果是黑白照片的話, 高的單位就只有1, 如果是彩色照片, 就可能有紅綠藍(lán)三種顏色的信息, 這時(shí)的高度為3. 我們以彩色照片為例子. 過濾器就是影像中不斷移動(dòng)的東西, 他不斷在圖片收集小批小批的像素塊, 收集完所有信息后, 輸出的值, 我們可以理解成是一個(gè)高度更高,長和寬更小的”圖片”. 這個(gè)圖片里就能包含一些邊緣信息. 然后以同樣的步驟再進(jìn)行多次卷積, 將圖片的長寬再壓縮, 高度再增加, 就有了對輸入圖片更深的理解. 將壓縮,增高的信息嵌套在普通的分類神經(jīng)層上,我們就能對這種圖片進(jìn)行分類了.
包含卷積層的神經(jīng)網(wǎng)絡(luò)翼闹、擅長處理圖像
常見網(wǎng)絡(luò):LeNet、AlexNet蒋纬、VGG16猎荠、GoogleNet坚弱、ResNet
三、循環(huán)神經(jīng)網(wǎng)絡(luò) Recurrent Neural Networks(RNN)
序列數(shù)據(jù)
我們想象現(xiàn)在有一組序列數(shù)據(jù) data 0,1,2,3. 在當(dāng)預(yù)測 result0 的時(shí)候,我們基于的是 data0, 同樣在預(yù)測其他數(shù)據(jù)的時(shí)候, 我們也都只單單基于單個(gè)的數(shù)據(jù). 每次使用的神經(jīng)網(wǎng)絡(luò)都是同一個(gè) NN. 不過這些數(shù)據(jù)是有關(guān)聯(lián) 順序的 , 就像在廚房做菜, 醬料 A要比醬料 B 早放, 不然就串味了. 所以普通的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)并不能讓 NN 了解這些數(shù)據(jù)之間的關(guān)聯(lián).
處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)
那我們?nèi)绾巫寯?shù)據(jù)間的關(guān)聯(lián)也被 NN 加以分析呢? 想想我們?nèi)祟愂窃趺捶治龈鞣N事物的關(guān)聯(lián)吧, 最基本的方式,就是記住之前發(fā)生的事情. 那我們讓神經(jīng)網(wǎng)絡(luò)也具備這種記住之前發(fā)生的事的能力. 再分析 Data0 的時(shí)候, 我們把分析結(jié)果存入記憶. 然后當(dāng)分析 data1的時(shí)候, NN會(huì)產(chǎn)生新的記憶, 但是新記憶和老記憶是沒有聯(lián)系的. 我們就簡單的把老記憶調(diào)用過來, 一起分析. 如果繼續(xù)分析更多的有序數(shù)據(jù) , RNN就會(huì)把之前的記憶都累積起來, 一起分析.
再重復(fù)一遍剛才的流程, 不過這次是以加入一些數(shù)學(xué)方面的東西. 每次 RNN 運(yùn)算完之后都會(huì)產(chǎn)生一個(gè)對于當(dāng)前狀態(tài)的描述 , state. 我們用簡寫 S( t) 代替, 然后這個(gè) RNN開始分析 x(t+1) , 他會(huì)根據(jù) x(t+1)產(chǎn)生s(t+1), 不過此時(shí) y(t+1) 是由 s(t) 和 s(t+1) 共同創(chuàng)造的. 所以我們通彻匾。看到的 RNN 也可以表達(dá)成這種樣子.
為處理時(shí)序數(shù)據(jù)而設(shè)計(jì)的荒叶,例如一段文字或者語音
常見網(wǎng)絡(luò):長短期記憶(long short-term memory,LSTM)
典型的循環(huán)神經(jīng)網(wǎng)絡(luò)LeNet
LeNet網(wǎng)絡(luò)最早由紐約大學(xué)的Yann LeCun等人于1998年提出输虱,也稱LeNet5些楣,它是卷積神經(jīng)網(wǎng)絡(luò)的鼻祖,被譽(yù)為卷積神經(jīng)網(wǎng)絡(luò)的"Hello World"悼瓮。
第一個(gè)卷積層
第一個(gè)池化層
第二個(gè)卷積層
第二個(gè)池化層
全連接卷積層
全連接層
全連接層(輸出層)
Numpy
- 關(guān)鍵字
方法 | 功能 |
---|---|
array | 創(chuàng)建數(shù)組 |
dtype | 指定數(shù)據(jù)類型 |
zeros | 創(chuàng)建數(shù)據(jù)全為0 |
ones | 創(chuàng)建數(shù)據(jù)全為1 |
empty | 創(chuàng)建數(shù)據(jù)接近0 |
arrange | 按指定范圍創(chuàng)建數(shù)據(jù) |
reshape | 重構(gòu) |
linspace | 創(chuàng)建線段 |
mat與array區(qū)別
- mat()函數(shù)與array()函數(shù)生成矩陣所需的數(shù)據(jù)格式有區(qū)別,mat()函數(shù)中數(shù)據(jù)可以為字符串以分號(;)分割艰猬,或者為列表形式以逗號(横堡,)分割。而array()函數(shù)中數(shù)據(jù)只能以(冠桃,)分割
- mat()函數(shù)與array()函數(shù)生成的矩陣計(jì)算方式不同
1.mat()函數(shù)中矩陣的乘積可以使用(星號) * 或 .dot()函數(shù)命贴,其結(jié)果相同。而矩陣對應(yīng)位置元素相乘需調(diào)用numpy.multiply()函數(shù)食听。
2.array()函數(shù)中矩陣的乘積只能使用 .dot()函數(shù)胸蛛。而星號乘 (*)則表示矩陣對應(yīng)位置元素相乘,與numpy.multiply()函數(shù)結(jié)果相同樱报。
a = np.array([2,23,4]) # a = [2 23 4] a = np.array([2,23,4],dtype=np.int) # a.dtype = int32 a = np.zeros((3,4)) # 三行四列全零數(shù)組 a = np.ones((3,4)) # 三行四列全一數(shù)組 a = np.arange(10,20,2) # a = [10, 12, 14, 16, 18] a = np.arange(12).reshape((3,4)) # a = [[0,1,2,3],[4,5,6,7],[8,9,10,11,]]
- 運(yùn)算
+ - * / 運(yùn)算:為對應(yīng)位的運(yùn)算 算符兩側(cè)矩陣類型需相同
比較運(yùn)算: 輸出的是矩陣中每一位進(jìn)行比較運(yùn)算結(jié)果的矩陣
矩陣乘法運(yùn)算:a×b = a.dot(b)
- 方法
a.shape() #獲取矩陣a的屬性 np.argmin(a) #矩陣a中最小元素的索引 np.argmax(a) #矩陣a中最大元素的索引 np.mean(a) or np.average(a) #矩陣均值(a.mean() a.average()) np.average(a,weights = w) #矩陣a按w加權(quán)均值 np.median() #中位數(shù) np.cumsum() #累加 np.diff() #每項(xiàng)中后一項(xiàng)與前一項(xiàng)之差 np.nonzero() #矩陣中不為0的元素的坐標(biāo) np.sort() #對每行從小到大排序 np.transpose(A) = A.T #轉(zhuǎn)置 np.clip(A,min,max) #限幅 np.flatten() #展開成一行 np.vstack(a,b) #a,b按行合并 np.hstack(a,b) #a,b按列合并 np.split(A,x,axis=0/1) #a,b分割 0橫1縱(只能等量分割) np.array_split() #不等量分割 vsplit()/hsplit() #橫/縱分割
- 索引
A[a] : 第a行的所有元素
A[a][b:c] : a行b到c列的元素
- 賦值
矩陣間使用等號賦值具有關(guān)聯(lián)性
使用b=a.copy()賦值沒有關(guān)聯(lián)性
Pandas
- Series
索引在左邊葬项,值在右邊。自動(dòng)創(chuàng)建一個(gè)0到N-1(N為長度)的整數(shù)型索引迹蛤。
s = pd.Series([1,3,6,np.nan,44,1]) print(s) """ 0 1.0 1 3.0 2 6.0 3 NaN 4 44.0 5 1.0 dtype: float64 """
- DataFrame
DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu)民珍,它包含有一組有序的列,每列可以是不同的值類型(數(shù)值盗飒,字符串嚷量,布爾值等)。DataFrame既有行索引也有列索引逆趣, 它可以被看做由Series組成的大字典蝶溶。
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d']) print(df) """ a b c d 2016-01-01 -0.253065 -2.071051 -0.640515 0.613663 2016-01-02 -1.147178 1.532470 0.989255 -0.499761 2016-01-03 1.221656 -2.390171 1.862914 0.778070 2016-01-04 1.473877 -0.046419 0.610046 0.204672 2016-01-05 -1.584752 -0.700592 1.487264 -1.778293 2016-01-06 0.633675 -1.414157 -0.277066 -0.442545 """
MNIST數(shù)據(jù)集格式轉(zhuǎn)換
將圖片從28×28擴(kuò)充為32×32
np.pad(xtrain, ((0,0), (2,2), (2,2), 'constant', constant_values=0)
數(shù)據(jù)類型轉(zhuǎn)換
x_train = xtrain.astype('float32')
數(shù)據(jù)正則化
xtrain /= 255
數(shù)據(jù)維度轉(zhuǎn)換([n, h, w, c])
x_train.reshape(x_train.shape[0], 32, 32, 1)