LeNet:基于漸變的學(xué)習(xí)應(yīng)用于文檔識(shí)別
一些要點(diǎn):
每個(gè)卷積層包含三個(gè)部分:卷積裙秋、池化和非線性激活函數(shù)
使用卷積提取空間特征
降采樣(Subsample)的平均池化層(Average?Pooling)
雙曲正切(Tanh)或S型(Sigmoid)的激活函數(shù)
MLP作為最后的分類器
層與層之間的稀疏連接減少計(jì)算復(fù)雜度
#coding=utf-8
from keras.models import Sequential
from keras.layers import Dense,Flatten
from keras.layers.convolutional import Conv2D,MaxPooling2D
from keras.utils.np_utils import to_categorical
import numpy as np
model = Sequential()
model.add(Conv2D(32,(5,5),strides=(1,1),input_shape=(32,32,1),padding='valid',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64,(5,5),strides=(1,1),padding='valid',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(100,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])
model.summary()
model.fit(train_x,train_y,validation_data=(valid_x,valid_y),batch_size=20,epochs=20,verbose=2)
#[0.031825309940411217, 0.98979999780654904]
print model.evaluate(test_x,test_y,batch_size=20,verbose=2)
AlexNet:具有深卷積神經(jīng)網(wǎng)絡(luò)的ImageNet分類
AlexNet將LeNet的思想發(fā)揚(yáng)光大,把CNN的基本原理應(yīng)用到了很深很寬的網(wǎng)絡(luò)中芜果。AlexNet主要使用到的新技術(shù)點(diǎn)如下:
成功使用ReLU作為CNN的激活函數(shù)麸祷,并驗(yàn)證其效果在較深的網(wǎng)絡(luò)超過了Sigmoid魄咕,成功解決了Sigmoid在網(wǎng)絡(luò)較深時(shí)的梯度彌散問題。雖然ReLU激活函數(shù)在很久之前就被提出了,但是直到AlexNet的出現(xiàn)才將其發(fā)揚(yáng)光大磕诊。
訓(xùn)練時(shí)使用Dropout隨機(jī)忽略一部分神經(jīng)元,以避免模型過擬合纹腌。Dropout雖有單獨(dú)的論文論述霎终,但是AlexNet將其實(shí)用化,通過實(shí)踐證實(shí)了它的效果升薯。在AlexNet中主要是最后幾個(gè)全連接層使用了Dropout莱褒。
在CNN中使用重疊的最大池化。此前CNN中普遍使用平均池化涎劈,AlexNet全部使用最大池化广凸,避免平均池化的模糊化效果。并且AlexNet中提出讓步長(zhǎng)比池化核的尺寸小蛛枚,這樣池化層的輸出之間會(huì)有重疊和覆蓋谅海,提升了特征的豐富性。
提出了LRN層蹦浦,對(duì)局部神經(jīng)元的活動(dòng)創(chuàng)建競(jìng)爭(zhēng)機(jī)制扭吁,使得其中響應(yīng)比較大的值變得相對(duì)更大,并抑制其他反饋較小的神經(jīng)元盲镶,增強(qiáng)了模型的泛化能力侥袜。
使用CUDA加速深度卷積網(wǎng)絡(luò)的訓(xùn)練,利用GPU強(qiáng)大的并行計(jì)算能力徒河,處理神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí)大量的矩陣運(yùn)算系馆。AlexNet使用了兩塊GTX?580?GPU進(jìn)行訓(xùn)練,單個(gè)GTX?580只有3GB顯存顽照,這限制了可訓(xùn)練的網(wǎng)絡(luò)的最大規(guī)模由蘑。因此作者將AlexNet分布在兩個(gè)GPU上闽寡,在每個(gè)GPU的顯存中儲(chǔ)存一半的神經(jīng)元的參數(shù)。
數(shù)據(jù)增強(qiáng)尼酿,隨機(jī)地從256256的原始圖像中截取224224大小的區(qū)域(以及水平翻轉(zhuǎn)的鏡像)爷狈,相當(dāng)于增加了(256224)2*2=2048倍的數(shù)據(jù)量。如果沒有數(shù)據(jù)增強(qiáng)裳擎,僅靠原始的數(shù)據(jù)量涎永,參數(shù)眾多的CNN會(huì)陷入過擬合中,使用了數(shù)據(jù)增強(qiáng)后可以大大減輕過擬合鹿响,提升泛化能力羡微。進(jìn)行預(yù)測(cè)時(shí),則是取圖片的四個(gè)角加中間共5個(gè)位置惶我,并進(jìn)行左右翻轉(zhuǎn)妈倔,一共獲得10張圖片,對(duì)他們進(jìn)行預(yù)測(cè)并對(duì)10次結(jié)果求均值绸贡。
#coding=utf-8
from keras.models import Sequential
from keras.layers import Dense,Flatten,Dropout
from keras.layers.convolutional import Conv2D,MaxPooling2D
from keras.utils.np_utils import to_categorical
import numpy as np
seed = 7
np.random.seed(seed)
model = Sequential()
model.add(Conv2D(96,(11,11),strides=(4,4),input_shape=(227,227,3),padding='valid',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Conv2D(256,(5,5),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000,activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
model.summary()
VGGNet:用于大規(guī)模圖像識(shí)別的非常深的卷積網(wǎng)絡(luò)
#coding=utf-8
from keras.models import Sequential
from keras.layers import Dense,Flatten,Dropout
from keras.layers.convolutional import Conv2D,MaxPooling2D
import numpy as np
seed = 7
np.random.seed(seed)
model = Sequential()
model.add(Conv2D(64,(3,3),strides=(1,1),input_shape=(224,224,3),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(64,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(128,(3,2),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(128,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(512,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000,activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
model.summary()
import keras
base_model = keras.applications.VGG16(include_top=False,weights='imagenet',input_shape=(224,224,3))
base_model.summary()
GoogLeNet Inception V1