CNN卷積神經(jīng)網(wǎng)絡(luò)原理_第1頁
CNN卷積神經(jīng)網(wǎng)絡(luò)原理_第2頁
CNN卷積神經(jīng)網(wǎng)絡(luò)原理_第3頁
CNN卷積神經(jīng)網(wǎng)絡(luò)原理_第4頁
CNN卷積神經(jīng)網(wǎng)絡(luò)原理_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

一、CNN卷積神經(jīng)網(wǎng)絡(luò)原理簡介

http://blog.csdno

net/uO12162613/articIe/detaiIs/43225445

本文主要是詳細(xì)地解讀CNN的實(shí)現(xiàn)代碼。如果你沒學(xué)習(xí)過CNN,在此推薦周曉

藝師兄的博文:DeepLearning(深度學(xué)習(xí))學(xué)習(xí)筆記整理系列之(七),以及

UFLDL上的卷積特征提取、池化

CNN的最大特點(diǎn)就是稀疏連接(局部感受)和權(quán)值共享,如下面兩圖所示,左

為稀疏連接,右為權(quán)值共享。稀疏連接和權(quán)值共享可以減少所要訓(xùn)練的參數(shù),

減少計算復(fù)雜度。

layerm+lO

featuremap

layermQQlayerm

layerm-1OOOO0)layerm-l00O0O

至于CNN的結(jié)構(gòu),以經(jīng)典的LeNet5來說明:

這個圖真是無處不在,一談CNN,必說LeNet5,這圖來自于這篇論文:Gradient

—BasedLearningAppliedtoDocumentRecognition,論文很長,第7頁那

里開始講LeNet5這個結(jié)構(gòu),建議看看那部分。

我這里簡單說一下,LeNet5這張圖從左到右,先是input,這是輸入層,即輸

入的圖片。input-1ayer到C1這部分就是一卷積層(convoIution運(yùn)算),C1

到S2是一個子采樣層(pooling運(yùn)算),關(guān)于卷積和子采樣的具體過程可以

參考下圖:

然后,S2到C3又是卷積,C3到S4又是子采樣,可以發(fā)現(xiàn),卷積和子采樣都是

成對出現(xiàn)的,卷積后面一般跟著子采樣。S4到C5之間是全連接的,這就相當(dāng)

于一個MLP的隱含層了(如果你不清楚MLP,參考《DeepLearningtutorial

(3)MLP多層感知機(jī)原理簡介+代碼詳解》)oC5到F6同樣是全連接,也是相

當(dāng)于一個MLP的隱含層。最后從F6到輸出output,其實(shí)就是一個分類器,這

一層就叫分類層。

ok,CNN的基本結(jié)構(gòu)大概就是這樣,由輸入、卷積層、子采樣層、全連接層、

分類層、輸出這些基本“構(gòu)件”組成,一般根據(jù)具體的應(yīng)用或者問題,去確定

要多少卷積層和子采樣層、采用什么分類器。當(dāng)確定好了結(jié)構(gòu)以后,如何求解

層與層之間的連接參數(shù)?一般采用向前傳播(FP)+向后傳播(BP)的方法來訓(xùn)

練。具體可參考上面給出的鏈接。

layerm-lhiddenlayerm

Figure1:exampleofaconvolutionallayer

二、CNN卷積神經(jīng)網(wǎng)絡(luò)代碼詳細(xì)解讀(基于python+theano)

代碼來自于深度學(xué)習(xí)教程:ConvolutionalNeuralNetworks(LoNet),這

個代碼實(shí)現(xiàn)的是一個簡化了的LeNet5,具體如下:

?沒有實(shí)現(xiàn)location-specificgainandbiasparameters

?用的是maxpooIing,而不是average_pooling

?分類器用的是softmax,LeNet5用的是rbf

?LeNet5第二層并不是全連接的,本程序?qū)崿F(xiàn)的是全連接

另外,代碼里將卷積層和子采用層合在一^起,定義為“LeNetConvPoolLayer

“(卷積采樣層),這好理解,因為它們總是成對出現(xiàn)。但是有個地方需要注

意,代碼中將卷積后的輸出直接作為子采樣層的輸入,而沒有加偏置b再通過

