深度學(xué)習(xí)進(jìn)階筆記_第1頁
深度學(xué)習(xí)進(jìn)階筆記_第2頁
深度學(xué)習(xí)進(jìn)階筆記_第3頁
深度學(xué)習(xí)進(jìn)階筆記_第4頁
深度學(xué)習(xí)進(jìn)階筆記_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

深度學(xué)習(xí)進(jìn)階筆記之三|深入理解Alexnet引言TensorFlow是Google基于DistBelief進(jìn)行研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng),被廣泛用于語音識別或圖像識別等多項機器深度學(xué)習(xí)領(lǐng)域。其命名來源于本身的運行原理。Tensor(張量)意味著N維數(shù)組,F(xiàn)low(流)意味著基于數(shù)據(jù)流圖的計算,TensorFlow代表著張量從圖象的一端流動到另一端計算過程,是將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)傳輸至人工智能神經(jīng)網(wǎng)中進(jìn)行分析和處理的過程。TensorFlow完全開源,任何人都可以使用??稍谛〉揭徊恐悄苁謾C、大到數(shù)千臺數(shù)據(jù)中心服務(wù)器的各種設(shè)備上運行?!簷C器學(xué)習(xí)進(jìn)階筆記』系列將深入解析TensorFlow系統(tǒng)的技術(shù)實踐,從零開始,由淺入深,與大家一起走上機器學(xué)習(xí)的進(jìn)階之路。前面我們看了一些Tensorflow的文檔和一些比較有意思的項目(《機器學(xué)習(xí)進(jìn)階筆記之二|深入理解業(yè)回呈史》),發(fā)現(xiàn)這里面水很深的,需要多花時間好好從頭了解下,尤其是cv這塊的東西,特別感興趣,接下來一段時間會開始深入了解ImageNet比賽中中獲得好成績的那些模型:AlexNet、GoogLeNet、VGG(對就是之前在nerualnetwork用的pretrained的model)、deepresidualnetworks。ImageNetClassificationwithDeepConvolutionalNeuralNetworksImageNetClassificationwithDeepConvolutionalNeuralNetworks是Hinton和他的學(xué)生AlexKrizhevsky在12年ImageNetChallenge使用的模型結(jié)構(gòu),刷新了ImageClassification的幾率,從此deeplearning在Image這塊開始一次次超過state-of-art,甚至于搭到打敗人類的地步,看這邊文章的過程中,發(fā)現(xiàn)了很多以前零零散散看到的一些優(yōu)化技術(shù),但是很多沒有深入了解,這篇文章講解了他們alexnet如何做到能達(dá)到那么好的成績,好的廢話不多說,來開始看文章這張圖是基本的caffe中alexnet的網(wǎng)絡(luò)結(jié)構(gòu),這里比較抽象,我用caffe的draw_net把alexnet的網(wǎng)絡(luò)結(jié)構(gòu)畫出來了AlexNet的基本結(jié)構(gòu)alexnet總共包括8層,其中前5層convolutional,后面3層是full-connected,文章里面說的是減少任何一個卷積結(jié)果會變得很差,下面我來具體講講每一層的構(gòu)成:一層卷積層輸入圖像為227*227*3(paper上貌似有點問題224*224*3)的圖像,使用了96個kernels(96,11,11,3),以4個pixel為一個單位來右移或者下移,能夠產(chǎn)生5555個卷積后的矩形框值,然后進(jìn)行esponse-normalized(其實是LocalResponseNormalized,后面我會講下這里)和pooled之后,pool這一層好像caffe里面的alexnet和paper里面不太一樣,alexnet里面采樣了兩個GPU,所以從圖上面看一層卷積層厚度有兩部分,池化pool_size=(3,3)滑動步長為2個pixels,得到96個2727個feature。二層卷積層使用256個(同樣,分布在兩個GPU上,每個128kernels(5*5*48)),做pad_size(2,2)的處理,以1個pixel為單位移動(感謝網(wǎng)友指出),能夠產(chǎn)生27*27個卷積后的矩陣框,做LRN處理,然后pooled,池化以3*3矩形框,2個pixel為步長,得到256個13*13個features。三層、四層都沒有LRN和pool,第五層只有pool,其中第三層使用384個kernels(3*3*256,pad_size=(1,1),得到256*15*15,kernel_size為(3,3),以1個pixel為步長,得到256*13*13);第四層使用384個kernels(pad_size(1,1)得到256*15*15,核大小為(3,3)步長為1個pixel,得到384*13*13);第五層使用256個kernels(pad_size(1,1)得到384*15*15,kernel_size(3,3),得到256*13*13,pool_size(3,3)步長2個pixels,得到256*6*6)。全連接層:前兩層分別有4096個神經(jīng)元,末尾輸出softmax為1000個(ImageNet),注意caffe圖中全連接層中有relu、dropout、innerProduct。(感謝AnaZou指出上面之前的一些問題)paper里面也指出了這張圖是在兩個GPU下做的,其中和caffe里面的alexnet可能還真有點差異,但這可能不是重點,各位在使用的時候,直接參考caffe中的alexnet的網(wǎng)絡(luò)結(jié)果,每一層都十分詳細(xì),基本的結(jié)構(gòu)理解和上面是一致的。AlexNet為啥取得比較好的結(jié)果前面講了下AlexNet的基本網(wǎng)絡(luò)結(jié)構(gòu),大家肯定會對其中的一些點產(chǎn)生疑問,比如LRN、Relu、dropout,相信接觸過dl的小伙伴們都有聽說或者了解過這些。這里我講按paper中的描述詳細(xì)講述這些東西為什么能提高網(wǎng)絡(luò)的性能。ReLUNonlinearity一般來說,剛接觸神經(jīng)網(wǎng)絡(luò)還沒有深入了解深度學(xué)習(xí)的小伙伴們對這個都不會太熟,一般都會更了解另外兩個激活函數(shù)(真正往神經(jīng)網(wǎng)絡(luò)中引入非線性關(guān)系,使神經(jīng)網(wǎng)絡(luò)能夠有效擬合非線性函數(shù))tanh(x)和(1+e^(-x))A(-1),而ReLU(RectifiedLinearUnits)f(x)=max(0,x)。基于ReLU的深度卷積網(wǎng)絡(luò)比基于tanh的網(wǎng)絡(luò)訓(xùn)練塊數(shù)倍,下圖是一個基于CIFAR-10的四層卷積網(wǎng)絡(luò)在tanh和ReLU達(dá)到I25%的trainingerror的迭代次數(shù):實線、間斷線分別代表的是ReLU、tanh的trainingerror,可見ReLU比tanh能夠更快的收斂LocalResponseNormalization使用ReLUf(x)=max(0,x)后,你會發(fā)現(xiàn)激活函數(shù)之后的值沒有了tanh、sigmoid函數(shù)那樣有一個值域區(qū)間,所以一般在ReLU之后會做一個normalization,LRU就是穩(wěn)重提出(這里不確定,應(yīng)該是提出?)一種方法,在神經(jīng)科學(xué)中有個概念叫“Lateralinhibition",講的是活躍的神經(jīng)元對它周邊神經(jīng)元的影響。DropoutDropout也是經(jīng)常挺說的一個概念,能夠比較有效地防止神經(jīng)網(wǎng)絡(luò)的過擬合。相對于一般如線性模型使用正則的方法來防止模型過擬合,而在神經(jīng)網(wǎng)絡(luò)中Dropout通過修改神經(jīng)網(wǎng)絡(luò)本身結(jié)構(gòu)來實現(xiàn)。對于某一層神經(jīng)元,通過定義的概率來隨機刪除一些神經(jīng)元,同時保持輸入層與輸出層神經(jīng)元的個人不變,然后按照神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)方法進(jìn)行參數(shù)更新,下一次迭代中,重新隨機刪除一些神經(jīng)元,直至訓(xùn)練結(jié)束DataAugmentation