sigmoid函數(shù)進(jìn)行映射,即沒有了下圖中fx后面的bx以及sigmoid映射,也

即直接由fx得到Cxo

最后,代碼中第一個卷積層用的卷積核有20個,第二個卷積層用50個,而不是

上面那張LeNet5圖中所示的6個和16個。

了解了這些,下面看代碼:

(1)導(dǎo)入必要的模塊

[python]viewplaincopy

1.importcPickle

2.importgzip

3.importos

4.importsys

5.importtime

6.

7.importnumpy

8.

9.importtheano

10.importtheano.tensorasT

11.fromtheanootensor,signa1importdownsampIe

12.fromtheanootensoronnetimportconv

(2)定義CNN的基本"構(gòu)件”

CNN的基本構(gòu)件包括卷積采樣層、隱含層、分類器,如下

?定義LeNetConvPooILayer(卷積+采樣層)

見代碼注釋:

[python]viewplaincopy

1."

2.卷積+下采樣合成一個層LeNetConvPooILayer

3.rng:隨機(jī)數(shù)生成器,用于初始化W

4.input:4維的向量,theanootensorodtensor4

5.filter_shape:(numberoffiIters,numinputfeaturemaps,fiIterheight,filterwid

th)

6.image_shape:(batchsize,numinputfeaturemaps,imageheight,imagewidth)

7.poolsize:(#rows,#coIs)

8.一“

9.CIassLeNetConvPooILayer(object):

10.def_init_(sef,rng,input,fiIter_shape,image_shape,pooIsize=

(2,2)):

11.

12.#assertcondition,condition為True,則繼續(xù)往下執(zhí)行,condition為FaIse,中斷程序

13.#image_shape[1]和filter_shape[1]都是numinputfeaturemaps,它們必須是一樣的。

14.assertimage_shape[1]==filter_shape[1]

15.seIfoinput=input

16.

17.4每個隱層神經(jīng)元(即像素)與上一層的連接數(shù)為

numinpulfealureniapb大fillerheight*fiIlerwidlh.

18.#可以用numpy.prod(fiItejshape[1:])來求得

19.fan_in=numpyoprod(filter_shape[1:])

20.

21.Slowerlayer上每個神經(jīng)元獲得的梯度來自

于:"numoutputfeaturemaps*filterheight*fiIterwidth”/poolingsize

22.fanout=(fiIter_shape[0]*numpy<>prod(filter_shape_2:])/

23.numpy0prod(poolsize))

24.

25.#以上求得fan_in、fan_out,將它們代入公式,以此朱庖機(jī)初始化W,W就是線性卷機(jī)核

26.Wbound=numpy.sqrt(6./(fanin+fanout))

27.seIf.W=theanooshared(

28.numpyoasarray(

29.rng.uniform(Iow=-W_bound,high=W_bound,size=fiIter_shape

30.dtype=theanooconfig,floatX

31.),

32.borrow=True

33.)

34.

35.#thebiasisa1Dtensor---onebiasperoutputfeaturemap

36.#偏置b是一維向量,每個輸出圖的特征圖都對應(yīng)一個偏置,

37.4而輸出的特征圖的個數(shù)由fiIter個數(shù)決定,因此用filter_shape[0]即numberoffilters來初始

38.b_vaIues=numpy.zeros((fiIter_shape

[0],),dtype=theano.config.fIoatX)

39.selfob=theanooshared(vaIue=b_vaIues,borrow二True)

40.

41.埔將輸入圖像與fiIter卷積,conv。conv2d函數(shù)

42.#卷積完沒有加b再通過sigmoid,這里是一處簡化。

43.conv_out=conv.conv2d(

44.input=input,

45.filters=selfoW,

46.fiIter_shape=filter_shape,

47.image_shape=image_shape

48.)

|49.

50.#maxpooling,最大子采樣過程

51.pooIed_out=downsampIeumax_pool_2d(

52.input=conv_out,

S3.ds=pooIsize,

54.ignore_border=True

55.)

56.

57.#加偏置,再通過tanh映射,得到卷積+子采樣層的最終揄出

58.埔因為b是一維向量,這里用維度轉(zhuǎn)換函數(shù)dimshuffIe將其reshape。比如b是(10,),

59.#則b。dimshuffIe('x',0.'x','x'))將其reshape為(1,10,1,1)

60.seIf.uulpul=T.lanh(puuIed_uul+self.b。

dimshuffIe(*x*,0,'x','x'))

61.#卷積+采樣層的參數(shù)

62.seIf.params=[self.W,self。b]

?定義隱含層HiddenLayer

這個跟上一篇文章《DeepLearningtutorial(3)MLP多層感知機(jī)原理簡介+

代碼詳解》中的HiddenLayer是一致的,直接拿過來:

[python]viewplaincopy

1.

2.注釋:

3.這是定義隱藏層的類,首先明確:隱藏層的輸入即input,渝出即隱藏層的神經(jīng)元個數(shù)。輸入層與隱藏層

是全連接的.

4.假設(shè)輸入是n_in維的向量(也可以說時n_in個神經(jīng)元),您藏層有n_out個神經(jīng)元,則因為是全連接,

5.一共有n_in*n_out個權(quán)重,故W大小時(n_in,n_out),n_in行n_out列,每一JU對應(yīng)隱藏層的每一

神經(jīng)元的連接權(quán)重。

6.b是偏置,隱藏層有n_out個神經(jīng)元,故b時nout維向量。

7.rng即隨機(jī)數(shù)生成器,numpy。random.RandomState,用于初始化W。

8.input訓(xùn)練模型所用到的所有諭入,并不是MLP的輸入層,MLP的輸入層的神經(jīng)元個數(shù)時n_in,而這里的

參數(shù)input大小是(n_example,n_in),每一行一^個樣本,即每一行作為MLP的輸入層。

9.activation:激活函數(shù),這里定義為函數(shù)tanh

10?“””

11.classHiddenLayer(object):

12.def_init_(sef,rng,input,n_in,n_out,W二None,b二None,

13.activation=T.tanh):

14.self?input=input#類HiddenLayer的input即所傳遞進(jìn)來的input

15.

16.

17.注釋:

18.代碼要.兼容GPU,則必須使用dtype=theano.config.fIoatX,并且定義為theano.

shared

另外,的初始化有個規(guī)則:如果使用函數(shù),則在一

19.WTanhsqrt(6O/(n_in+n_hidden))

到sqrt(60/(n_in+n_hidden))之間均勻

20.抽取數(shù)值來初始化W,若時sigmoid函數(shù),則以上再乘4倍。

21.

22.#如果W未初始化,則根據(jù)上述方法初始化。

23.#加入這個判斷的原因是:有時候我們可以用訓(xùn)練好的參數(shù)來初始化W,見我的上一

篇文章.

24.ifWisNone:

25.W_vaIues=numpy.asarray(

26.rng.uniform(

27.low=—numpy。sqrt(6。/(n_in+n_out)),

28.high=numpy.sqrt(6。/(n_in+n_out)),

29.size=(n_in,n_out)

30.),

31.dtype=theano.config0fIoatX

32.)

33.ifactivation=theano.tensor,nnetosigmoid:

34.WvaIues*=4

35.W=theano.shared(vaIue=W_vaIues,name='W',borrow=True)

36.

37.ifbiSNone:

38.b_vaIuesnumpy0zeros((n_out,),dtype=theano.config.fIoatX)

39.btheanooshared(vaIue=b_vaIues,name='b',borrow=True)

40.

41.#用上面定義的W、b來初始化類HiddenLayer的W、b

42.self.W=W

43.seIf.b=b

44.

45.#隱含層的輸出

46.Iin_output=Todot(input,self.W)+self,b

47.seIfooutput=(

48.Iin_outputifactivationisNone

49.elseactivation(Iin_output)

50.)

51.

52.#隱含層的參數(shù)

53.seIf.params=[selfoW,seIfob]

定義分類器(Softmax回歸)

采用Softmax,這¥艮《DeepLearningtutorial(1)Softmax回歸原理簡介+代

碼詳解》中的LogisticRegression是一^羊的,直接拿過來:

[python]viewplaincopy

1.

2.定義分類層LogisticRegression,也即Softmax回歸

3.在deepIearningtutorial由,直接將LogisticRegression視為Softmax,

4.而我們所認(rèn)識的二類別的邏輯回歸就是當(dāng)n_out=2時的LogisticRegression

5.""“

6.埔參數(shù)說明:

7./input,大小就是(n_example,n_in),其中n_example是一個batch的大小,

8.#因為我們訓(xùn)練時用的是MinibatchSGD,因此input這樣定義

9.#n_in,即上一層(隱含層)6勺輸出

10.?n_out,輸出的類別數(shù)

11.CIassLogisticRegression(object):

12.def_init_(seIf,input,n_in,n_out):

13.

14.州大小是n_in行n_out列,b為n_out維向量.即:每個輸出對應(yīng)W的一列以及b的一個元素.

15.self.W=theano.shared(

16.value=numpy.zeros(

17.(n_in,n_out),

18.dtype=theanooconfig。floatX

19.),

20.name='W',

21.borrow=True

22.)

23.

24.selfob=theanooshared(

25.value=numpy<>zeros(

26.(n_out,),

27.dtype=theano.configof1oatX

28.),

29.name二'b',

30.borrow二True

31.)

32.

33.#input是(n_example,n_in;,W是(n_in,n_out),點(diǎn)乘得到(n_example,n_out),加上偏置b,

34.#再作為T.nnet.softmax的榆入,得到p_y_given_x

(35.#故p_y_given_x每一行代表每一個樣本被估計為各類別的概率

36.#PS:b是n_out維向量,與(n_exampIe,n_out)矩陣相加,內(nèi)部其實(shí)是先復(fù)制n_example個b,

37.才然后(n_exampIe,n_out)矩陣的每一行都加b

38.seIf.p_y_given_x=Tonnet.softmax(T.dot(input,seIf<>W)+seIfob)

39.

40.#argmax返回最大值下標(biāo),因為本例數(shù)據(jù)集是MNIST,下標(biāo)剛好就是類別。axis二1表示按行操作.

41.seIf.y_pred=T.argmax(selfoP_y_given_x,axis=1)

42.

43.^params,LogisticRegression的參數(shù)

144.seIfoparams=[self.W,self.b]

到這里,CNN的基本”構(gòu)件“都有了,下面要用這些“構(gòu)件“組裝成LeNet5(當(dāng)

然,是簡化的,上面已經(jīng)說了),具體來說,就是組裝成:

LeNet5=input+LeNetConvPooILayer_1+LeNetConvPooILayer_2+HiddenLayer+

LogisticRegression+outputo

然后將其應(yīng)用于MNIST數(shù)據(jù)集,用BP算法去解這個模型,得到最優(yōu)的參數(shù).

(3)加載MNIST數(shù)據(jù)集(mnist.pkI.gz)

[python]viewplaincopy

1.

2.加載MNIST數(shù)據(jù)集load_data()

3.

4.defIoad_data(dataset):

\s.#dataset是數(shù)據(jù)集的路徑,程序首先檢測該路徑下有沒有MNIST數(shù)據(jù)集,沒有的話就下載

MNIST數(shù)據(jù)集

6.#這一部分就不解釋了,與softmax回歸算法無關(guān)。

7.data_dir,data_fiIe=osopath.split(dataset)

8.ifdata_dir==""andnotos。path,isfiIe(dataset):

9.#Checkifdatasetisinthedatadirectory.

10.new_path=os.path.join(

11.osopath,spIit(_file_)[0],

”II

12.??,

13."data”,

14.dataset

15.)

16.ifosopathoisfiIe(new_path)ordata_fiIe=='mnist?pk10gz

17.dataset=new_path

18.

19.if(notosopathoisfiIe(dataset))anddata_fiIe=='mnist.pkl.gzJ

20.importur11ib

21.origin=(

22.'http://www<,irooumontreaI<>ca/*Iisa/deep/data/mnist/mnist<>

pkl.gz

23.)

24.print'DownIoadingdatafrom%s'%origin

25.urIIib.urIretrieve(origin,dataset)

26.

27.print'oooloadingdata?

28.#以上是檢測并下載數(shù)據(jù)集mnist.pkI.gz,不是本文重點(diǎn)。下面才是Ioad_data的開始

29.

30.#從“mnist.pkl.gz”里加載trainset,vaIid_set,test_set,它們都是包括laneI的

31.球主要用到python里的gzip。open()函數(shù),以及cPickle.load()o

32.#'rb'表示以二進(jìn)制可讀的方式打開文件

33.f=gzip0open(dataset,'rb')

34.train_set,vaIid_set,test_set=cPickleoload(f)

35.foclose()

36.

37.

38.#將數(shù)據(jù)設(shè)置成sharedvariabIes,主要時為了GPU加速,只有sharedvariabIes才能存到GPUmemory

39.#GPU里數(shù)據(jù)類型只能是fl。at.而data_y是類別,所以最后又轉(zhuǎn)換為int返回

40.defshared_dataset(data_xy,borrow二True):

41.data_x,data_y=data_xy

42.shared_x=theano.shared(numpy.asarray(data_x,

43.

dtype=theano.config.floatX),

44.borrow=borrow)

45.shared_y=theano.shared(numpy.asarray(data_y,

46.

dtype=theanooconfig<>floatX),

47.borrow=borrow)

48.returnshared_x,T.cast(shared/,'int32')

49.

50.

51.test_set_x,test_set_y=shared_dataset(test_set)

52.vaIid_set_x,vaIid_set_y=shared_dataset(vaIid_set)

53.Irain_sel_x,Lrairi_bel_y=shared_dalasel(Lrairi_sel)

54.

55.rvaI=[(train_set_x,train_set_y),(vaIid_set_x,valid_set_y),

56.(test_set_x,test_set_y)]

57.returnrvaI

(4)實(shí)現(xiàn)LeNet5并測試

[python]viewplaincopy

1.””“

2.實(shí)現(xiàn)LeNet5

3.LeNet5有兩個卷積層,第一個卷積層有20個卷積核,第二個卷積層有50個卷積核

4.

5.defevaIuate_Ienet5(Iearning_rate=0o1,n_epochs=200,

6.dataset='mnist.pkl?gz',

7.nkerns=[20,50],batch_size=500):

g"””

9.Iearning_rate:學(xué)習(xí)速率,隨機(jī)梯度前的系數(shù).

10.nepochs訓(xùn)練步數(shù),每一步都會遍歷所有batch,即所有樣本

11.batch_size,這里設(shè)置為500,即每遍歷完500個樣本,才計算梯度并更新參數(shù)

12.nkerns=[20,50],每一個LeNetConvPoolLayer卷積核的個數(shù),第一個LeNetConvPooILayer有

13.20個卷積核,第二個有50個

14.

15.

16.rng=numpy。random.RandomState(23455)

17.

18.并加載數(shù)據(jù)

19.datasets=load_data(dataset)

20.train_set_x,train_set_y=datasets[0]

21.va1id_set_x,va1id_set_y=datasets[1]

22.test_set_x,test_set_y=datasets[2]

23.

24.#計算batch的個數(shù)

25.n_train_batches=train_set_x.get_vaIue(borrow=True)。shape[0]

26.n_vaIid_batches=vaIid_set_x0get_vaIue(borrow=True)(?shape[0]

27.n_test_batches=test_set_x.get_vaIue(borrow二True)。shape[0]

28.n_train_batches/=batchsize

29.n_vaIid_batches/=batch_size

30.n_test.batches/=batchsize

31.

32.#定義幾個變量,index表示下標(biāo),x表示輸入的訓(xùn)練數(shù)據(jù),y對應(yīng)其標(biāo)簽

33.index=ToIscalar()

34.x=Tomatrix('x')

35.y=Toivector('y')

36.

37.######################

38.#BUILDACTUALMODEL#

39.######################

40.print1..obuiIdingthemode1'

42.

43.#我們加載進(jìn)來的batch大小的數(shù)據(jù)是(batch_size,28*28),但是LeNetConvPooILayer的揄入是

四維的,所以要reshape

44.layerOinput=x.reshape((batchsize,1,28,28))

45.

46.#layerO即第一個LeNetConvPooILayer層

47.#輸入的單張圖片(28,28),經(jīng)過conv得到(28-5+1,28-5+1)=(24,24),

48.#經(jīng)過maxpooling得到(24/2,24/2)=(12,12)

(49.#因為每個batch有batch_size張圖,第一個LeNetConvPooILayer層有nkerns[0]個卷積核,

50.#故layer。輸出為(batch_size,nkerns[0],12,12)

#yerO=LeNetConvPooILayer(

52.rng,

53.input=IayerO_input,

54.image_shape=(batch_size,1,28,28),

55.fiIter_shape=(nkerns[0],1,5,5),

56.poolsize=(2,2)

57.)

58.

59.

60.Iayerl即第二個LeNetConvPooILayer層

61.#輸入是layerO的輸出,每張?zhí)卣鲌D為(12,12),經(jīng)過conv得到(12—5+1,12—5+1)=(8,8),

62.#經(jīng)過maxpooling得到(8/2,8/2)=(4,4)

63.#因為每個batch有batch_size張圖(特征圖),第二個LeNetConvPooILayer層有nkerns[1]個卷積核

64.#,故layerl輸出為(batch_size,nkerns[1],4,4)

65.layerl=LeNetConvPooILayer(

66.rng,

67.input=IayerO.output,

68.imageshape=(batchsize,nkerns[0],12,12),江榆入nkerns[0]張?zhí)卣鲌D,即

layer。輸出nkerns[0]張?zhí)卣鲌D

69.fiIter_shape=(nkerns[1],nkerns[0],5,5),

70.poolsize=(2,2)

71.)

72.

73.

74.埔前面定義好了兩個LeNetConvPoolLayer(layer。和layeZ),Iayerl后面接Iayer2,這是一個全連接

層,相當(dāng)于MLP里面的隱含層

75.#故可以用MLP中定義的HiddenLayer來初始化Iayer2,Iayer2的輸入是二維的

(batch_size,num_pixeIs),

76.#故要將上層中同一張圖經(jīng)不同卷積核卷積出來的特征圖合并為一維向量,

77.#也就是將Iayerl的輸出(batch_size,nkerns[1],4,4)flatten為(batch_size,nkerns

[1]*4*4)=(500,800),作為Iayer2的揄入。