其實,比較簡單的增強模型性能,防止模型過擬合的方法是增加數(shù)據(jù),但是其實增加數(shù)據(jù)也是有策略的,paper當(dāng)中從256*256中隨機提出227*227的patches(paper里面是224*224),還有就是通過PCA來擴(kuò)展數(shù)據(jù)集。這樣就很有效地擴(kuò)展了數(shù)據(jù)集,其實還有更多的方法視你的業(yè)務(wù)場景去使用,比如做基本的圖像轉(zhuǎn)換如增加減少亮度,一些濾光算法等等之類的,這是一種特別有效地手段,尤其是當(dāng)數(shù)據(jù)量不夠大的時候。文章里面,我認(rèn)為的基本內(nèi)容就是這個了,基本的網(wǎng)絡(luò)結(jié)構(gòu)和一些防止過擬合的小的技巧方法,對自己在后面的項目有很多指示作用。AlexNetOnTensorflowcaffe的AlexNet可以到/models/bvlc_alexnet/train_totxt去看看具體的網(wǎng)絡(luò)結(jié)構(gòu),這里我會弄點基于Tensorflow的AlexNet,代碼在:/~guerzhoy/tf_alexnet/fromnumpyimportimportosfrompylabimportimportnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.cbookascbookimporttimefromscipy.miscimportimreadfromscipy.miscimportimresizeimportmatplotlib.imageasmpimgfromscipy.ndimageimportfilters