78.#(500,800)表示有500個樣本,每一行代表一個樣本。Iayer2的輸出大小是(batch_size,n_out)=

:500,500)

79.Iayer2_input=layerlooutput0flatten(2)

80.Iayer2=HiddenLayer(

81.rng,

82.input=Iayer2_input,

83.n_in=nkerns[1]*4*4,

84.n_out=500,

85.activation=T0tanh

86.)

87.

88.#最后一層Iayer3是分類層,用的是邏輯回歸中定義的LogisticRegression,

89.#layer3的輸入是Iayer2的輸出(500,500),Iayer3的輸出就是(batch_size,n_out)=(500,10)

90.Iayer3=LogisticRegression(input=Iayer2.output,n_in=500,n_out=10)

91.

92.4代價函數(shù)NLL

93.cost=Iayer3<>negative_Iog_IikeIihood(y)

94.

95.#test_modeI計算測試誤差,x、y根據(jù)給定的index具體化,然后調(diào)用Iayer3,

96.#Iayer3又會逐層地調(diào)用Iayer2、layerl>layerO,故test_modeI其實(shí)就是整個CNN結(jié)構(gòu),

97.#test_modeI的輸入是x、y,榆出是Iayer3oerrors(y)的輸出,即誤差。

98.test_modeI=theanoofunction(

99.[index],

100.Iayer3.errors(y),

101.givens={

102.x:test_set_x

[index*batch_size:(index+1)*batch_size],

103.y:test_set_y[index*batch_size:(index+1)*batch_

size]

104.}

105.)

106.#vaIidate_modeI,驗證模型,分析同上。

107.va1idate_mode1=theanoofunction(

108.[index],

109.1ayer3?errors(y),

110.givens={

111.x:va1id_set_x

[index*batch_size:(index+1)*batch_size],

112.y:vaIid_set_y

[index*batch_size:(index+1)*batch_size]

113.}

114.)

115.

116.#下面是trainjnodel,涉及到優(yōu)化算法即SGD,需要計算梯度、更新參數(shù)

117.#參數(shù)集

118.params=1ayer30params+1ayer20params+layerl.params+IsyerO.params

119.

120.#對各個參數(shù)的梯度

121.grads=Tograd(cost,params)

122.

123.#因為參數(shù)太多,在updates規(guī)則里面一個一個具體地寫出來是很麻煩的,所以下面用了一個for。。in。.,

自動生成規(guī)則對(param_i,param_i—Iearning_rate*grad_i)

124.updates=[

125.(param_i,param_i-1earning_rate*grad_i)

126.forparam_i,grad_iinzip(params,grads)

127.]

128.

129.#train一modeI,代碼分析同test一modeI。train_modeI里比test_modeI、vaIidation_modeI多出updates

規(guī)則

130.train_mode1=theanoofunction(

131.[index],

132.cost,

133.updates=updates,

134.givens={

135.x:train_set_x

[index*batch_size:(index+1)*batch_size],

136.y:train_set_y

[index*batchsize:(index+1)*batchsize]

f一

137.

138.)

139.

140.

141.###############

142.#開始訓(xùn)練#

143.###############

144.print'0。,training1

145.patience=100C0

146.patience_increase=2

147.improvement_threshoId=Ou995

148.

149.vaIidation_frequency=min(n_train_batches,patience/2)

150.#這樣設(shè)置validation_frequency可以保證每一次epoch都會在驗證集上測試.

151.

152.best_validation_loss=numpy。inf#最好的驗證集上的Ioss,最好即最小

153.best_iter=0#最好的迭代次數(shù),以batch

為單位。比如best_iter=10000,說明在訓(xùn)練完第10000個batch時,it51]best_validation_loss