importurllibfromnumpyimportrandomimporttensorflowastffromcaffe_classesimportclass_namestrain_x=zeros((1,227,227,3)).astype(float32)train_y=zeros((1,1000))xdim=train_x.shape[1:]ydim=train_y.shape[1]net_data=load("bvlc_alexnet.npy").item()defconv(input,kernel,biases,k_h,k_w,c_o,s_h,s_w,padding="VALID",group=1):'''From[/ethereon/caffe-tensorflow](/ethereon/caffe-tensorflow)'''c_i=input.get_shape()[-1]assertc_i%group==0assertc_o%group==0convolve=lambdai,k:tf.nn.conv2d(i,k,[1,s_h,s_w,1],padding=padding)

ifgroup==1:conv=convolve(input,kernel)else:input_groups=tf.split(3,group,input)kernel_groups=tf.split(3,group,kernel)output_groups=[convolve(i,k)fori,kinzip(input_groups,kernel_groups)]conv=tf.concat(3,output_groups)returntf.reshape(tf.nn.bias_add(conv,biases),conv.get_shape().as_list())x=tf.Variable(i)#conv1#conv(11,11,96,4,4,padding='VALID',name='conv1')k_h=11;k_w=11;c_o=96;s_h=4;s_w=4conv1W=tf.Variable(net_data["convT][0])conv1b=tf.Variable(net_data["convT][1])conv1_in=conv(x,conv1W,conv1b,k_h,k_w,c_o,s_h,s_w,padding="SAME",group=1)conv1=tf.nn.relu(conv1_in)

#lrn1#lrn(2,2e-05,0.75,name='norm1')radius=2;alpha=2e-05;beta=0.75;bias=1.0lrn1=tf.nn.local_response_normalization(conv1,depth_radius=radius,alpha=alpha,beta=beta,bias=bias)#maxpool1#max_pool(3,3,2,2,padding='VALID',name='pool1')k_h=3;k_w=3;s_h=2;s_w=2;padding='VALID'maxpool1=tf.nn.max_pool(lrn1,ksize=[1,k_h,k_w,1],strides=[1,s_h,s_w,1],padding=padding)#conv2#conv(5,5,256,1,1,group=2,name='conv2')k_h=5;k_w=5;c_o=256;s_h=1;s_w=1;group=2conv2W=tf.Variable(net_data["conv2"][0])conv2b=tf.Variable(net_data["conv2”][1])conv2_in=conv(maxpool1,conv2W,conv2b,k_h,k_w,c_o,s_h,s_w,padding="SAME”,group=group)conv2=tf.nn.relu(conv2_in)

#lrn2#lrn(2,2e-05,0.75,name='norm2')radius=2;alpha=2e-05;beta=0.75;bias=1.0lrn2=tf.nn.local_response_normalization(conv2,depth_radius=radius,alpha=alpha,beta=beta,bias=bias)#maxpool2#max_pool(3,3,2,2,padding='VALID',name='pool2')k_h=3;k_w=3;s_h=2;s_w=2;padding='VALID'maxpool2=tf.nn.max_pool(lrn2,ksize=[1,k_h,k_w,1],strides=[1,s_h,s_w,1],padding=padding)#conv3#conv(3,3,384,1,1,name='conv3')k_h=3;k_w=3;c_o=384;s_h=1;s_w=1;group=1conv3W=tf.Variable(net_data["conv3"][0])conv3b=tf.Variable(net_data["conv3”][1])conv3_in=conv(maxpool2,conv3W,conv3b,k_h,k_w,c_o,s_h,s_w,padding="SAME”,group=group)

conv3=tf.nn.relu(conv3_in)#conv4#conv(3,3,384,1,1,group=2,name='conv4')k_h=3;k_w=3;c_o=384;s_h=1;s_w=1;group=2conv4W=tf.Variable(net_data["conv4"][0])conv4b=tf.Variable(net_data["conv4”][1])conv4_in=conv(conv3,conv4W,conv4b,k_h,k_w,c_o,s_h,s_w,padding="SAME",group=group)conv4=tf.nn.relu(conv4_in)#conv5#conv(3,3,256,1,1,group=2,name='conv5')k_h=3;k_w=3;c_o=256;s_h=1;s_w=1;group=2conv5W=tf.Variable(net_data["conv5"][0])conv5b=tf.Variable(net_data["conv5”][1])conv5_in=conv(conv4,conv5W,conv5b,k_h,k_w,c_o,s_h,s_w,padding="SAME",group=group)conv5=tf.nn.relu(conv5_in)#maxpool5#max_pool(3,3,2,2,padding='VALID',name='pool5')k_h=3;k_w=3;s_h=2;s_w=2;padding='VALID'

maxpool5=tf.nn.max_pool(conv5,ksize=[1,k_h,k_w,1],strides=[1,s_h,s_w,1],padding=padding)#fc6#fc(4096,name='fc6')fc6W=tf.Variable(net_data["fc6"][0])fc6b=tf.Variable(net_data["fc6”][1])fc6=tf.nn.relu_layer(tf.reshape(maxpool5,[1,int(prod(maxpool5.get_shape()[1:]))]),fc6W,fc6b)#fc7#fc(4096,name='fc7')fc7W=tf.Variable(net_data["fc7"][0])fc7b=tf.Variable(net_data["fc7”][1])fc7=tf.nn.relu_layer(fc6,fc7W,fc7b)#fc8#fc(1000,relu=False,name='fc8')fc8W=tf.Variable(net_data["fc8"][0])fc8b=tf.Variable(net_data["fc8”][1])fc8=tf.nn.xw_plus_b(fc7,fc8W,fc8b)#prob

#softmax(name='prob'))prob=tf.nn.softmax(fc8)init=tf.initialize_all_variables()sess=tf.Session()sess.run(init)output=sess.run(prob)#################################################################################Output:inds=argsort(output)[0,:]foriinrange(5):printclass_names[inds[-1-i]],output[0,inds[-1-i]]這個是基于原生tensorflow的一版代碼,好長而且看著比較麻煩一點,還load了caffe里面生成的網(wǎng)絡(luò)模型,比較麻煩,這里找了一版稍微簡單的<【機器學(xué)習(xí)】AlexNet的tensorflow實現(xiàn)〉:#輸入數(shù)據(jù)importinput_datamnist=input_data.read_data_sets(7tmp/data/",one_hot=True)importtensorflowastf#定義網(wǎng)絡(luò)超參數(shù)learning_rate=0.001training_iters=200000batch_size=64display_step=20#定義網(wǎng)絡(luò)參數(shù)n_input=784#輸入的維度n_classes=10#標(biāo)簽的維度dropout=0.8#Dropout的概率#占位符輸入x=tf.placeholder(tf.types.float32,[None,n_input])y=tf.placeholder(tf.types.float32,[None,n_classes])keep_prob=tf.placeholder(tf.types.float32)#卷積操作defconv2d(name,l_input,w,b):returntf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(l_input,w,strides=[1,1,1,1],#較大下采樣操作defmax_pool(name,l_input,k):returntf.nn.max_pool(l_input,ksize=[1,k,k,1],strides=[1,k,k,1],padding='SAME',name=name)#歸一化操作defnorm(name,l_input,lsize=4):returntf.nn.lrn(l_input,lsize,bias=1.0,alpha=0.001/9.0,beta=0.75,name=name)#定義整個網(wǎng)絡(luò)defalex_net(_X,_weights,_biases,_dropout):#向量轉(zhuǎn)為矩陣_X=tf.reshape(_X,shape=[-1,28,28,1])#卷積層conv1=conv2d('conv1',_X,_weights['wc1'],_biases['bc1'])#下采樣層pool1=max_pool('pool1',conv1,k=2)#歸一化層norm1=norm('norm1',pool1,lsize=4)#Dropoutnorm1=tf.nn.dropout(norm1,_dropout)