154.test_score=0。

。

155.starime=Iimeoclock

156.

157.epoch=0

158.done_looping=FaIse

159.

160.#下面就是訓(xùn)練過程了,whiIe循環(huán)控制的時步數(shù)epoch,一個epoch會遍歷所有的batch,即所有的圖

尺。

161.#for循環(huán)是遍歷一個個batch,一次一個batch地訓(xùn)練。for循環(huán)體里會用

t-ain_model(minibatch_index)去訓(xùn)練模型,

162.#train_modeI里面的updatas會更新各個參數(shù)。

163.#for循環(huán)里面會累加訓(xùn)練過的batch數(shù)iter,當(dāng)iter是validation_frequency倍數(shù)時則會在驗證集上

測試,

164.#如果驗證集的損失this_validation_loss小于之前最佳的損失best_vaIidationloss,

165.#則更新best_validation」oss和best_iter,同時在testset上測試。

166.#如果驗證集的損失this_vaIidation_loss小于best_validationloss*improvementthreshoId時則

更新patienceo

167.#當(dāng)達(dá)到最大步數(shù)n_epoch時,或者patience<iter時,結(jié)束訓(xùn)練

168.whiIe(epoch<n_epochs)and(notdone_Iooping):

169.epoch=epoch+1

170.forminibatch_indexinxrange(n_train_batches):

171.

172.iter=(epoch—1)*n_train_batches+minibatch_index

173.

174.ifiler%100==0:

175.print'training@iter=',iter

176.cost_ij=train_modeI(minibatch_index)

177.#cost_ij沒什么用,后面都沒有用到,只是為了調(diào)用train_model,而train_model有返回值

178.if(iter+1)%vaIidation_frequency==0:

179.

180.#computezero—onelossonvaIidationset

181.va1idation_losses=[validate_model(i)fori

182.inxrange

Cn_vaIid_batches)]

183.this_va1idation_1oss=numpy.mean(va1idation_1osses)

184.print(tepoch%i,minibatch%i/%i,validationerror

%f%%,%

185.(epoch,minibatch_index+1,n_train_batch

es,

186.thit>_vaIidaIiuri_Iuss*100。))

187.

188.

189.ifthisva1idationloss<bestva1idation1oss:

190.

191.

192.ifthis_va1idation_1oss<best_va1idation_1oss

*\

193.improvement_thresho1d:

194.patience=max

[patience,iter*patience_increase)

195.

196.

197.best_va1idation_1oss=this_va1idation_1oss

198.best_iter=iter

199.

200.

201.test

溫馨提示

  • 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

提交評論