#卷積conv2=conv2d('conv2',norml,_weights['wc2'],_biases['bc2'])#下采樣pool2=max_pool('pool2',conv2,k=2)#歸一化norm2=norm('norm2',pool2,lsize=4)Dropoutnorm2=tf.nn.dropout(norm2,_dropout)#卷積conv3=conv2d('conv3',norm2,_weights['wc3'],_biases['bc3'])#下采樣pool3=max_pool('pool3',conv3,k=2)#歸一化norm3=norm('norm3',pool3,lsize=4)Dropoutnorm3=tf.nn.dropout(norm3,_dropout)#全連接層,先把特征圖轉(zhuǎn)為向量dense1=tf.reshape(norm3,[-1,_weights['wd1'].get_shape().as_list()[0]])dense1=tf.nn.relu(tf.matmul(dense1,_weights['wd1'])+_biases['bd1'],name='fc1')#全連接層

dense2=tf.nn.relu(tf.matmul(dense1,_weights['wd2'])+_biases['bd2'],name='fc2')#Reluactivation#網(wǎng)絡(luò)輸出層out=tf.matmul(dense2,_weights['out'])+_biases['out']returnout#存儲所有的網(wǎng)絡(luò)參數(shù)weights={'wc1':tf.Variable(tf.random_normal([3,3,1,64])),'wc2':tf.Variable(tf.random_normal([3,3,64,128])),'wc3':tf.Variable(tf.random_normal([3,3,128,256])),'wd1':tf.Variable(tf.random_normal([4\*4\*256,1024])),'wd2':tf.Variable(tf.random_normal([1024,1024])),'out':tf.Variable(tf.random_normal([1024,10]))}biases={'bc1':tf.Variable(tf.random_normal([64])),'bc2':tf.Variable(tf.random_normal([128])),'bc3':tf.Variable(tf.random_normal([256])),'bd1':tf.Variable(tf.random_normal([1024])),'bd2':tf.Variable(tf.random_normal([1024])),'out':tf.Variable(tf.random_normal([n_classes]))#構(gòu)建模型pred=alex_net(x,weights,biases,keep_prob)#定義損失函數(shù)和學(xué)習(xí)步驟cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred,y))optimizer=tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)#測試網(wǎng)絡(luò)correct_pred=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))accuracy=tf.reduce_mean(tf.cast(correct_pred,tf.float32))#初始化所有的共享變量init=tf.initialize_all_variables()#開啟一個訓(xùn)練withtf.Session()assess:sess.run(init)step=1#Keeptraininguntilreachmaxiterationswhilestep\*batch_size<training_iters:batch_xs,batch_ys=mnist.train.next_batch(batch_size)#獲取批數(shù)據(jù)sess.run(optimizer,feed_dict={x:batch_xs,y:batch_ys,keep_prob:dropout})

ifstep%display_step==0:#計算精度acc=sess.run(accuracy,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.})#計算損失值loss=sess.run(cost,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.})print"Iter"+str(step\*batch_size)+",MinibatchLoss="+"{:.6f}".format(loss)+",TrainingAccuracy="+"{:.5f}".format(acc)step+=1print"OptimizationFinished!"#計算測試精度print"TestingAccuracy:",sess.run(accuracy,feed_dict={x:mnist.test.images[:256],y:mnist.test.labels[:256],keep_prob:1.})基于mnist構(gòu)建alexnet,這里的input可以去tensorflow的github上去找找,這一版代碼比較簡單。后來發(fā)現(xiàn)了tflearn里面有一^個alexnet來分類Oxford的例子,好開心,在基于tflearn對一些日常layer的封裝,代碼量只有不到50行,看了下內(nèi)部layer的實現(xiàn),挺不錯的,寫代碼的時候可以多參考參考,代碼地址:/tflearn/tflearn/blob/master/examples/images/alexnet.py.from__future__importdivision,print_function,absolute_importimporttflearnfromtflearn.layers.coreimportinput_data,dropout,fully_connectedfromtflearn.layers.convimportconv_2d,max_pool_2dfromtflearn.layers.normalizationimportlocal_response_normalizationfromtflearn.layers.estimatorimportregressionimporttflearn.datasets.oxflower17asoxflower17X,Y=oxflower17.load_data(one_hot=True,resize_pics=(227,227))#Building'AlexNet'network=input_data(shape=[None,227,227,3])network=conv_2d(network,96,11,strides=4,activation='relu')network=max_pool_2d(network,3,strides=2)net

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論